いや、こないだまで普通にできててんけどなんで?
modelにフィールドを追加して開発環境でマイグレート→push→本番環境ログインしてpull→本番環境でマイグレート。
これで出来るんちゃうん?と何度も試すが、no changeやらなんやらで全然いうこと聞いてきれなくなった。にっちもさっちもいかなくなり一旦データベースのバックアップをとって、python manage.py migrate your_app zero
で一旦リセットして再度マイグレート。それでもエラーは直らないし、no such columと<めっちゃ前に作ったテーブル名> already existsの一点張り。
拉致が開かないので一旦原理を勉強してみる。
makemigrationとかmigrateとか、必要なコマンドとして実行してたけどこれってそれぞれなんなんだろう。
なるほど、追加や変更をマイグレーションファイルとしてコードベースで書いてから、マイグレートで適応させることによって、本番環境でとか、他の人がそのファイルを使ってマイグレートしても同じ環境を作れるようにするためって事か。だからローカルでmakemigrationsをするたびにファイルが作成させていたのね。
さあここからが問題
makemigrationsとmigrateの違いはわかったものの依然エラーは直らない。
python manage.py showmigrations
実行で
[ ] 0001_initial
[ ] 0002_remove_*******
[ ] 0003_*********and_more
と一つもマイグレーションが適用されていない。
この状態でmigrateすると先ほどと同様<めっちゃ前に作ったテーブル名> already exists
のエラー。もはやどうしようもないのでSQLコマンドから手動で追加できないかと言うアプローチに変更。
INSERT INTO django_migrations (app, name, applied) VALUES ('my_app', '0001_initial', datetime('now'));
その後python manage.py showmigrations
を確認すると
[X] 0001_initial
[ ] 0002_remove_*******
[ ] 0003_*********and_more
え!いけてる!
しかし.schema 'my_app'_'table_name'
を見てみるここには追加フィールドが存在しない。ここも手動で
ALTER TABLE 'my_app'_'table_name' ADD COLUMN '<追加のフィールド名>' varchar(100) NULL;
を実行しマイグレートを行うとゴリ押しで新しいフィールドが追加できた!
しかも``python manage.py showmigrations```確認で
[X] 0001_initial
[X] 0002_remove_*******
[X] 0003_*********and_more
と適応されている!
難しい...
正直なところなぜ通常通りマイグレーションができなかったのか分からない😭
しかし最終手段としてSQLコマンドから手動で操作するという方法を一つ引き出しには増やすことができた。今すぐには分からないけど徐々に「あの時のあのエラーの原因はこれかも?」とわかる日が来ることを願う🙏