如何回滚失败的rails迁移? 我希望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: migrating =====================================================
-- add_column(:assets, :test, :integer)
-> 0.0932s
-- add_column(:asset, :error)
rake aborted!
An error has occurred, all later migrations canceled:
wrong number of arguments (2 for 3)
好吧,让我们回滚:
$ rake db:rollback
== AddLevelsToRoles: reverting ===============================================
-- remove_column(:roles, :level)
-> 0.0778s
== AddLevelsToRoles: reverted (0.0779s) ======================================
是吧? 这是我在SimpleTest之前的最后一次迁移,而不是失败的迁移。 (哦,如果迁移输出包含版本号,那将会很好。)
因此,让我们尝试运行失败的迁移SimpleTest:
$ rake db:migrate:down VERSION=20090326173033
$
没有任何事情发生,也没有输出。 但也许它还是进行了迁移? 因此,我们修复SimpleTest迁移中的语法错误,并尝试再次运行它。
$ rake db:migrate:up VERSION=20090326173033
== SimpleTest: migrating =====================================================
-- add_column(:assets, :test, :integer)
rake aborted!
Mysql::Error: Duplicate column name 'test': ALTER TABLE `assets` ADD `test` int(11)
不。 显然迁移:down不起作用。 它并没有失败,它只是没有执行。
除了手动进入数据库并删除它,然后运行测试之外,没有办法摆脱那个重复的表。 必须有一个比这更好的方法。