Django のモデル更新手順

はじめに

 Django はフルスタックのWebアプリケーションフレームワークです。アプリケーションデータの永続化はデータベースサーバーなどを使います。フレームワークではこれをモデルで実装します。開発を進めていくと、途中でモデルの修正が必要になる事があります。Django では直接 SQL 文を使うことなく、テーブル定義を更新することができます。
 今回、Django 1.10 での手順を紹介します。

初版のマイグレーションファイル作成と適用

 モデルを実装してから初めてデータベースサーバーにテーブルを作成する場合、まずマイグレーションファイルを作成します。settings.py に記述したアプリケーションを Django が精査して、自動的にマイグレーションファイルを作成してくれます。

(venv35)$ python manage.py makemigrations

 作成されたマイグレーションファイルは Python プログラムです。これを SQL 文として確認するには、下記のコマンドを実行します。「main」はアプリケーション名、「0001_initial」はディレクトリ main/migrations に作成された、「0001_initial.py」のモジュール名です。

(venv35)$ python manage.py sqlmigrate main 0001_initial

 問題なければ、データベースサーバーに適用します。

(venv35)$ python manage.py migrate

2回目以降のマイグレーションファイル作成と適用

 データベースサーバーに既存のテーブルがあるとき、モデルに修正があれば、データベースサーバーに修正を適用するために追加のマイグレーションファイルを作成する必要があります。新規に作成したときと同じコマンドを実行すれば、Django が自動的に続きのマイグレーションファイルとして作成してくれます。

(venv35)$ python manage.py makemigrations

 データベースサーバーに実際に適用されたマイグレーションの一覧は下記コマンドで確認できます。この段階ではまだ「0002」のマイグレーションファイルを適用していないため、「X」がついていない事を確認できます。

(venv35)$ python manage.py showmigrations
admin
 [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
main
 [X] 0001_initial
 [ ] 0002_auto_20160909_0701
sessions
 [X] 0001_initial

 念のため、どのような修正内容が適用されるのか、ここで確認しておきます。

(venv35)$ python manage.py sqlmigrate main 0002_auto_20160909_0701

 問題なければ、データベースサーバーに適用します。

(venv35)$ python manage.py migrate

おわりに

 Django にはモデルの修正をデータベースサーバーに適用するための強力なツールが提供されている事がわかると思います。SQL 文を直接記述する必要がなくなるのはありがたいことですね。もちろん、Django で対応できないシチュエーションもあります。その場合は人力+マイグレーションファイルの削除、といった操作が必要になることがあります。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください