假设我有不同的数据库连接...
目前,出于本示例的目的,我们只关注开发。当我运行'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仓库并且必须在开发机器上为新员工等手动创建它。我们还必须更改我们的部署过程,以便开始将文件放在较低的环境中。 (我们的生产过程已经支持了这一点)
答案 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任务以处理多个数据库
这是大部分工作进入的地方。因此,我将把它排除在答案之外,让你为它工作!实际上,它只是一个很大的混乱,我并不为此感到骄傲,并且很乐意有时间修复它,但没有发现任何问题。我不想带领任何人走错路,但如果你有问题,请给我一个信息,我很乐意提供帮助。