【问题标题】:How to run db:migrate from another rake task with parameters?如何运行 db:migrate 从另一个带参数的 rake 任务?
【发布时间】:2014-10-08 18:27:28
【问题描述】:

我想从另一个 rake 任务中调用 db:drop、db:create、db:migrate 并像命令“rake db:migrate db=test”一样指定数据库。这样我就可以为多个不同的数据库连续调用它。

但是设置 Rails.env = 'test' 然后将 Rails.env 重置为新环境不起作用。

但是上面的代码总是在开发环境中执行(如果我拿出开发环境我会得到这个错误

如何多次调用这些任务并将环境更改为我们?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    一旦 ActiveRecord 设置环境,您必须直接告诉它更改环境。所以这会起作用。

    ActiveRecord::Tasks::DatabaseTasks.env = 'test'
    Rake::Task["db:drop"].execute
    Rake::Task["db:create"].execute
    Rake::Task["db:migrate"].execute 
    
    ActiveRecord::Tasks::DatabaseTasks.env = 'development'
    Rake::Task["db:drop"].execute
    Rake::Task["db:create"].execute
    Rake::Task["db:migrate"].execute   
    

    【讨论】:

      【解决方案2】:

      如果你只想暂时使用测试数据库,请将数据库连接设置为test,然后在任务完成时将其设置回默认值:

      Rails.env = 'test
      Rake::Task['db:migrate'].invoke
      Rails.env = ENV["RAILS_ENV"]
      

      【讨论】:

      • 这适用于 db:migrate 和 db:drop 但 create 仍然尝试使用开发。很奇怪。相反,我只是将rake db:create db=test 作为系统命令运行以使其工作。很奇怪。感谢您的帮助@infused
      • 有趣。虽然这在您第一次设置时有效,但如果您使用不同的 Rails.env 再次执行任务,它将使用第一个 Rails.env pastebin.com/wYRa8dSk。它必须设置连接,然后重用它。将深入研究代码,看看我是否可以解决这个问题
      猜你喜欢
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2010-10-09
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多