rails db:migrate:status に "******no file ********"がある時

title通り

rails db:migrate:status に "no file **"がある時 の対処について考えてみます。

すでに本項目の対処記事というものは上がっておりますが 僕の環境では一箇所詰まってので改めて記事にしています。

そもそも絵タイトルの状態 is 何?という人は rails アプリケーションディレクトリにて rails db:migrate:status もしくは rake db:migrate:status と実行してみてください。 過去に.....pending migrations error.....とかをみていたりすると このコマンドしっているんじゃないかなと思いますが、、、

下記のような結果が帰ってくると思います。 gyazo.com

それぞれが何を意味しているのか。。。 status →migrationファイルの実行状況です。upとされていれば該当migrationファイルは実行済みとなっています。  逆にdownになっていれば、そのmigrationファイルは未実行状態なのでファイル編集や削除等を気兼ねなく行えます!

migration_ID →こちらは rails g migration ~~ というコマンドを実行した際のタイムスタンプになっています! UTCを基準にスタンプしているようです。  基本的に 年月日、~時~分~ 秒という単位になっているので同じタイムスタンプがつくことはまぁ、ないでしょう

MigrationNAME →migration name というのは該当migrationファイルの名前(クラス名)です

ところで、本記事をみているということはmigrationで何かミスを犯したということですね???????

→執筆時点で私もミスをしていましたが。.......w

基本的に status が upになっているmigration ファイルの削除、及び変更は禁止 です! これはrails のmigrationの実行状態は db/schema.rbというファイルにて管理しています。 shcemaファイルというのはとても重要になっており。 migrationファイルの実行によって書き込まれ、同時にrailsmysqlsqliteといったdatabaseへtable作成、レコードの(追加|削除|など)といったSQLの発行をしています。

つまり、migrationファイルを実行した後はDBへの命令も実行がされています! その状態でmigrationファイルを削除したり、編集してしまうとmigrationファイルと,db/schema.rbの整合性がうしなわれてしまうのですorz。。。。。。。

※特にアプリケーションをデプロイする予定がある人などはmigrationファイルは綺麗に管理しておいた方が良いですね。 →上から順番にmigarationを実行する際に整合性が失われていると rake abortとなり、えらー解決をしないといけません。.......(こいつがめんどくさい)

ではno fileとなってしまったらどうしたらいいのか!

方法としては、nofileとなっているmigrationファイルをコマンド等を利用して、ファイルを作成します。 DBに対して何も命令をしないmigratioファイルを作成 そのファイルのstatus を downに変更 →うまくいったら削除。 というのが全体の流れです!

対処。

gyazo.com このnofileになっているファイルの注目すべき箇所はmigration_idです。

20171010091337 となっていますね。 本来であれば、~1010091337となっているファイルがあったはずなのに、何かの拍子に消してしまったと… (過去の大罪ですね…)

ではこのNofileとなってしまっているマイグレーションの齟齬を合わせるためのtmpファイルを作成し、DBに変更を加えないファイルを作っていたあげればよい。というのが本案件の解決策です。

cd db/migrate touch ~さっきのマイグレーションid~_tmp.rb(下記) そしてエディタ、(vim等)で編集していきます。

class Tmp < ActiveRecord::Migration[5.1]
  def change

  end
end

はい。こちらのように変更した後で

rails db:migrate:status として見ると、Nofileとなってしまっていた箇所が tmpファイルに置き換わっています!

次は、そのふぁいるをrollbackしてあげればいい。

rails db:rollback もしくは

rails db:migrate:down VERSION=[バージョン番号]

のようにしてあげれば良いのです。

正常に動作すると

rails db:migrate:status と実行すると "no file **" このmigrationファイルがdownになってると思われます それをコマンドないしfinderなどから削除してあげれば対応完了です

n番煎じのような記事になってしまいましたがfumihumiサクッとメモでした