为什么“rake db:migrate”和“rake db:rollback”不能一次回滚多个迁移?

时间:2011-12-26 11:31:39

标签: dbmigrate

我在rake db:migraterake db:rollback时遇到了一些意想不到的行为。我希望有人可以为我揭开光明。

我通过添加一个有冲突的迁移使我的迁移变得混乱,并且我正在尝试迁移回0以便我可以再次迁移并继续知道一切都能正常工作。

我正在运行rake db:migrate version=0并且只是在命令行中被转储回来,没有报告迁移并且对我的数据库没有影响。我有一个Rakefile,我的database.yml文件设置正确的登录凭据。

到处玩,我发现我能够rake db:rollback step=1没有问题:根据迁移,会发生相应的操作。但是,rake db:rollback step=2(或步骤= 3或步骤= 5 - 除1以外的任何内容)一次只能进行一次迁移。

在终端中使用mysql完全删除数据库。重新创建它,然后去了rake db:migrate。所有的表都按照应有的方式构建。我认为破坏的东西是固定的。

所以我去了rake db:migrate version=0 ....再没有发生任何事情。数据库中仍然存在表,它应该回到空白状态。

有没有人有任何想法?在这一点上,我的头皮上已经刮了一个洞。

手动删除数据库并运行迁移后,rake db:migrate version=0 --dry-run --trace会给出响应:

** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute (dry run) environment
** Execute (dry run) db:migrate

此时我的迁移只是RailsTutorial.org的复制,这是我迄今为止所做的一项学习练习;他们都有自我降低方法,当我一次退一步时,它们都能正常工作。

唯一可能相关的事情是我在另一台计算机(我的电脑)上完成了该教程;我把它推到github并将其克隆到我的Mac上,以便将教程作为我自己工作的起点。该应用程序确实在Mac上的浏览器中运行正常(与在PC上相同),尽管我一直在关注无数的教程,以便首次在Mac上设置Rails环境(RVM)已经安装了不同的宝石。我的问题可能源于此吗?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:4)

article可能会对您有所帮助。

基本上,您可以调整db:rollback任务。

namespace :db do
  desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
  task :rollback => :environment do
    step = ENV['STEP'] ? ENV['STEP'].to_i : 1
    version = ActiveRecord::Migrator.current_version - step
    ActiveRecord::Migrator.migrate('db/migrate/', version)
  end
end

所以现在你可以这样做:

rake db:rollback STEP=3