失敗したレール移行をどのようにロールバックしますか? 失敗した移行を元に戻すことができると思いrake db:rollback
ますが、いいえ、以前の移行をロールバックします (失敗した移行から 1 を引いた値)。そしてrake db:migrate:down VERSION=myfailedmigration
、どちらも機能しません。私はこれに数回遭遇しましたが、非常にイライラしています。問題を再現するために作成した簡単なテストを次に示します。
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
結果:
== SimpleTest: 移行中 ============================================= ======== -- add_column(:assets, :test, :integer) -> 0.0932 秒 -- add_column(:asset, :error) レーキが中止されました! エラーが発生しました。以降の移行はすべてキャンセルされました: 引数の数が間違っています (3 に対して 2)
わかりました、ロールバックしましょう:
$ rake db:ロールバック == AddLevelsToRoles: 元に戻す =========================================== == -- remove_column(:roles, :level) -> 0.0778 秒 == AddLevelsToRoles: 元に戻されました (0.0779s) =====================================
は?これは、失敗した移行ではなく、SimpleTest の前の最後の移行でした。(そして、移行の出力にバージョン番号が含まれていればいいのですが。)
それでは、失敗した移行 SimpleTest のダウンを実行してみましょう。
$ rake db:migrate:down VERSION=20090326173033 $
何も起こらず、出力もありません。しかし、とにかく移行を実行したのでしょうか? それでは、SimpleTest 移行の構文エラーを修正して、もう一度実行してみましょう。
$ rake db:migrate:up VERSION=20090326173033 == SimpleTest: 移行中 ============================================= ======== -- add_column(:assets, :test, :integer) レーキが中止されました! Mysql::エラー: 列名 'test' が重複しています: ALTER TABLE `assets` ADD `test` int(11)
いいえ。明らかに、migrate:down は機能しませんでした。失敗しているのではなく、実行していないだけです。
手動でデータベースにアクセスして削除し、テストを実行する以外に、その重複テーブルを取り除く方法はありません。それよりも良い方法があるはずです。