LoginSignup
1
1

More than 3 years have passed since last update.

herokuでマイグレートしようとしたらMysql2::Error: Table already existsが起きたときの解決策

Posted at

起こったこと

Railsでポートフォリオを作成中、デプロイした後にマイグレートしようとしたら、
Mysql2::Error: Table 'users' already exists
が吐かれてマイグレートできなくなりました。
errorのコピー.png

原因

原因ははっきりとしていて開発環境でテーブルを増やしてアソシエーションを組んだときに、マイグレーションファイルの作成順序が誤っていて(最初からちゃんとやっておけば良い話)マイグレートに失敗し、マイグレーションファイルの作成日時を手動で変更したことが原因でした。

試してみたこと

まず、heroku run rails db:migrate:statusで本番環境のデータベースの状態を確認してみました。
error2.png

予想通り、マイグレーションのステータスがおかしなことになっています。
本来、テーブルは4つありますが、下から2つ目のファイルは NO FILE となっています。
これが手動でマイグレーションファイルの作成日時を変更した弊害です。

この後、heroku run rails db:migrate:resetでデータベースのリセットを試みましたが、別のエラーが起こりうまくいきませんでした。

解決策

heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop db:create db:migrate

を実行します。
このコマンドはデータベースを一度壊して作り直し、マイグレートするのを一度に実行するものです。
これでもう一度heroku run rails db:migrate:statusを実行し、ステータスを確認してみます。
error3.png

ステータスが正常に戻りました。
他にも方法はあると思いますが私のケースではこのコマンド一発で解決できました。

エラーを通じて

本来、データベースをしょっちゅうresetしたりdropするということ自体、あまり好ましくないものだと思います。設計の甘さで今回のようなことになってしまったので、今後作成していく個人アプリケーションでは後々のことも考えてテーブル設計、実装順序の組み立てをしていこうという学びになりました。

同じようなエラーにあたった方の、助けになれれば幸いです。

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