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
コメントを書く