Djangoでmigrateしようとしたら"Table '' already exists"というエラーが発生する
こんにちは!Nineeenという学生開発チームの代表をしている古谷洸樹です。現在、Shiftanという飲食店で使えるバイトのシフト作成ウェブアプリケーションを作成しています。
今回はDjangoを使ってMySQLにmigrateしようとしたら
"Table '<テーブル名>' already exists"というエラーが発生してしまったのでそのことについて備忘録として記事にしたいと思います。
背景
現在データベース設計が終わり、いざmodels.pyをmigrateしようというところで何度かmigrationsファイルを初期化していました。
各テーブルに作成日時と更新日時を追加した段階でエラーが出るようになりました。
状況
makemigrationsではエラーが発生しませんでした。
しかし、migrateをしようとすると下記のようなエラーが発生します。
試したこと
色々調べながらいくつか試したけどだめだったことをここにまとめます。
テーブルを消去
まず、Table already existsと言われているのだからそのテーブルをMySQLで消去してみました。消去の仕方は
drop table <テーブル名>;
を直接MySQLに打ち込むことでできます。しかし、この方法はうまくいきませんでした。
テーブルを消去した後にmigrateすると、ほかのテーブルも消せと言われます。それに従ってテーブル消去を繰り返すとmigrateしたタイミングで消したテーブルが復活してしまいました。
.dbdateを消去
次は.dbdateを消去することでデータベースの内容を消去しました。しかし、
docker-compose start
docker-compose up
docker-compose build
いずれもdbのコンテナが立ち上がるタイミングでエラーしてしまいました。
docker-compose up --force-recreate
これを使えばデータベースコンテナのエラーを無視して立ち上げることができました。しかし、この後マイグレーションしようとしたところ、データがあるといわれたのでデータベースをリセットすることはできませんでした。
コンテナを作り直す
最終手段として逃げの選択ではありますが、コンテナを作り直すことにしました。
このサイトのようにDockerコンテナの再構築を行いました。注意点としては
docker-compose build --no-cache
docker-compose up
の順で行い、前回のDockerイメージをもとにコンテナを作り直させないようにすることです。そして、一度でもエラーを起こすと最初からになる可能性があるので注意が必要です。
今回学んだこと
migrationはむやみにしないこと。
チーム開発でmigrationファイルは変更しないこと。
migrationのコミットは細心の注意を払って行う事。
不安点
今回はまだ開発段階だったためデータベースのデータが全部消えても問題なかったが、今後デプロイした際に同じ問題が起こったときに対処する術がないのでそれを調べておかなければならない。