【Django】データ移行でのdjango.db.utils.ProgrammingError: (1146, “Table ” doesn’t exist”)エラー対処法

Djangoでデータベースの移行を行うと、Tableが存在しない、という旨のエラーが出ることがあります。

「移行なんだから、データベース本体はあってもテーブルなんかあるわけないだろ!」

みたいな感じなのですが、意外なところで解決できたので情報提供です。
同じようなエラーで悩んでいる人はぜひとも参考にしてください。

データ移行でのdjango.db.utils.ProgrammingError: (1146, “Table ” doesn’t exist”)エラー対処法

エラー解決の結論を述べてしまうと

移行前のデータベースをmigrateで削除する

ということになります。
上記を行えばエラーは消えますが、詳細を知りたい場合は読み進めてください。

テーブルが存在しないエラーが出る原因について

そもそもなぜこのエラーがでるのかという話になるのですが、migrateと実際のDBが一致していないのが原因です。

Djangoなどの、migrateを必要とするフレームワークにおいては、合わせるのが基本となります。

このエラーに関してですが、例えば手動で実際のDBのテーブルを削除した場合も発生します。
migrationにはDBがあるのに、実際のDBには存在しないからですね。

まあ、ならmigrateと実際のDBが違うというエラーを出力してくれよという話ですが……

ということを前提として考えると移行の際にエラーが発生するのも頷けますね。
つまり、migrate上ではテーブルがあるのに、移行後のDBにはテーブルがないからエラーになるのです。

そのため、migrate上でテーブルをすべて削除する必要があります。
もちろん移行前のデータはdumpなどをして取得していると思うので、バックアップ前提です。

削除する際のmodelsファイルも念のためにバックアップを取っておくと良いですね。

前のDBテーブルをmigrate経由で完全削除しよう。

元のDBに接続した状態でテーブルの削除を行えば、その後に新DBに接続してmigrateすることでテーブルが作成されます。

ここは新規のテーブル作成と同じですね。
テーブルさえ作ってしまえばあとはデータを移行しましょう。