起こったこと
Railsでポートフォリオを作成中、デプロイした後にマイグレートしようとしたら、
Mysql2::Error: Table 'users' already exists
が吐かれてマイグレートできなくなりました。
原因
原因ははっきりとしていて開発環境でテーブルを増やしてアソシエーションを組んだときに、マイグレーションファイルの作成順序が誤っていて(最初からちゃんとやっておけば良い話)マイグレートに失敗し、マイグレーションファイルの作成日時を手動で変更したことが原因でした。
試してみたこと
まず、heroku run rails db:migrate:status
で本番環境のデータベースの状態を確認してみました。
予想通り、マイグレーションのステータスがおかしなことになっています。
本来、テーブルは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
を実行し、ステータスを確認してみます。
ステータスが正常に戻りました。
他にも方法はあると思いますが私のケースではこのコマンド一発で解決できました。
エラーを通じて
本来、データベースをしょっちゅうresetしたりdropするということ自体、あまり好ましくないものだと思います。設計の甘さで今回のようなことになってしまったので、今後作成していく個人アプリケーションでは後々のことも考えてテーブル設計、実装順序の組み立てをしていこうという学びになりました。
同じようなエラーにあたった方の、助けになれれば幸いです。