LoginSignup
1
1

More than 5 years have passed since last update.

Djangoフレームワークにおけるmigrations機能の学習ノート(2)

Last updated at Posted at 2017-10-24

前回に引き続き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のコラムを消します)。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1