如何运行 db:migrate 从另一个带参数的 rake 任务?
Posted
技术标签:
【中文标题】如何运行 db:migrate 从另一个带参数的 rake 任务?【英文标题】:How to run db:migrate from another rake task with parameters? 【发布时间】:2014-10-08 18:27:28 【问题描述】:我想从另一个 rake 任务中调用 db:drop、db:create、db:migrate 并像命令“rake db:migrate db=test”一样指定数据库。这样我就可以为多个不同的数据库连续调用它。
但是设置 Rails.env = 'test' 然后将 Rails.env 重置为新环境不起作用。
但是上面的代码总是在开发环境中执行(如果我拿出开发环境我会得到这个错误
如何多次调用这些任务并将环境更改为我们?
【问题讨论】:
【参考方案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。它必须设置连接,然后重用它。将深入研究代码,看看我是否可以解决这个问题以上是关于如何运行 db:migrate 从另一个带参数的 rake 任务?的主要内容,如果未能解决你的问题,请参考以下文章
Rail6 db:migrate 失败 - 参数数量错误(给定 1,预期 0)
每当我运行 rake db:migrate 时,Rails Schema 都会意外更改
如何在没有临时表的情况下从另一个存储过程调用存储过程(带参数)