web-dev-qa-db-ja.com

Rails孤立した移行を解決する最良の方法は何ですか?

私はプロジェクトのブランチを切り替えていて、それぞれに異なる移行があります...これはシナリオです:

$レーキdb:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   ...
   up     20130307154128  Change columns in traffic capture
   up     20130311155109  Remove log settings
   up     20130311160901  Remove log alarm table
   up     20130320144219  ********** NO FILE **********
   up     20130320161939  ********** NO FILE **********
   up     20130320184628  ********** NO FILE **********
   up     20130322004817  Add replicate to root settings
   up     20130403190042  ********** NO FILE **********
   up     20130403195300  ********** NO FILE **********
   up     20130403214000  ********** NO FILE **********
   up     20130405164752  Fix ap hostnames
   up     20130410194222  ********** NO FILE **********

問題は rake db:rollbackファイルが見つからないため、まったく機能しません...

再度ロールバックしてNO FILEメッセージを削除するにはどうすればよいですか?

ところで、rake db:resetまたはrake db:dropはオプションではありません。他のテーブルからデータを失うことはありません...

38
Adrian

私はこのような問題を解決することになりました:

(1)移行ファイルがあるブランチに移動し、それらをロールバックします。ブランチをたくさん持っている場合、これをマージしようとすると多くの競合が発生する場合、これは簡単なことではありません。そこで、このコマンドを使用して、各孤立した移行が属するブランチを見つけます。

したがって、マイグレーションが最後に変更されたときのコミットを見つける必要があります。

git log --all --reverse --stat | grep <LASTEST_Orphan_MIGRATION_ID> -C 10

私はコミットハッシュを取得し、それが次のように属しているブランチを特定します。

git branch --contains <COMMIT_HASH>

次に、そのブランチに戻り、ロールバックを実行して、不足しているすべてのファイルに対してこのプロセスを繰り返します。

(2)マイグレーションを実行します。最終的に作業したいブランチをチェックアウトしてマイグレーションを実行すれば、問題ありません。

トラブルシューティング

また、孤立した移行が削除されたブランチ上にある場合に実行しました。

これを解決するために、欠落しているファイルと同じmigration_idを持つダミーの移行ファイルを作成し、それらをロールバックしました。その後、ダミーの移行を削除して、移行ステータスをクリーンにすることができました:)

もう1つの方法は、不足しているファイルをデータベースから直接削除することです。

delete from schema_migrations where version='<MIGRATION_ID>';
53
Adrian

移行はデータベースに保存されます。放棄された移行を削除する場合は、それらをデータベースから削除します。

Postgresの例:

  1. Psqlを開きます。

    psql
    
  2. Dbに接続します。

    \c your_database
    
  3. 興味があれば、schema_migrationsを表示します。

    SELECT * FROM schema_migrations;
    
  4. 興味があれば、放棄されたマイグレーションが存在するかどうかを確認してください:

    SELECT version FROM schema_migrations WHERE version IN 
    ('20130320144219', '20130320161939', '20130320184628', '20130403190042',
     '20130403195300', '20130403214000', '20130410194222');
    
  5. それらを削除します。

    DELETE FROM schema_migrations WHERE version IN (<version list as above>);
    

bundle exec rake db:migrate:statusを実行すると、孤立した移行が正常に削除されたことがわかります。

34
medik

編集:コメントで述べたように、次のデータベースを削除します

私のために働いたより簡単なアプローチ(このコマンドはデータベースを削除し、すべてのデータが失われることに注意してください):

rake db:migrate:reset

..その後:

rake db:migrate:status

孤児は消えます。

17
spandata

@medikからのpsqlの回答のレイクバージョンは次のとおりです。これは、dbを消去したり、クレイジーなことをしたりしません。

1)孤立した移行バージョンを見つけます。

Rails db:migrate:status

2)不足している移行のバージョンをメモし、dbコンソールに移動します。

Rails dbconsole

3)次に、移行テーブルから手動でバージョンを削除します。

delete from schema_migrations where version='[version_number]';
5
stackPusher

2つのブランチをマージしてマスターに戻し、すべての移行を利用できるようにすることができます。それらの移行が本当に必要ないが、ロールバックできるようにしたい場合は、データベースのschema_migrationsテーブルを編集して、ファイルがない移行に対応する行を削除できます。ただし、移行が異なる別のブランチに切り替えると、問題が発生します。

0
Whit Kemmey

Gitを使用していると仮定すると、これらのマイグレーションを取得して現在のブランチに取り込むのは比較的簡単なはずです。ファイルが必要な特定のコミットがある場合は、以下を使用できます。

git checkout <commit hash> <file_name>

(ありがとう この答え

または、特定のブランチHEADからチェックアウトすることもできます。

git checkout <branch name> -- <file_name>

これによると ブログ投稿

これらが実際にデータベースで実行される移行のバージョンであると想定すると、ロールバックすることをお勧めします。

0
mikeryz

移行ファイルが本当に欠落している場合(たとえば、移行を実行し、移行をロールバックするのを忘れて、コミット前に移行ファイルを削除した場合)、欠落している移行を次のように再現できました。

  1. git履歴に戻ってschema.rbファイルのコピーを取得し、git repo(git log; git checkout xxxxxx; cp schema.rb ~/schema_old.rb, git checkout master)
  2. 2つのファイルでdiffを実行し、移行コマンドを、欠落している移行ID(diff schema.rb ~/schema_old.rb > migration_file.rb; vi migration_file.rb
  3. 移行ステータスとロールバックを確認します(rake db:migrate:status; rake db:rollback; rake db:migrate:status;
0