首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“rake db:rollback”回滚2步而不是默认的1

为什么“rake db:rollback”回滚2步而不是默认的1
EN

Stack Overflow用户
提问于 2015-03-10 20:20:29
回答 2查看 1.9K关注 0票数 2

我对rake db:rollback有一些问题。下面是设置:

一周前,我从存储库中提取了一些更改,其中包括了一个新的迁移。我管理着rake db:migrate,一切都很好。快进7天(多次提交和推送),我开始了一个新的功能。我创建了一个新的特性分支,然后创建了一个新的迁移。我运行了这个迁移,编写了一些代码,然后意识到我在刚刚创建的迁移中犯了一个小错误。我想我可以运行rake db:rollback,对这个迁移做一些更改,然后再进行一次rake db:migrate

但问题是。当我运行rake db:rollback时,它回滚了两个迁移,而不是一个。然后,运行rake db:migrate可以同时迁移这两个迁移。我可以整天来回走动,但每次它总是回滚两次迁移。

我在这里对堆栈溢出进行了一些搜索,发现这个问题专门引用了可以添加到migraterollback中的STEP参数,但是在这个问题中的所有内容对我都没有帮助。在运行echo $STEP时,最初没有返回任何内容,所以我使用export STEP=1进行了专门设置,但这并没有帮助:rake db:rollback仍然每次回滚2步。而且,即使我运行rake db:rollback STEP=1,它仍然回滚2步。

另外,我检查了模式中的版本号,在运行rake db:migrate之后,该版本与我刚刚创建的最新迁移是一致的。在运行rake db:rollback并返回两个步骤之后,版本号与最近的第二次迁移一致。

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

  1. 我只需要回滚1迁移,这样我就可以提交更改,然后切换回开发分支,而不会污染开发模式。
  2. 我想充分理解rake db:rollback是如何工作的。也许有一种方法可以破解这个问题,让事情继续进行下去,但我想从更深的层面来理解这一点。

是否有某种应用程序配置来决定这一点?有些电线被交叉了,我需要手动重置一些东西?谢谢你的帮忙!

更新

根据一些评论和答复:

我在我的.bash_profile中显式地设置了.bash_profile,这并没有什么区别,它仍然回滚了两个步骤。

我知道要迁移到一个特定的版本,是的,这是我到达特定位置的一种方式。我可以回滚它强迫我的两个步骤,然后通过指定版本向前迁移1步。它可以工作,但这不是这个应该的工作方式,我真的很想了解这一切。

rake db:migrate:status的输出总是返回此错误:

代码语言:javascript
复制
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,它与我最近的迁移相对应。如果我刚刚回滚(它强迫我执行的两个步骤),版本是20150203171351,它对应于迁移,即3退一步。这正常吗?它不应该是20150303192838,它后退2步吗?

另外,我现在看到了rake db:rollback输出中的一个特性。它首先显示第一次迁移的回滚,类似于正常(1步),然后看起来可能是公寓宝石插入并回滚下一次迁移(2步)。

代码语言:javascript
复制
== 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线了吗?公寓的创业板会不会导致第二步回滚?

EN

回答 2

Stack Overflow用户

发布于 2015-03-10 23:13:39

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

版本ID是前缀所有迁移的较长的数字,这只是意味着创建它的日期/时间。因此,如果我有一个名为:20150114194155_add_foo_to_bar的迁移文件,那么我的命令应该如下所示:

rake db:migrate:redo VERSION="20150114194155"

如果您确实需要将迁移保留在它的“倒”状态,那么它将需要做更多的工作。首先,确保目标迁移具有向下操作。然后,只需运行:

rake db:migrate:down VERSION="20150114194155"

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

下面是Rails文档来了解更多信息。

票数 2
EN

Stack Overflow用户

发布于 2015-03-10 23:17:52

铁路代码库中:第125行

代码语言:javascript
复制
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 :回滚STEP=1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28973347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档