私はプロジェクトのブランチを切り替えていて、それぞれに異なる移行があります...これはシナリオです:
$レーキ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
はオプションではありません。他のテーブルからデータを失うことはありません...
私はこのような問題を解決することになりました:
(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>';
移行はデータベースに保存されます。放棄された移行を削除する場合は、それらをデータベースから削除します。
Postgresの例:
Psqlを開きます。
psql
Dbに接続します。
\c your_database
興味があれば、schema_migrationsを表示します。
SELECT * FROM schema_migrations;
興味があれば、放棄されたマイグレーションが存在するかどうかを確認してください:
SELECT version FROM schema_migrations WHERE version IN
('20130320144219', '20130320161939', '20130320184628', '20130403190042',
'20130403195300', '20130403214000', '20130410194222');
それらを削除します。
DELETE FROM schema_migrations WHERE version IN (<version list as above>);
bundle exec rake db:migrate:status
を実行すると、孤立した移行が正常に削除されたことがわかります。
編集:コメントで述べたように、次のデータベースを削除します
私のために働いたより簡単なアプローチ(このコマンドはデータベースを削除し、すべてのデータが失われることに注意してください):
rake db:migrate:reset
..その後:
rake db:migrate:status
孤児は消えます。
@medikからのpsqlの回答のレイクバージョンは次のとおりです。これは、dbを消去したり、クレイジーなことをしたりしません。
1)孤立した移行バージョンを見つけます。
Rails db:migrate:status
2)不足している移行のバージョンをメモし、dbコンソールに移動します。
Rails dbconsole
3)次に、移行テーブルから手動でバージョンを削除します。
delete from schema_migrations where version='[version_number]';
2つのブランチをマージしてマスターに戻し、すべての移行を利用できるようにすることができます。それらの移行が本当に必要ないが、ロールバックできるようにしたい場合は、データベースのschema_migrationsテーブルを編集して、ファイルがない移行に対応する行を削除できます。ただし、移行が異なる別のブランチに切り替えると、問題が発生します。
移行ファイルが本当に欠落している場合(たとえば、移行を実行し、移行をロールバックするのを忘れて、コミット前に移行ファイルを削除した場合)、欠落している移行を次のように再現できました。
git log; git checkout xxxxxx; cp schema.rb ~/schema_old.rb, git checkout master)
。diff schema.rb ~/schema_old.rb > migration_file.rb; vi migration_file.rb
)rake db:migrate:status; rake db:rollback; rake db:migrate:status;
)