背景
Djangoで開発する時、よく遭うな問題がいつくかあります。
例えば、
- modelを変更したけど、migrateできない
- 新しいjs, css, imgファイルを追加した時に、急に collectstaticが効かなくなる
など。
Djangoに対する理解が浅いせいか、私は頻繁に遭っています。
今回はそのうちのmigrateできない時の対処法をまとめます。
migrationの流れ
具体的な対処法をみて行く前にまずmigrationの流れからみていきます。
models.pyにモデルを定義した後に、それをmigrateして、データテーブルを作るまで 以下の 3 コマンド (或いは2コマンド)を順次的に実行することで実現します。
まず、
python manage.py makemigrations
このコマンドを実行すると、以下のようなものが作成されます。
djangoproject--
|
|----my_app
|
|----migrations
|
|----__init__.py
|----0001_initial.py
|----0002_xxxxx.py
タイトルが0001xxxファイルは初回目にmigrateした時のmodelの定義などが記録され、modelを削除、編集など作業をし、migrateするたびに、次の番号(0002xxx, 0003xxx)のマイグレーションファイルが作成されます。
次に、
python manage.py sqlmigrate
このコマンドを実行するとマイグレーションのためのSQLが作成されます。
実はこの部分はスキップすることができます。私の場合、いつもmakemigrationsとmigrate二つのコマンドでmigrationを実行しています
最後に、
python manage.py migrate
このコマンドを実行すると、マイグレーションが実行され、データベース上にテーブルが作成されます。
対処法
1. fake オプションの活用
よく使う方法として、以下の様にfakeオプションをつけてmigrateする方法があります。
fake オプションは、実際にはマイグレーションされていないが、されたようにシステムに見せつけ、次の操作をエラーなしに実行させる手法です。
あくまで個人の解釈です。ドキュメントには以下のように書かれています。
The --fake option tells Django to mark the migrations as having been applied or unapplied, but without actually running the SQL to change your database schema.
従って、migrateできない時は、一度 fakeオプションをつけて今の状態をスキップさせ、次にもう一度マイグレーションを試みることが考えられます。
python manage.py makemigrations --fake
python manage.py makemigrations
python manage.py migrate
2. 元のモデルを削除し、変わったモデル名で同じ構造のモデルを作成
この方法は、makemigrationsが効かない時に試せます。
もちろんその前に、pycacheの中にあるキャッシュファイルを削除して試すのも考えられます。
3. マイグレーションファイルを使って、今の操作の一歩前のマイグレーション状態に戻る
migrationの流れの説明で書いたように、毎回マイグレーションをすると、makemigrationsコマンドより作成されたマイグレーションファイルがmigrationsというフォルダーに残ります。
従って、うまくいかない時は、一歩前のマイグレーション状態に戻ることが可能です。
実行コマンド
python manage.py migrate my_app 0003_xxxxx(migration file name)
まとめ
これまで、
1. No migrations to apply
2. No Changes Detected
など、migrationができない時の対処法を三つまとめてみました。