💎
🔰【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
操作は、対象を間違えると深刻な障害を招きます。
筆者の考え
このような問題はマイグレーションファイルの手動削除に起因します。チームの事情にもよりますが、マイグレーションファイルは原則削除しない運用を前提としています。どうしても削除が必要な場合は、本記事の手順に従い十分な確認とバックアップを行ったうえで安全に対応しましょう。
参考
Discussion