如何回滚失败的轨道迁移?我原以为 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)
没有。很明显,向下迁移没有起作用。它没有失败,只是没有执行。
除了手动进入数据库并删除它,然后运行测试之外,没有其他方法可以删除这个重复的表。肯定有更好的办法。