django002#DBをいじってみよう



#前回まで
前回の記事でhelloworldのアプリケーションを無事に作りました。今回はアプリケーションのデータベースをいじってみましょう。

#流れ
1.　helloworldにあるmodels.pyでデータベースのTable追加
2.　project01にあるsettings.pyでデータベースを追加
3.　プロジェクトをマイグレーション作る
4.　プロジェクトをマイグレーションする
5.　Shellでデータベースにデータを追加してみる

って感じかな？

Folderの中にdb.splite3が見えますか？今回の主役はこの子です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/0bfafae0-a1df-8860-683f-9a9733028d97.png)

##helloworldにあるmodels.pyでデータベースのTable追加

ではまずTableを追加してみましょう。
まずhelloworldのFolderにあるmodels.pyを開きます。

```
from django.db import models

# Create your models here.
class mydb(models.Model):
	title=models.CharField(max_length=200)
	post=models.TextField()
	published=models.DateTimeField('date created')

	#just make it more easy to read
	#ugly but work
	def __str__(self):
		return self.title
```

ここは様々なFieldを説明するドキュメントがあります↓
https://docs.djangoproject.com/en/2.1/ref/models/fields/

簡単に説明すると、文字200までFieldが1つ、テキストFieldが1つ、時間Fieldが1つを追加しました。

##project01にあるsettings.pyでデータベースを追加

次はdjangoさん、データベースの中に先追加したTableも参照くださいーを言わないといけないので。
project1の中にあるsettings.pyを開きます。

次は”INSTALLED_APPS”を検索し、
そしてhelloworld.apps.MainConfigを一番したに追加します。

```

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloworld.apps.HelloworldConfig', #new
]

```
うん？でもなんでHelloworldConfigなの？
ここでhelloworld/apps/みたら、なるほど！HelloworldConfigってあのClassのことですね！

```
from django.apps import AppConfig


class HelloworldConfig(AppConfig):
    name = 'helloworld'
```

##プロジェクトをマイグレーション作る

以下のコマンドしたらマイグレーション作ることができます↓

```python mange.py makemigrations```

ワクワク…できました！
それでマイグレーション作りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/d7dfe481-ee25-62e7-359c-e9699dec1824.png)
次はhelloworld/migrationsの中に見てると…
あれ？0001_initial.pyがありますね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/e1f7c76c-9c37-6054-24d9-020362b88ce7.png)
どんなもの入ってるかな？
うんうん、なるほど、この時間でマイグレーション作りました、
中身はhelloworld.models.mydbと同じですね。

```
# Generated by Django 2.1.7 on 2019-03-03 02:36

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='mydb',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=200)),
                ('post', models.TextField()),
                ('published', models.DateTimeField(verbose_name='date created')),
            ],
        ),
    ]
```

うん～もし別のコマンドただいてみたらどうになるか？
これはsqlmiagrate コマンドです。

```
python3 manage.py sqlmigrate helloworld 0001
```
ふーん、SQLのコマンドが帰ってくれましたね～私があまりSQL詳しくないのでここでとりあえずほっといておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/d7982ca2-485a-54cd-77cb-d779f92eb750.png)

##プロジェクトをマイグレーションする

まずもう一度マイグレーションを作ります。

```
python mange.py makemigrations
```

なにも変更しなかったので、以下の結果がきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/728f9076-87c0-5b64-30b6-6014f50fe931.png)

いよいよ、マイグレーションを行います！
```
python mange.py migrate
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/57a1d400-efed-d07d-abc7-d3f925d0e5c2.png)

おめでとう！これで終わります。

##Shellでデータベースにデータを追加してみる
いきなりプログラムを組むのはちょっと難しいので(私の場合)なので、まずSHELLでやってみます。
djangoのShellを起動したいなら以下のコマンドを入れます。
```
python mange.py shell
```
ipythonが起動されましたね～
Line1：ModelsをImportします。
Line2：Table内になにかあるかを調べます。いまは空です。
Line3：timezone()FunctionをImportします。
Line4：データを追加します。
Line5：保存します。
Line6：Table内になにかあるかを調べます。いまは一回追加されましたね！
Line7：Loopingします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/154661/fbe0c03b-d695-1c35-2900-ca2db0b72a46.png)

<pre><font color="#008700">In [</font><font color="#8AE234"><b>1</b></font><font color="#008700">]: </font><font color="#008700"><b>from</b></font> <font color="#0087D7"><b>helloworld.models</b></font> <font color="#008700"><b>import</b></font> mydb                                                                 

<font color="#008700">In [</font><font color="#8AE234"><b>2</b></font><font color="#008700">]: </font>mydb.objects.all()                                                                                 
<font color="#870000">Out[</font><font color="#EF2929"><b>2</b></font><font color="#870000">]: </font>&lt;QuerySet []&gt;

<font color="#008700">In [</font><font color="#8AE234"><b>3</b></font><font color="#008700">]: </font><font color="#008700"><b>from</b></font> <font color="#0087D7"><b>django.utils</b></font> <font color="#008700"><b>import</b></font> timezone                                                                  

<font color="#008700">In [</font><font color="#8AE234"><b>4</b></font><font color="#008700">]: </font>new1=mydb(title=<font color="#AF5F00">&quot;this is title&quot;</font>,post=<font color="#AF5F00">&quot;this is post&quot;</font>,published=timezone.now())                      

<font color="#008700">In [</font><font color="#8AE234"><b>5</b></font><font color="#008700">]: </font>new1.save()                                                                                        

<font color="#008700">In [</font><font color="#8AE234"><b>6</b></font><font color="#008700">]: </font>mydb.objects.all()                                                                                 
<font color="#870000">Out[</font><font color="#EF2929"><b>6</b></font><font color="#870000">]: </font>&lt;QuerySet [&lt;mydb: this is title&gt;]&gt;

<font color="#008700">In [</font><font color="#8AE234"><b>7</b></font><font color="#008700">]: </font><font color="#008700"><b>for</b></font> x <font color="#AF00FF"><b>in</b></font> mydb.objects.all(): 
<font color="#008700">   ...: </font>    <font color="#008700">print</font>(<font color="#AF5F00">&apos;title is </font><font color="#AF5F87"><b>{}</b></font><font color="#AF5F00">.&apos;</font>.format(x.title)) 
<font color="#008700">   ...: </font>    <font color="#008700">print</font>(<font color="#AF5F00">&apos;post is </font><font color="#AF5F87"><b>{}</b></font><font color="#AF5F00">.&apos;</font>.format(x.post)) 
<font color="#008700">   ...: </font>    <font color="#008700">print</font>(<font color="#AF5F00">&apos;published on </font><font color="#AF5F87"><b>{}</b></font><font color="#AF5F00">.&apos;</font>.format(x.published)) 
<font color="#008700">   ...: </font>                                                                                                   
title is this is title.
post is this is post.
published on 2019-03-03 02:57:35.153297+00:00.
</pre>

はいーお疲れ様です。