您可以在Rails中获得数据库用户名,密码,数据库名称吗?


146

我正在编写一个rake任务,该任务在Rails / ActiveRecord之外进行一些数据库工作。

有没有一种方法可以获取如中所定义的当前环境的数据库连接信息(主机,用户名,密码,数据库名称)database.yml

我想要得到它,这样我就可以用它来连接...

con = Mysql.real_connect("host", "user", "pw", "current_db")

Answers:


244

在rails中,您可以创建配置对象并从中获取必要的信息:

config   = Rails.configuration.database_configuration
host     = config[Rails.env]["host"]
database = config[Rails.env]["database"]
username = config[Rails.env]["username"]
password = config[Rails.env]["password"]

有关详细信息,请参见Rails :: Configuration 文档

这仅使用YAML :: load从数据库配置文件(database.yml)中加载配置,您可以使用该文件从rails环境之外获取信息:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...

27
在最新的Rails中,您无需创建配置,可以通过Rails.configuration
Bryan Larsen

对于Rails 3.0.0,要求'yaml'和YAML :: load(IO.read(“ config / database.yml”))正常!
Arivarasan L 2014年

如果其中一些具有nil值(在我的情况下:主机,用户名和密码),Rails将使用默认值是什么?
丹尼斯

3
小心使用YAML-现代版本的Rails还将首先通过ERB过滤文件内容。
开尔文2014年

@BryanLarsenC̶o̶u̶l̶d̶̶y̶o̶u̶̶e̶l̶a̶b̶o̶r̶a̶t̶e̶?̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶̶̶t̶h̶e̶n̶̶w̶h̶a̶t̶̶e̶e̶n̶ 我看到@KenB答案。
2016年

156

布莱恩(Bryan)在上述评论中的回答值得更多关注:

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}

7
升级到Heroku上的Rails 4.1,我不得不将此行切换为:ActiveRecord :: Base.configurations [Rails.env]
quainjn 2014年

82
ActiveRecord::Base.connection_config

返回哈希中的连接配置:

=> {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT, 
    :database=>DB, :pool=>POOL, :username=>USERNAME, 
    :password=>PASSWORD} 

正如tpett他们的评论中所述:此解决方案考虑database.yml了环境变量与环境变量之间的合并DATABASE_URL


10
这似乎是将database.yml配置与DATABASE_URL环境变量合并的唯一原因。
tpett'8

我不能为别人说话,但这很完美。我想以编程方式仔细检查我是否指向了正确的数据库
jaydel

3

我认为这是最简单的解决方案。经过一些测试(至少在Rails 5.2中),这将正确解析DATABASE_URL。

 ActiveRecord::Base.configurations[Rails.env]

1

古老的问题,但这是我查找方法的第一站,因此我认为这可能会对其他人有所帮助。我通常在主目录中有.my.cnf文件。因此,在我的database.yml配置文件中使用'parseconfig'gem和一些ERB语法意味着我有了动态文件,可以很好地检查源代码控制并简化部署(对于我而言)。另请注意常用套接字列表,这使将我的应用程序移动到可能具有不同Unix套接字路径的其他操作系统变得更加容易。

<% 
    require 'parseconfig'
    c=ParseConfig.new('../../.my.cnf') %>

mysqlevn: &mysql
  adapter: mysql 
  username: <%= c.params['client']['user'] %>
  password: <%= c.params['client']['password'] %>
  host: localhost 
  socket: <%= [ 
  '/var/run/mysqld/mysqld.sock',
  '/var/lib/mysql/mysql.sock',
  '/tmp/mysqld.sock',
  '/tmp/mysql.sock'].detect { |socket| File.exist?(socket) } %>

production:
  database: app_production
  <<: *mysql


development:
  database: app_development 
  <<: *mysql

# Do not set this db to the same as development or production.
test:
  database: app_test
  <<: *mysql

参考:http//effectif.com/articles/database-yml-should-be-checked-in

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.