MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

Djangoのモデルに新規フィールド追加時のdjango.db.utils.OperationalError: no such column:・・・の解決方法

症状

今回はこれです。いっぺん死にかけました^^;(地獄少女 分かる人は分かるね) Djangoのモデル(ForeignKeyが複数ある割と込み入ったモデル)に新規フィールド追加時に、マイグレーションファイル作るかといつものように

$python manage.py makemigrations
[数十秒後]
・・・<エラーログ>・・・
・・・<エラーログ>・・・
・・・<エラーログ>・・・
・・・<エラーログ>・・・
・
・
・
django.db.utils.OperationalError: no such column:<app名>_<新規追加したフィールド名>

と、なぜか新規フィールドを追加するマイグレーションファイルを作ってくれない。ちなみに同じapp内の他の込み入ってないモデルにフィールドを追加すると普通にマイグレーションファイル追加できる。これはおかしい・・・

"django.db.utils.OperationalError: no such column"でひたすらStackOverflowを漁るが、どうも解決がうまくできてない、アドバイスは、大体

$python manage.py makemigrations
$python manage.py migrate
の順だよ、忘れてないかい??

[質問者]それは当然やったお^^; 治らぬ・・・ぐぬぬ

という記事ばかり。

解決方法

もう作り直そうかなと思ったそのとき、一行なんかヒントが書いてあった

This error can happen if you instantiate a class that relies on that table, for example in views.py. 

「例えばviews.pyとかでインスタンスつくるのに呼び出してるモデルをいじってるときにこのエラー起こるよ」(意訳) (引用元) stackoverflow.com

あ!これかも・・・views.pyの関数がなぜかマイグレーションの邪魔をすることは以前も経験した・・・試しにurls.pyで登録してるviews関数でモデルに影響(関数内で当該モデルを呼び出している)感じのアプリはすべてコメントアウト、念のためsettings.pyのINSTALLED_APPの同じような影響ありそうなアプリもコメントアウトして、
あらためて

$python manage.py makemigrations
成功!!

マイグレーションもできるか・・・

$python manage.py migrate
成功!!

注意点は、マイグレーションした後に、コメントアウトをもとに戻すこと(だと思われる)。つまり、デプロイする時も、一度マイグレーション成功のコメントアウト状態で継続的デプロイさせて、すぐさまコメントアウトを外してもう一度デプロイすればいいのである(多分。自分はそれで行けた)

後日メモ

settingsのINSTALLAPPSはコメントアウトなしでも影響なし。urls.pyで全アプリ(マイグレーション対象も含める)のviewを止める(つまりmodels.pyだけ運用、views.pyとは一切繋げないモードにするという論理)と上手く行ったぽい。