我在rake db:migrate
和rake 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)已经安装了不同的宝石。我的问题可能源于此吗?
感谢您的任何建议!
答案 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