2008-12-30 75 views
124

我正在写Rake任务,它可以在Rails/ActiveRecord之外完成一些数据库工作。你能在Rails中获得DB用户名,密码,数据库名称吗?

有没有办法获得database.yml中定义的当前环境的数据库连接信息(主机,用户名,密码,数据库名称)?

我想获得它,所以我可以用它来连接像这样...

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

回答

211

从内轨道您可以创建一个配置对象并获得其所需的信息:

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的documentation

这只是使用YAML::load从数据库配置文件(database.yml),你可以用自己的轨道环境的外部获取信息加载配置:

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

在最近的Rails中,你不需要创建配置,你可以通过Rails.configuration` – 2010-08-18 17:37:43

+0

获取rails 3.0.0,require'yaml'和YAML :: load(IO.read(“ config/database.yml“))工作正常! – 2014-01-02 14:26:07

+0

如果其中一些具有零值(在我的情况下:主机,用户名和密码),那么Rails将使用哪些默认值? – Dennis 2014-05-26 18:48:45

143

布赖恩在评论回答上述值得多一点曝光:

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

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

44
ActiveRecord::Base.connection_config 

返回散列连接配置:

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

tpett指出在它们的注释:这个溶液占从合并的配置database.yml和环境变量le DATABASE_URL

相关问题