Railsのエラー『ActiveRecord::MigrationError: Migrations are pending』の解決方法

Railsのエラー『ActiveRecord::MigrationError: Migrations are pending』の解決方法

Railsアプリケーションで「ActiveRecord::MigrationError: Migrations are pending」というエラーが発生することがある。このエラーは、データベースのマイグレーションが未適用の状態でアプリを実行しようとした際に発生する。主な原因は、新しいマイグレーションファイルが作成されたが rails db:migrate が実行されていない、またはデータベースのバージョンが古い場合に起こる。エラーの発生条件と具体的な解決方法をまとめる。

エラーの発生条件

このエラーは、以下のような状況で発生する。

  • rails g migration でマイグレーションファイルを作成したが、rails db:migrate を実行していない
  • Git で新しいマイグレーションファイルを取得したが、マイグレーションを適用していない
  • データベースをリセットしたが、マイグレーションを再適用していない
  • schema.rbdb/migrate の状態が一致していない
  • RAILS_ENV=production で動作しているが、本番環境のデータベースにマイグレーションが適用されていない

エラーメッセージの例

ActiveRecord::MigrationError: Migrations are pending. To resolve this issue, run:

    bin/rails db:migrate

このメッセージは、適用されていないマイグレーションがあるため、rails db:migrate を実行するよう指示している。

原因1: マイグレーションを適用していない

マイグレーションを適用せずに rails server を起動すると、エラーが発生する。

rails server

この場合、以下のコマンドを実行することで解決する。

rails db:migrate

原因2: Gitで取得したマイグレーションを適用していない

Git で新しいマイグレーションファイルを取得した場合、データベースが更新されていないとエラーが発生する。

git pull origin main
rails server

この場合、rails db:migrate を実行する。

rails db:migrate

原因3: 本番環境でマイグレーションが適用されていない

本番環境では RAILS_ENV=production を指定してマイグレーションを適用する必要がある。

RAILS_ENV=production rails db:migrate

原因4: データベースのバージョンが古い

ローカル環境の db/schema.rb のバージョンが古い場合、以下のコマンドで最新のスキーマを適用する。

rails db:migrate

また、問題が解決しない場合は db:reset を試す。

rails db:reset

原因5: マイグレーションファイルが壊れている

一部のマイグレーションファイルが破損している場合、以下のコマンドで適用されていないマイグレーションを確認する。

rails db:migrate:status

失敗しているマイグレーションがあれば、再度実行する。

rails db:migrate

原因6: `schema.rb` と `db/migrate` の状態が一致していない

手動で db/schema.rb を編集したり、マイグレーションの実行順序が乱れると、データベースの状態と schema.rb が一致しなくなる。

この場合、以下のコマンドを試す。

rails db:migrate:reset

または、db/schema.rb を再生成する。

rails db:schema:load

原因7: 古いマイグレーションを削除せずに `schema.rb` を適用した

古いマイグレーションを削除した場合、新たに schema.rb を適用してもエラーが発生することがある。この場合は、db:reset を試す。

rails db:reset

原因8: `structure.sql` を使用している場合

schema.rb ではなく structure.sql を使用するプロジェクトでは、マイグレーションの適用方法が異なる。

rails db:structure:load

まとめ

  • rails db:migrate を実行する
  • rails db:migrate:status で適用状況を確認する
  • RAILS_ENV=production rails db:migrate で本番環境に適用する
  • rails db:reset でデータベースをリセットする
  • rails db:schema:load でスキーマを再適用する
  • rails db:structure:load を使用する場合は適切に実行する

これらの手順を試すことで、「ActiveRecord::MigrationError: Migrations are pending」のエラーを解決できる。