目的
djangoでmigrateを行い、models.pyの変更を反映させようとしていたが、django.db.utils.OperationalError: table "テーブル名" already exists
と言われてエラーが出てしまったため、何とかしたい。
結論
マイグレーションを最初の状態に戻し、マイグレーションファイルも削除し、もう一度マイグレーションをし直すことで解決した。
実施環境
ハードウェア環境
項目 | 情報 |
---|---|
OS | macOS Catalina(10.15.7) |
ハードウェア | MacBook Air (11-inch, Early 2015) |
プロセッサ | 1.6 GHz デュアルコアIntel Core i5 |
メモリ | 4 GB 1600 MHz DDR3 |
グラフィックス | intel HD Graphics 6000 1536 MB |
ソフトウェア環境
項目 | 情報 |
---|---|
homebrew | 3.3.8 |
mysql | Ver 8.0.27 for macos10.15 on x86_64 |
python | 3.8.12 |
django | 3.1.2 |
anaconda | 4.10.1 |
pip | 21.2.4 |
経緯
詳細は覚えていないが、Djangoプロジェクトのmodels.py周りを触っていると、
django.db.utils.OperationalError: table テーブル名 already exists
と表示された。
テーブルが被ってしまうのか、なら消してみよう。
と無心でmysqlログインしてテーブルを削除してみた。
drop table テーブル名;
そしてもう一度migrateしてみると
django.db.utils.ProgrammingError: (1146, "Table 'DB名.table名' doesn't exist")
と表示されてしまった。。
原因究明
どうやらエラーを見てみるとテーブルが存在していないと言われているようだ。
確かに手動で削除したからテーブルはないが、models.pyでそのテーブルも書いているから勝手に作ってくれるのではないのか。。。。???
マイグレーションは前回との差を反映するためのもので、今回もモデルを一部変更しようとしたが、変更する前のものがないため、エラーとなっているようだ。
解決
マイグレーションを最初の状態に戻し、マイグレーションファイルも削除し、もう一度マイグレーションをし直すことで解決した。
python manage.py migrate --fake アプリ名 zero
で全てのマイグレーションを無効にすることができる。
showmigrationでmigrationが反映されていないか確認する。
$ python manage.py migrate --fake アプリ名 zero
$ python manage.py showmigrations
アプリ名
[ ] 0001_initial
[ ] 0002_auto_20211219_1625
[ ] 0003_auto_20211223_1038
[ ] 0004_auto_20211225_1224
[X]ではないため、マイグレーションが反映されていないことがわかる。
次に/migration/配下のmigrationファイルを削除する。
これでリセットが完了。
もう一度いつも通り
$ python manage.py makemigrations
$ python manage.py migrate
で無事、エラーが出なくなっていることが確認できる。