失敗したレールの移行をどのようにロールバックしますか?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.0932s --add_column(:asset、:error) レーキが中止されました! エラーが発生し、それ以降の移行はすべてキャンセルされました。 引数の数が間違っています(2対3)
わかりました、ロールバックしましょう:
$ rake db:rollback == AddLevelsToRoles:元に戻す============================================= == --remove_column(:roles、:level) -> 0.0778s == 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 :: Error:Duplicate column name'test ':ALTER TABLEʻassets` ADD `test` int(11)
いいえ。明らかに、migrate:downは機能しませんでした。失敗しているのではなく、実行されていないだけです。
手動でデータベースにアクセスしてデータベースを削除し、テストを実行する以外に、重複するテーブルを削除する方法はありません。それよりも良い方法が必要です。