makemigrationsを実行しても、migrationファイルが作成されるだけで、データベース自体にはなにも変化が発生しないことは、前回のBlogに書きました。

実際に変更をデータベースのスキーマに反映するには

$ python manage migrate

を実行します。このコマンドを実行すると次の2つの動作が行われます。

  1. migrationに対応したsqlが、データベースに対して実行される。1
  2. migrationを実行したという旨の記録がdjango_migrationsというテーブルに記録される。

実行履歴がテーブルに記録されていますので、何度python manage migrateを実行しても、 一つのmigrationがデータベースに適用されるのは一回限りで、何回も実行されることはありません。

テーブルdjango_migrationsの内容はこのようになっており、アプリケーション名、migration名、適用日時などが記録されています。

テーブルサンプル

実際にmigrationを作り、migrateの実行前後でこのテーブルの中にどのようにレコードが書き込まれるか、 観察してみると動作の理解が深まるでしょう。

また未適用のmigrationがある状態でpython manage.py runserverを実行すると

$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

といったように「まだ未適用のmigrationがあるので正しく動作しない可能性があります」といった警告が表示されます。

Webアプリケーション開発、運用中のデータベース改版履歴管理には、みなさん苦労されていることと思います。 djangoフレームワークの中で、migrationの機能は大変強力ですので、是非チェックすることをお勧めします。


  1. 実行されるsqlを確認したい時はpython manage.py sqlmigrateを使うことができます。 

野中 哲

野中 哲

エンジニア、開発担当

2016年3月に入社。NECで衛星通信の制御用ソフト開発、アップルでMacOSのローカリゼーション、AppleShareファイルサーバの開発等に従事。プライベートではRuby,Haskellなどのプログラミングとラグビー観戦を好む。最近の興味はSwiftでiOSアプリを開発すること。FAA自家用パイロットライセンス所有。