0

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

现在为了这个例子的目的,让我们只关注开发。当我运行“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 设置为“日志记录”,它将永远不会加载该文件,因为该文件称为 development.yml。因此它永远不会找到日志连接。

如果我将所有这些设置合并回 database.yml 文件,那么我们将回到不将 database.yml 签入 git repo 并且必须在开发机器上为新员工等手动创建它。我们还必须更改我们的部署过程以开始将文件放置在较低的环境中。(我们的生产过程已经支持这一点)

4

2 回答 2

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

这是大部分工作的内容。因此,我将把它排除在答案之外,让你为它工作!实际上,不,这只是一个大混乱,我并不为此感到自豪,并且很想花时间修复它,但还没有找到任何东西。我不想把任何人引向错误的道路,但如果您有任何问题,请给我留言,我很乐意提供帮助。

于 2012-11-12T23:10:51.473 回答
0

您可以使用环境变量来管理这些。您可以有一个单独的 database.yml,其中定义了以下内容:

development:
  database: ENV['DEVELOPMENT_DATABASE']

然后在你的.bashrc/.zshrc.

于 2012-04-18T16:03:19.707 回答