Ruby on rails 为什么是';rake db:rollback';回滚2个步骤,而不是默认的1个步骤
我在使用rake db:rollback时遇到了一些问题。以下是设置: 一周前,我从存储库中提取了一些更改,其中包括一个新的迁移。我运行了rakedb:migrate,一切都很好。快进7天(以及多次提交和推送),我开始开发一个新功能。我创建了一个新的功能分支,然后创建了一个新的迁移。我运行了迁移,编写了一些代码,然后意识到我在刚刚创建的迁移中犯了一个小错误。我想我可以运行Ruby on rails 为什么是';rake db:rollback';回滚2个步骤,而不是默认的1个步骤,ruby-on-rails,ruby,ruby-on-rails-4,rake,Ruby On Rails,Ruby,Ruby On Rails 4,Rake,我在使用rake db:rollback时遇到了一些问题。以下是设置: 一周前,我从存储库中提取了一些更改,其中包括一个新的迁移。我运行了rakedb:migrate,一切都很好。快进7天(以及多次提交和推送),我开始开发一个新功能。我创建了一个新的功能分支,然后创建了一个新的迁移。我运行了迁移,编写了一些代码,然后意识到我在刚刚创建的迁移中犯了一个小错误。我想我可以运行rakedb:rollback,对一次迁移进行一些更改,然后再次运行rakedb:migrate 但问题是。当我运行raked
rakedb:rollback
,对一次迁移进行一些更改,然后再次运行rakedb:migrate
但问题是。当我运行rakedb:rollback时,它回滚了两次而不是一次迁移。运行rakedb:migrate
然后迁移这两个迁移。我可以整天来回走动,但每次都会回滚两次迁移
我在这里对stackoverflow进行了一些搜索,发现它特别引用了可以添加到migrate
和rollback
的STEP参数,但仔细查看该问题中的所有内容对我没有帮助。起初,当我运行echo$STEP
时,没有返回任何内容,因此我专门将其设置为export STEP=1
,但这没有帮助:rake db:rollback
仍然每次回滚2个步骤。而且,即使在我运行rake db:rollback STEP=1时,它仍然回滚2个步骤
另外,我在模式中检查了版本号,在运行rakedb:migrate
之后,版本与我刚刚创建的最新迁移一致。运行rake db:rollback
并返回2步后,版本号与第二次最新迁移一致
我想解决这个问题有两个原因:
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
看到回滚开发租户
行了吗?公寓gem是否会导致第二步回滚?如果您有一个特定的迁移,并且不想接触任何其他迁移,您可以运行rake db:migrate:redo VERSION=“xxxxxxxxxx”
来重新运行该特定迁移
版本ID是所有迁移之前的较长数字,它仅表示创建迁移的日期/时间。因此,如果我有一个名为:20150114194155\u add\u foo\u to\u bar
的迁移文件,我的命令如下:
rakedb:migrate:redo VERSION=“20150114194155”
如果您确实需要将迁移保持在“关闭”状态,则需要做更多的工作。首先,确保您的目标迁移具有关闭操作。然后,只需运行:
rakedb:migrate:down VERSION=“20150114194155”
这将在单个迁移上运行“向下”操作
以下是了解更多信息的方法。在:
第125行
因此,如果必须在某个地方设置环境变量。尽管如此,最好始终指定步骤数:
rake db:回滚步骤=1
您能给出rake db:migrate:status和rake db:version的最后几行吗?谢谢!请参阅上面的更新。是的,您的公寓gem肯定导致了第二次回滚。很久以前我就遇到了同样的问题。如果我使用rake db:version,我会得到这行的两倍当前版本:20170327211451
== 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) =============
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