django migration
makemigrations でpostgresql上にテーブルが作られるのか、またはmigrateでテーブルが作られるのか?
該当するドキュメント
疑問に思うテーマについてdjangoドキュメントがある。こちらを見てみる。
https://docs.djangoproject.com/ja/2.2/topics/migrations/#workflow
python manage.py migrate
migrateコマンドをたたいた時に初めてデータベースのテーブルのカラム構成に変更が加えられるようだ。
この変更は各アプリのmigrationsディレクトリに存在するマイグレーションファイルをもとに行われる。言い換えればマイグレーションファイルはテーブルの設計書の位置づけだ。
python manage.py makemigrations
このコマンドによってマイグレーションファイルが作成される。
マイグレーションファイルが作成されるときは、models.pyのモデルと最新のマイグレーションファイルが不一致の時でモデルに即したマイグレーションファイルが作成される。
migrationsファイルについて理解を深める
特に調べる必要もなかったのでスルーしてきたが、調べる機会があったのでメモしておく。
ドキュメント:https://docs.djangoproject.com/ja/2.2/ref/migration-operations/#module-django.db.migrations.operations
マイグレーション操作は大別して3つの種類ある。
- スキーマ操作
- 特別な操作
- 自分で操作を書く
マイグレーション操作はどう使う?
結論はoperationsリスト内の一つの要素としてマイグレーション操作を記述する
スキーマ操作の一つCreateModelを見れば理解が深まる。
https://docs.djangoproject.com/ja/2.2/ref/migration-operations/#createmodel
新たにContactモデルを作成後 python manage.py makemigrationsコマンドを実行する。するとcontacts/migrations以下に0001_initial.pyが作成される。中身は以下になる。
from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Contact', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('client_name', models.CharField(max_length=40)), ('subtitle', models.CharField(max_length=100)), ('message', models.TextField()), ('telephone_number', models.CharField(max_length=30)), ('email_address', models.EmailField(max_length=254)), ('datetime', models.DateTimeField(auto_now=True)), ], ), ]
このファイルに基づいて実際のテーブルが作成される。0001_initial.pyにはoperations内にCreateModelが書かれていることから、要するに実際にデータベースやテーブルに加える操作はoperationsに書くことだと推定することは容易だろう。 つまりデータベースのテーブルを変更をしたいなら、operationsのリストに、変更内容(migrations内の各クラスオブジェクト)を記述する。