[英]Rails 3 - rake tasks to work with multiple database connections
假设我有不同的数据库连接...
现在,出于本示例的目的,我们仅关注开发。 当我运行“ rake db:setup”时,它仅创建开发,因为从rake任务的角度来看,另一个连接是另一个环境。 我可以传入另一个连接作为RAILS_ENV来创建数据库。 但是,问题出在我们如何定义数据库连接。 我不想撤消此操作,因为它使管理和部署变得更加容易。 我们要做的是...
在我们的database.yml中,我们添加了以下代码。
databases_file = File.join(Rails.root.to_s, "config", "databases", "#{Rails.env.to_s}.yml")
IO.read(databases_file) if File.exist?(databases_file)
然后在config下的数据库子文件夹中,我们创建了不同的环境yml文件。
所以在development.yml中,我们有...
development:
... details ...
logging:
... details ...
现在,如果我将RAILS_ENV设置为“ logging”,它将永远不会加载该文件,因为该文件称为development.yml。 因此,它将永远找不到日志记录连接。
如果我将所有这些设置重新整合到database.yml文件中,那么我们将回到不将database.yml签入git repo的过程中,而必须在开发机器上手动创建它以供新员工使用。 我们还必须更改部署过程,以开始将文件放置在较低环境中。 (我们的生产过程已经支持了这一点)
您可以使用环境变量来管理这些变量。 您可能只有一个database.yml,其中定义了以下内容:
development:
database: ENV['DEVELOPMENT_DATABASE']
然后在.bashrc/.zshrc
设置环境变量。
我们有多个数据库,并且我们大量使用分支...因此我想出了这个解决方案来创建多个数据库,并将它们的名称绑定到正在处理的分支...
# config/database.yml
<%=
databases_file = File.join(Rails.root.to_s, "config", "databases", "#{Rails.env.to_s}.yml")
if Rails.env.development? || Rails.env.test?
branch = ENV['BRANCH'] || `git branch --no-color 2> /dev/null`.chomp.split("\n").grep(/^[*]/).first[/(\S+)$/,1].sub("-", "_")
puts "Using databases for #{branch}"
IO.read(databases_file).gsub!("<branch>", branch) if File.exist?(databases_file)
else
IO.read(databases_file) if File.exist?(databases_file)
end
%>
然后为每个环境创建一个数据库文件。 在development.yml和test.yml中,使用令牌让此脚本查找执行替换所需的内容。 因此,示例文件如下所示。
# config/databases/development.yml
development:
adapter: mysql2
host: 127.0.0.1
database: <branch>_dev
username: user
password: pass
versions:
adapter: mysql2
host: 127.0.0.1
database: <branch>_versions
username: user
password: pass
reporting:
adapter: mysql2
host: 127.0.0.1
database: <branch>_reporting
username: user
password: pass
ods:
adapter: mysql2
host: 127.0.0.1
database: <branch>_ods
username: user
password: pass
然后,我将rake任务扩展为处理多个数据库
这是大部分工作的去向。因此,我将把它排除在答案之外,让您为之努力! 实际上,这只是一个大混乱,我并不为此感到骄傲,并且愿意花时间去修复它,但是还没有找到。 我不想带领任何人走错路,但如果您有任何疑问,请给我发消息,我们将竭诚为您服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.