【Django】エラー文「django.db.utils.OperationalError: (1060, “Duplicate column name ‘[column name]'”)」が起きた。

Djangoでマイグレーションをしようとしたところ、カラム重複のエラーが起きて上手くマイグレーションできませんでした。

その時のメモになります。

エラー時の状況

「カラムの重複」がエラーとして表示されましたが、models.pyを見返してみると重複がみられませんでした。

改めて確認すると、データベースには新しいカラムが更新できていたにも関わらず、showmigrationsで確認するとマイグレーションがまだ行われていない状態になっていました。

$ python manage.py showmigrations

...
api
 [X] 0001_initial
 [X] 0002_article_articlestore
 [X] 0003_auto_20221023_1335
 [ ] 0004_auto_20221031_1055  # DB上は反映済なのに[ ]のまま
# ↑反映済だから本来[X]になるはず

...

エラーの原因

原因は正確にはよくわかりませんでした。

もしかするとマイグレーションの途中でWifiの接続が切れてしまったなどが原因で、ズレが起きてしまったのかもしません。

エラーの解消法

過去のマイグレーションファイルまでデータベース状況を戻して(ロールバックして)から、再度migrateを行うことで解消することができました。

手順としては「①showmigrationsでマイグレーション履歴を確認する」→「②過去のマイグレーションファイルの状態へ戻す」→「③再度migrateを行う」です。

マイグレーション履歴を確認する

$ python manage.py showmigrations

...
api
 [X] 0001_initial
 [X] 0002_article_articlestore
 [X] 0003_auto_20221023_1335
 [ ] 0004_auto_20221031_1055

...

過去のマイグレーションファイルの状態に戻す

$ python manage.py migrate [アプリケーション名] [マイグレーションファイル名]

# $ python manage.py migrate api 0002_article_articlestore
$ python manage.py showmigrations

...
api
 [X] 0001_initial
 [X] 0002_article_articlestore  # 一旦ここまで戻した
 [ ] 0003_auto_20221023_1335
 [ ] 0004_auto_20221031_1055

...

マイグレーションを実行する

$ python manage.py migrate
$ python manage.py showmigrations

...
api
 [X] 0001_initial
 [X] 0002_article_articlestore
 [X] 0003_auto_20221023_1335
 [X] 0004_auto_20221031_1055    # 更新された

...

ただし、過去のマイグレーションに戻す際に、そのマイグレーション以降に更新したデータなどは消去されてしまうので注意が必要です。

もしかしたらよりよい解決法があるのかもしれません。

(今回は特にデータの更新などは行っていなかったので、問題はありませんでした。)

まとめ

エラーの原因が特定できなかったので今後また起きてしまわないか少し不安ですが、マイグレーションについて少しわかることが増えたのでその点はよかったです。

ただマイグレーションは上手く扱わないと大事なデータに影響を与えてしまう可能性があるので、もう少し詳しく調べていきたいと思います。

コメントを残す

*