【Ruby on Rails】マイグレーションが失敗して困った話と対処法

Ruby

こんにちは、かつコーチです。

マイグレーションを実行したら、途中で止まって動かなくなった経験はありませんか。
私は開発中に何度もこの状況に陥り、原因が分からず焦った経験があります。
この記事では、マイグレーション失敗時の代表的な症状と、実際に私が遭遇したエラーを使った対処法を解説します。
読み終える頃には、慌てずにマイグレーションのトラブルへ対応できるようになります。

症状の再現:マイグレーションが失敗する典型パターン

カラム重複によるエラー

すでに存在するカラムを追加しようとすると、マイグレーションは失敗します。
一度実行に失敗すると、データベースとマイグレーションファイルの状態がズレてしまいます。

途中で処理が止まる不整合

複数のマイグレーションファイルを一気に実行した際、途中の1つが失敗すると、それ以降は実行されません。
結果として「一部だけ反映された中途半端な状態」になり、次に何を実行すればいいか分からなくなります。

実装手順:状況確認から復旧まで

手順1:マイグレーションの状態を確認する

まずはdb:migrate:statusで、どこまで反映されているかを確認します。

bin/rails db:migrate:status
database: myapp_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20260810120000  Create articles
  down    20260812093000  Add category to articles

downと表示されている行が、まだ実行されていないマイグレーションです。

手順2:db:rollbackで巻き戻す

直前のマイグレーションを取り消したい場合は、db:rollbackを使います。

bin/rails db:rollback

複数世代を一度に戻したい場合は、STEPオプションで戻す数を指定します。

bin/rails db:rollback STEP=2

手順3:マイグレーションファイルを修正して再実行する

エラーの原因になったマイグレーションファイルを修正したら、再度db:migrateを実行します。

bin/rails db:migrate

よくあるつまずきポイント・エラー対処

Before/After:カラム重複エラー

私が実際に遭遇したのは、すでに存在するcategoryカラムをもう一度追加しようとしたケースです。

❌Before:既存カラムを重複して追加しようとした状態

# db/migrate/20260812093000_add_category_to_articles.rb
class AddCategoryToArticles < ActiveRecord::Migration[8.0]
  def change
    add_column :articles, :category, :string
  end
end
bin/rails db:migrate
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: category

過去に一度手動でカラムを追加していたことを忘れ、同じ内容のマイグレーションを作ってしまっていました。
このエラーで15分ほど、何が起きているのか理解できずに固まってしまいました。

✅After:ロールバックしてから状況を整理する

まず、失敗したマイグレーションを一度ロールバックします。

bin/rails db:rollback

続いて、schema.rbを確認し、実際にcategoryカラムが存在するかを目視で確認しました。

# db/schema.rb(抜粋)
create_table "articles", force: :cascade do |t|
  t.string "title"
  t.string "category"
end

すでにcategoryカラムが存在していたため、該当のマイグレーションファイル自体を削除し、db:migrate:statusで整合性を確認して解決しました。

Before/After:スキーマの不整合によるエラー

チーム開発でブランチを切り替えた際、schema.rbのバージョンとデータベースの実態がズレることがあります。

❌Before:schema.rbとデータベースの状態が一致しない

bin/rails db:migrate
ActiveRecord::NoEnvironmentInSchemaError:
Environment data not found in the schema. To resolve this issue, run:

        bin/rails db:environment:set RAILS_ENV=development

他のブランチで作業した後、db:schema:loadを実行せずにマイグレーションを走らせたことが原因でした。

✅After:schema:loadで一旦揃えてから再実行する

bin/rails db:schema:load
bin/rails db:migrate

db:schema:loadschema.rbの内容をデータベースに反映し直すことで、状態を揃えてから改めてマイグレーションを実行します。
チーム開発でブランチを切り替えるたびに、この手順を踏むことが安全策になります。

まとめ

この記事のポイント

  • マイグレーションが失敗したら、まずdb:migrate:statusで状態を確認する
  • db:rollbackで直前の変更を取り消してから、原因を調査する
  • カラム重複エラーは、schema.rbを見て実際の状態と照合するのが近道
  • ブランチ切り替え時のスキーマ不整合はdb:schema:loadで揃える

次に読むべき記事

マイグレーション以外のよくあるエラーも知りたい方は「Railsでよく出るエラーと解決法まとめ」を参考にしてください。
rails consoleでデータベースの中身を直接確認する方法は「rails consoleを使いこなすデバッグ術」で解説しています。

タグ: Ruby on Rails, 中級者向け, エラー解決

タイトルとURLをコピーしました