【发布时间】:2015-05-12 11:01:18
【问题描述】:
我在使用 rake db:rollback 时遇到了一些问题。这是设置:
一周前,我从存储库中提取了一些更改,其中包括新的迁移。我跑了rake db:migrate,一切都很好。快进 7 天(以及多次提交和推送),我开始研究一个新功能。我创建了一个新的功能分支,然后创建了一个新的迁移。我运行了该迁移,编写了一些代码,然后意识到我在刚刚创建的迁移中犯了一个小错误。我想我可以运行rake db:rollback,对那个迁移进行一些更改,然后再次运行rake db:migrate。
但这就是问题所在。当我运行 rake db:rollback 时,它回滚了 两个 迁移,而不仅仅是一个。运行 rake db:migrate 然后迁移这两个迁移。我可以整天来回走动,但每次总是回滚 2 个迁移。
我在 stackoverflow 上进行了一些搜索,发现 this question 专门引用了可以添加到 migrate 和 rollback 的 STEP 参数,但是通过该问题中的所有内容对我没有帮助。起初,当我运行 echo $STEP 时没有返回任何内容,所以我专门将其设置为 export STEP=1,但这并没有帮助:rake db:rollback 仍然每次回滚 2 步。而且,即使我运行 rake db:rollback STEP=1,它仍然会回滚 2 步。
另外,我检查了架构中的版本号,在运行rake db:migrate 之后,版本与我刚刚创建的最新迁移一致。运行rake db:rollback 后退两步,版本号与最近的第二次迁移一致。
我想解决这个问题有两个原因:
- 我只需要回滚 一个 迁移,这样我就可以提交我的更改,然后切换回开发分支,而不会污染开发架构。
- 我想完全了解
rake db:rollback的工作原理。也许有办法解决这个问题并让事情顺利进行,但我想更深入地了解这一点。
是否有某种应用程序配置可以确定这一点?是否有一些电线交叉,我需要手动重置一些东西?感谢您的帮助!
更新
根据一些 cmets 和响应:
我在我的 .bash_profile 中明确设置了export STEP=1,但这并没有产生任何影响,它仍然回滚了 2 个步骤。
我知道要迁移到特定版本,是的,这对我来说是到达特定位置的一种方式。我可以回滚它强迫我执行的 2 个步骤,然后通过指定版本向前迁移 1 个步骤。它可以工作,但这不是应该工作的方式,我真的很想了解这一切。
rake db:migrate:status 的输出总是返回这个错误:
rake aborted!
ArgumentError: invalid value for Integer(): ""
/Users/eliduke/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.5/lib/active_record/railties/databases.rake:98:in `%'
/Users/eliduke/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.5/lib/active_record/railties/databases.rake:98:in `block (4 levels) in <top (required)>'
/Users/eliduke/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.5/lib/active_record/railties/databases.rake:98:in `map!'
/Users/eliduke/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.5/lib/active_record/railties/databases.rake:98:in `block (3 levels) in <top (required)>'
/Users/eliduke/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `eval'
/Users/eliduke/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:migrate:status
rake db:version 的输出可能表现得很奇怪。如果我最近一直向前迁移,那就是20150309194758,它对应于我最近的迁移。如果我刚刚回滚(它强迫我执行 2 个步骤),则版本为 20150203171351,对应于 3 步骤后退的迁移。这正常吗?不应该是20150303192838,倒退2步吗?
此外,我现在在 rake db:rollback 的输出中看到了一个特殊性。它首先像正常一样显示第一次迁移的回滚(1 步),然后看起来可能是 Apartment gem 正在插入并回滚下一次迁移(2 步)。
== 20150309194758 CreateFeeds: reverting ======================================
-- drop_table(:feeds, {:id=>false})
-> 0.0291s
== 20150309194758 CreateFeeds: reverted (0.0293s) =============================
Rolling back development tenant
== 20150303192838 AddDisplayRankToEventPrizes: reverting ======================
-- remove_column(:event_prizes, :display_rank, :integer, {:index=>true, :after=>:winner_user_id})
-> 0.5963s
== 20150303192838 AddDisplayRankToEventPrizes: reverted (0.5964s) =============
看到Rolling back development tenant 行了吗?公寓宝石会导致第二步回滚吗?
【问题讨论】:
-
能否给出
rake db:migrate:status和rake db:version的最后几行? -
谢谢!请参阅上面的更新。
-
是的,你的 Apartment gem 肯定会导致第二次回滚。
-
我很久以前就遇到过同样的问题。如果我确实 rake db:version 我会得到两次这一行
Current version: 20170327211451
标签: ruby-on-rails ruby ruby-on-rails-4 rake