otkken2のプログラミング備忘録

学習の備忘録。自分向け

備忘録:ローカル環境では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マークが表示されるようになりましたとさ。

めでたしめでたし。