LoginSignup
1
1

More than 1 year has passed since last update.

djangoでmigrateをしたらtableがないと言われた件

Posted at

目的

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

で無事、エラーが出なくなっていることが確認できる。

参考

Djangoでmigrateしたのにテーブルが作成されない

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1