脱職エントリー

いつか退職エントリーを書いて一人前のエンジニアを名乗りたい

Django入門その後に(6)〜migrateって何〜

今度こそ遂にようやくデータベースに反映しますがその過程について少し細かく書いていこうと思います。

マイグレートに関する3つのコマンド

マイグレートってなんぞ
f:id:darakunomiti:20170506011702j:plain

マイグレーションにはざっくり3つのコマンドがあります。

  • showmigration: 今のデータベースへの反映状態を表示する
  • makemigraiton: models.pyの内容を読んでマイグレーションファイルを作る
  • migrate: マイグレーションファイルの内容をデータベースに反映する

それぞれについて細かく見ていきましょう

①showmigrationで反映状態を確認しよう

$ python manage.py showmigrations とコマンドを打ってみましょう

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 (no migrations)
sessions
 [X] 0001_initial

多分こんな感じにでてくると思います。
最初にDjangoが標準で作るdjango_migrationsを表示しています。

②makemigration

反映状態を確認したらマイグレーションファイルを作ってみましょう。

Migrations for 'info':
  info/migrations/0001_initial.py
    - Create model Seiyuu

なんかでましたね

ここでもう一度先ほどのコマンドを叩いてみましょう $ python manage.py showmigrations

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 [ ] 0001_initial ★なんかできてる!
sessions
 [X] 0001_initial

次にフォルダを覗いてみましょう seiyuu_info/info/ f:id:darakunomiti:20170505234128j:plain

0001_initial.pyというのができていますが、これがマイグレーションファイルの実体になります。infoapiには未反映の0001_initialというマイグレートファイルがあるよということですね。
ちなみに反映済みになると先頭の[]が[X]になります

3.migrate

実際に反映するにはmigrateというコマンドを打ちます。

$ python manage.py migrate

  Apply all migrations: admin, auth, contenttypes, info, sessions
Running migrations:
  Applying info.0001_initial... OK

これでデータベースにデータが反映されました。

せっかくなので実際にデータベースを開いて確認してみよう

$ sqlite3 db.sqlite3
sqlite> .schema info_seiyuu
CREATE TABLE "info_seiyuu" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL, "gender" integer NULL, "birth_day" date NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

info_seiyuuというTBLが作られています。

  • 名前はSeiyuuではなく [アプリケーション名]_[Djangoに書いたTBL名]で作られますが実際にDjangoで操作するときに意識することはありません。普通にSeiyuuで扱います。
  • IDなんて宣言した覚えがない!→これは定義するときにPKを指定しないとDjango側でIDという名前でPKを自動で作ります。これは大事です。

れで、遂に、やっと、Djangoとデータベースが繋がりました。
ドカベンが柔道から野球を始めるまでに6巻、まどかが魔法少女になるまでに12話掛かりましたが、このチュートリアルは記事6本使って、まだMTVのMしか終わっていませんが一つ一つを丁寧に理解しながら進むことで、色々応用が利くので、ゆっくりと進みましょう。

次回はこれらを登録・更新・削除するadminサイトについて見ていこうと思います。

Django入門その後に(7)〜Adminサイトを見てみよう〜 - 脱職エントリー