diadia

興味があることをやってみる。自分のメモを残しておきます。

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のモデルと最新のマイグレーションファイルが不一致の時でモデルに即したマイグレーションファイルが作成される。

メモ:https://stackoverflow.com/questions/28035119/should-i-be-adding-the-django-migration-files-in-the-gitignore-file

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内の各クラスオブジェクト)を記述する。