【问题标题】:Why is 'rake db:rollback' rolling back 2 steps instead of the default of 1为什么'rake db:rollback'回滚2步而不是默认的1
【发布时间】: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 后退两步,版本号与最近的第二次迁移一致。

我想解决这个问题有两个原因:

  1. 我只需要回滚 一个 迁移,这样我就可以提交我的更改,然后切换回开发分支,而不会污染开发架构。
  2. 我想完全了解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


【解决方案1】:

如果您有特定的迁移并且不想接触任何其他迁移,您可以运行 rake db:migrate:redo VERSION="XXXXXXXXXXX" 重新运行该特定迁移。

VERSION ID 是为所有迁移添加前缀的较长数字,仅表示它的创建日期/时间。因此,如果我有一个名为:20150114194155_add_foo_to_bar 的迁移文件,我的命令将是这样的:

rake db:migrate:redo VERSION="20150114194155"

如果您确实需要让迁移处于“关闭”状态,则需要做更多的工作。首先,确保您的目标迁移具有向下操作。然后,只需运行:

rake db:migrate:down VERSION="20150114194155"

这将对单个迁移运行“向下”操作。

这里是Rails documentation 了解更多信息。

【讨论】:

    【解决方案2】:

    在rail codebase you can find: 第 125 行

    desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
    task :rollback => [:environment, :load_config] do
      step = ENV['STEP'] ? ENV['STEP'].to_i : 1
      ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths, step)
      db_namespace['_dump'].invoke
    end
    

    因此,如果必须在某处设置环境变量。尽管如此,最好总是指定步数:

    rake db:rollback STEP=1

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2022-12-16
      • 2011-05-12
      • 1970-01-01
      • 2013-01-09
      • 2010-11-14
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多