💎

🔰【Rails】「NO FILE」マイグレーションを削除する3ステップ

に公開

Railsプロジェクトでマイグレーションの管理を誤ると、以下のような問題が発生します。

$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20990814054928  Create dummy_tables
   up     20991207075805  ********** NO FILE **********
   up     20991210062842  ********** NO FILE **********

本記事では、この「NO FILE」を削除する手順を解説します。

① 問題の確認

マイグレーションファイルが削除されると、Railsはこれを「NO FILE」と表示します。
以下のコマンドで状況を確認します。

rails db:migrate:status

② schema_migrationsテーブルから削除

Railsのマイグレーション情報は、schema_migrationsテーブルで管理されています。
NO FILEの状態は、このテーブルにマイグレーションIDのみ残っているために発生します。

Railsコンソールで直接削除します。

# rails consoleを起動
rails c

# schema_migrationsの状態を確認
ActiveRecord::Base.connection.execute("SELECT * FROM schema_migrations").to_a

# 削除対象のバージョンを指定
versions = [
  '20991207075805',
  '20991210062842',
]

# 指定のマイグレーションを削除
versions.each do |version|
  ActiveRecord::Base.connection.execute("DELETE FROM schema_migrations WHERE version = '#{version}'")
end

# コンソールから抜ける
exit

③ 確認

再度ステータスを確認します。

rails db:migrate:status

表示が消えていることを確認してください。

⚠️ 注意事項

  • 本番環境ではデータ損失の恐れがあります。
  • バックアップを取ってから作業を行いましょう。
  • schema_migrations操作は、対象を間違えると深刻な障害を招きます。

筆者の考え

このような問題はマイグレーションファイルの手動削除に起因します。チームの事情にもよりますが、マイグレーションファイルは原則削除しない運用を前提としています。どうしても削除が必要な場合は、本記事の手順に従い十分な確認とバックアップを行ったうえで安全に対応しましょう。

参考

https://qiita.com/r_sk00002/items/9bf321f81d3b84042694

https://ama-tech.hatenablog.com/rails-no-file-migrations-handling

https://zenn.dev/code_journey_ys/articles/249508456bfb4f

Discussion