如何运行 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 仅回滚一步

每当我运行 rake db:migrate 时,Rails Schema 都会意外更改

如何在没有临时表的情况下从另一个存储过程调用存储过程(带参数)

Heroku 运行 sequelize db:migrate 时出现“自签名证书”错误

运行 rake db:migrate 后,我的架构不会更新