備忘録:ローカル環境ではpython manage.py migrate がきちんと反映されるのに、heroku run python manage.py migrateでは反映されなかった件
現象:
タイトルの通り、heroku上で
$ heroku run python manage.py migrate
すると、
Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK . . . .
と言った感じで、一見きちんと動いているようでいて、showmigrations コマンドで確認してみると
[ ] 0001_initial [ ] 0002_alter_permission_name_max_length [ ] 0003_alter_user_email_max_length . . . .
↑こんな表示であり、明らかにmigrationされていない。
試したこと:
ローカル上で全てのmigrationファイルを削除してmakemigrationsし直した。すると、きちんとmigrationファイルは作られるし、migrate した後にshowmigrations すると、
[X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length . . . .
うん、きちんと反映されている。
つまり、herokuではうまくいかず、herokuでない状態だとうまく行く。
したがって、「herokuであるか否か」に起因する「何か」によってこの不具合は引き起こされていると考えられる。
では、その「何か」とはなにか?
settings.pyが怪しい。
だって↓こんな設定してるんだから
if not DEBUG: import django_heroku django_heroku.settings(locals())
DEBUG=Falseの場合のみdjango_herokuをimportしている。
なんだ。
そりゃそうだ。
もともと、本番環境ではDEBUG=Falseにしないとだめだよ〜ってのは知っていたし、実際最初はそうしていたのだが。
Falseの状態でheroku open しても Server Error(500)がドンっと表示されるだけの真っ白なブラウザに嫌気がさして、エラーの原因を詳しく教えてくれるDEBUG=False状態に戻していたのだった。
というわけで
解決策:
自分の場合、settings.pyのDEBUGの値をTrueにしていたことが原因だったのでDEBUG=Falseに設定し直してgit add ,commit ,push heroku master をした。
その後 heroku run python manage.py migrate したところ、showmigrations で確認してもきちんとXマークが表示されるようになりましたとさ。
めでたしめでたし。