参考

履歴表示

マイグレーション履歴表示のコマンドは以下になります。

python manage.py showmigrations

$ python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
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
 [X] 0009_alter_user_last_name_max_length
 [X] 0010_alter_group_name_max_length
 [X] 0011_update_proxy_permissions
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial
words
 [X] 0001_initial

マイグレーションファイル作成

マイグレーションファイルを作成するコマンドは以下になります。 対象アプリケーションのmodels.pyで、作成するテーブルの定義を追加したり、修正した後に、実行します。

python manage.py makemigrations [アプリケーション名]

例 プロジェクトstockにテーブルpricesを追加するマイグレーションファイル作成を実行した場合

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, stock
Running migrations:
  Applying stock.0002_prices... OK

例 マイグレーションファイル

# Generated by Django 3.1 on 2020-09-06 09:43

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('stock', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='Prices',
            fields=[
                ('id', models.IntegerField(primary_key=True, serialize=False)),
                ('brand_id', models.IntegerField(db_index=True)),
                ('trading_date', models.DateField(db_index=True)),
                ('opening', models.IntegerField()),
                ('closing', models.IntegerField()),
                ('high', models.IntegerField()),
                ('low', models.IntegerField()),
            ],
        ),
    ]

マイグレーション実行

マイグレーションをDBに反映させるコマンドは以下になります。 プロジェクト以外のアプリケーションでは、アプリケーション名の指定が必要ですが、プロジェクトのマイグレーションの場合、アプリケーション名は省略できます。

python manage.py migrate [アプリケーション名]

$ python manage.py migrate words
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
        HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode
Operations to perform:
  Apply all migrations: words
Running migrations:
  Applying words.0001_initial... OK
  Applying words.0002_auto_20190507_2225... OK

ロールバック

ロールバックのコマンドは以下になります。

python manage.py migrate [アプリケーション名] [マイグレーション名]
指定したマイグレーション名が、最後の適用済みマイグレーションになるようにロールバックされます。

アプリケーションの全マイグレーションをロールバックする場合、マイグレーション名を"zero"にします。

python manage.py migrate [アプリケーション名] zero

例 wordsアプリケーションのマイグレーションを全て適用外にする

$ python manage.py migrate words zero
System check identified some issues:

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
        HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode
Operations to perform:
  Unapply all migrations: words
Running migrations:
  Rendering model states... DONE
  Unapplying words.0001_initial... OK

履歴を確認すると以下のようになっています。

$ python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 ...
 ...
sessions
 [X] 0001_initial
words
 [ ] 0001_initial