你能在Rails中获得DB用户名,密码,数据库名称吗?

时间:2008-12-30 02:37:33

标签: ruby-on-rails ruby database activerecord environment

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

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

我想得到它所以我可以用它来连接......

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

6 个答案:

答案 0 :(得分:227)

在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"]

有关详细信息,请参阅documentation for Rails :: Configuration。

这只是使用YAML::load从数据库配置文件(database.yml)加载配置,您可以自己使用它来从rails环境之外获取信息:

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

答案 1 :(得分:153)

布莱恩在上述评论中的答案值得更多曝光:

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

答案 2 :(得分:70)

dbGetQuery(conn, "TRUNCATE TABLE employee_info")

以哈希值返回连接配置:

ActiveRecord::Base.connection_config

正如=> {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT, :database=>DB, :pool=>POOL, :username=>USERNAME, :password=>PASSWORD} 在评论中所说:此解决方案考虑合并tpett和环境变量database.yml的配置。

答案 3 :(得分: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

答案 4 :(得分:1)

从 Rails 6.1 开始,ActiveRecord::Base.connection_config 已弃用。新的正确方法是通过 ActiveRecord::Base.connection_db_config

ActiveRecord::Base.connection_config => #<ActiveRecord::DatabaseConfigurations::HashConfig @env_name="development", @name="primary", @configuration_hash={:adapter=>"mysql2", :encoding=>"utf8mb4", :database=>"your-db-name", :pool=>5, :host=>"127.0.0.1", :username=>"root", :password=>nil, :socket=>"/var/run/mysqld/mysqld.sock"}>

你会得到 ActiveRecord::DatabaseConfigurations::HashConfig object 的回报。

答案 5 :(得分:0)

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

 ActiveRecord::Base.configurations[Rails.env]