如何回滚失败的 Rails 迁移?我希望这rake db:rollback
会撤消失败的迁移,但是不,它会回滚先前的迁移(失败的迁移减去一)。而且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) 耙中止! 发生错误,所有后续迁移均已取消: 参数数量错误(2 对 3)
好的,让我们回滚:
$ 耙分贝:回滚 == AddLevelsToRoles:还原 ============================================= == -- remove_column(:roles, :level) -> 0.0778 秒 == AddLevelsToRoles:恢复(0.0779s)=======================================
嗯?那是我在 SimpleTest 之前的最后一次迁移,而不是失败的迁移。(哦,如果迁移输出包含版本号,那就太好了。)
因此,让我们尝试为失败的迁移 SimpleTest 运行 down:
$ 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 没有用。它没有失败,它只是没有执行。
除了手动进入数据库并删除它,然后运行测试之外,没有办法摆脱那个重复的表。一定有比这更好的方法。