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

Railsアプリケーションで「ActiveRecord::MigrationError: Migrations are pending」というエラーが発生することがある。このエラーは、データベースのマイグレーションが未適用の状態でアプリを実行しようとした際に発生する。主な原因は、新しいマイグレーションファイルが作成されたが rails db:migrate
が実行されていない、またはデータベースのバージョンが古い場合に起こる。エラーの発生条件と具体的な解決方法をまとめる。
エラーの発生条件
このエラーは、以下のような状況で発生する。
rails g migration
でマイグレーションファイルを作成したが、rails db:migrate
を実行していない- Git で新しいマイグレーションファイルを取得したが、マイグレーションを適用していない
- データベースをリセットしたが、マイグレーションを再適用していない
schema.rb
とdb/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」のエラーを解決できる。
-
前の記事
WebRTCを使ったJavaScriptによるリアルタイム通信の実装 2025.02.05
-
次の記事
Rubyで関数型プログラミング:純粋関数と不変性を活用する 2025.02.05
コメントを書く