前提
Djangoを使っていると、DBに変更を反映するため
python manage.py makemigrations
python manage.py migrate
が必要になります。
そんなとき、python manage.py makemigrations
はできたけど
DBにマイグレーションができない!!!
なんてことがあるのではないかと思います。
そんな時の解決策
状況
Herokuを使っていた時のこと。
まずは、gitを使ってherokuにpushしました。
git push heroku master
ここまでは、成功。
続いて、localではmigration
ができたのでHerokuでも同じように実施しようとしました。
(herokuでは(makemigrtationsを行った際に生成される)migration ファイル
は既にherokuに送られているため)
しかし、はじかれてしまう。
僕の場合は、ターミナル(コマンドプロンプト上で)
ValuEerror: invalid literal for int() with base 10: ''”
もしくは、サイトにアクセスして新規のmodelにアクセスしようするときは、
relation "****" does not exist LINE 1: SELECT COUNT(*) AS "__count" FROM "Atlus_predicts"
が出てきました。
DBはpostgreSQLです。
んで、どうすればいいかわからずdbをリセットしてしまう方もいましたが、今回は諸事情によりそれは絶対にできない。。
対処方法
migrationは、各アプリごとに管理されています。
まずどこまでがすでにmigrate
されているのか明確にしましょう
コマンドとしては、
python manage.py showmigrations
(heroku上のファイル操作であれば、heroku run
は先頭につける必要がある。)
そうすると
[X] 0001_initial
[X] 0002_introduction_privacy
[X] 0003_introduction_privacy
[X] 0004_statement
こんな感じのが表示されると思います。
この時、[X]
がついてる場所はマイグレーションができています。
どこかでエラーが出ているのか、まず明確にしましょう。
んで、例えば
[X] 0001_initial
[X] 0002_introduction_privacy
[] 0003_introduction_privacy
[] 0004_statement
0003_introduction_privacy
が原因だとしましょう。
そうしたら、僕は、まず0001_initial
にマイグレーションをした状態に戻したいと思います。
コマンドとしては、
python manage.py migrate <アプリケーション名> 0001_initial
```
です。そして改めて``python manage.py showmigrations``をします。
そうすると
```
[X] 0001_initial
[] 0002_introduction_privacy
[] 0003_introduction_privacy
[] 0004_statement
```
マイグレーションが戻されることが確認できました。(ロールバックと言うそうです。)
んで、原因は``0003_introduction_privacy``でした。
一度、**それに対応するマイグレーションファイルと.pycファイルを削除しました。**
ここでは、``0002_introduction_privacy``から``0004_statement``まで全部削除しました。
そうして、もう一度
```
python manage.py makemigrations
```
からの
```
python manage.py migrate
```
後は、これをコミットしてheroku上でマイグレーションするだけです。
# おさらい
コマンドベースでおさらいします。
```
python manage.py showmigrations #エラーファイルを明確化
python manage.py migrate <アプリケーション名> <マイグレーションファイル名> #マイグレーションファイルをロールバック
******* 関係するマイグレーションファイルを削除(マイグレーションファイルを適用していないファイル) *******
python manage.py makemigrations #改めてマイグレーションファイルを作成
python manage.py migrate #今度こそマイグレーションさせる
```
# 原因
なぜ、このようなことが起こりこの手の手法でよくなったのかは正直わかりません。
しかし、こまめにmigrateしたりしているうちに依存関係に問題が出たりしたのではないかと考えています。
一度、問題が出る直前まで戻りこまめに変更していたマイグレーションファイルを一気通貫で行うことで修正できたのかな?
ex.
変更①->変更②->変更③
から
変更①->変更③
(実質的に②はいらないし、エラーの原因だから?)
的なイメージ??