0

我用rake db:migrateand得到了一些意想不到的行为rake db:rollback。我希望有人可以为我提供一些启示。

我通过添加一个冲突的迁移使我的迁移变得一团糟,我试图迁移回 0,以便我可以再次迁移并继续知道一切都会正常工作。

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

到处玩,我发现我可以毫无问题地进行rake db:rollback step=1:根据迁移会发生适当的操作。但是,rake db:rollback step=2(或 step=3 或 step=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 的复制,这是我迄今为止一直在做的学习练习;他们都有 self.down 方法,当我一次退一步时,他们都可以工作。

唯一可能相关的是我在另一台计算机(我的 PC)上完成了该教程;我将它推送到 github 并将其克隆到我的 Mac 上,以便将本教程用作我自己工作的起点。该应用程序似乎在我的 Mac 浏览器中运行良好(与在 PC 上相同),尽管我一直在遵循无数教程来第一次在 Mac 上设置 Rails 环境 (RVM),我'已经安装了不同的宝石来做到这一点。我的问题可能源于这里吗?

感谢您的任何建议!

4

1 回答 1

4

这篇文章可能会对你有所帮助。

基本上,您可以调整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
于 2011-12-26T11:40:39.410 回答