前回に引き続きDjangoフレームワークのmigrations機能について勉強してみたいと思います。
前回のあらすじ
- Djangeフレームワークを使い、プロジェクトを作成、テスト用アプリを作成、データベースの設定を完了します
- アプリ用のモデルファイルを初期化作成し、データベースに反映させます
- モデルに新しいフィールドを追加します、データベースに反映させます
- 上のステップを変更を取り消すために、データベースを初期化した状態に復旧させます
開発環境 |
---|
Mac OS:Sierra |
python2.7.10 |
django1.11.2 |
mysql5.7.18 |
今回の概要
前回ではmigrationsの基本なworkflowを紹介しました、今回ではmigrationsに関連する基本なコマンド及び実際利用中よく出会うトラブルの解決方法を勉強します。
migrations関連するコマンド
オフィシャルドキュメントではmigrationsに関連する4つのコマンドが紹介されています。デモアプリを活用してコマンドの使って見ましょう。
showmigrations
コマンドラインで下記コマンドを入力:
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
polls
[X] 0001_initial
[ ] 0002_article_image_url
sessions
[X] 0001_initial
現在プロジェクトの各アプリのmigrationsの状態がチェックリストで表示されます。
admin、auth、contenttypes、sessionsなどデフォルトアプリのmigrationsは全部反映されました。
デモアプリであるpollsでは初期化で反映されたmigrationsファイル0001_initial.pyにチェックを入れてあり、
復旧で取り消されたmigrationsファイル0002_article_image_url.pyではチェックが外されました。
コマンドにオプションをつけてアプリを指定することもできます。
python manage.py showmigrations polls
これで出力を特定なアプリに絞れます。
polls
[X] 0001_initial
[ ] 0002_article_image_url
makemigrations
モデルの変更に沿ってmigrationsファイルを作成します、具体例は前回を参照しましょう。
migrate
作成したmigrationsファイルを使って、モデルをデータベースに反映させます。取り消した変更を再度追加しましょう。
python manage.py migrate polls
出力
Operations to perform:
Apply all migrations: polls
Running migrations:
Applying polls.0002_article_image_url... OK
デモアプリのmigrationsの状態をチェックしましょう:
python manage.py showmigrations polls
出力:
polls
[X] 0001_initial
[X] 0002_article_image_url
migrationsファイル0002_article_image_url.pyが反映されたのがわかります。
sqlmigrate
migrationsファイルの内容を実際に実行するsqlステートメントを表示します。
使用する場合対象アプリの名前とmigrationsファイル名をオプションに入れる必要があります。
migrationsファイル0002_article_image_urlを指定して実行しましょう。
python manage.py sqlmigrate polls 0002_article_image_url
出力
BEGIN;
--
-- Add field image_url to article
--
ALTER TABLE `polls_article` ADD COLUMN `image_url` varchar(200) DEFAULT toBeImplement NOT NULL;
ALTER TABLE `polls_article` ALTER COLUMN `image_url` DROP DEFAULT;
COMMIT;
一気に挙動不審なmigrationsの働きがクリアになりました。
さらに、--backwardsオプションをつけると、migrationsを取り消すためにsqlステートメントも見れます。
python manage.py sqlmigrate --backwards polls 0002_article_image_url
出力
BEGIN;
--
-- Add field image_url to article
--
ALTER TABLE `polls_article` DROP COLUMN `image_url`;
COMMIT;
コメントで記述されているのはmigrationsファイルの説明ですが、sqlステートメントではちゃんと変更を取り消しています(image_urlのコラムを消します)。