繁体   English   中英

Rails 3-瑞克任务与多个数据库连接一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM