Rails 3 - rake任务使用多个数据库连接

时间:2012-04-18 15:56:09

标签: ruby-on-rails

假设我有不同的数据库连接...

目前,出于本示例的目的,我们只关注开发。当我运行'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仓库并且必须在开发机器上为新员工等手动创建它。我们还必须更改我们的部署过程,以便开始将文件放在较低的环境中。 (我们的生产过程已经支持了这一点)

2 个答案:

答案 0 :(得分:0)

您可以使用环境变量来管理这些变量。您可以使用单个database.yml定义事物,例如:

development:
  database: ENV['DEVELOPMENT_DATABASE']

然后在.bashrc/.zshrc

中设置环境变量

答案 1 :(得分:0)

我们有多个数据库,我们大量使用分支机构...所以我想出了这个解决方案来创建多个数据库,并将他们的名字绑定到正在处理的分支......

# 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任务以处理多个数据库

这是大部分工作进入的地方。因此,我将把它排除在答案之外,让你为它工作!实际上,它只是一个很大的混乱,我并不为此感到骄傲,并且很乐意有时间修复它,但没有发现任何问题。我不想带领任何人走错路,但如果你有问题,请给我一个信息,我很乐意提供帮助。