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

我正在编写一个 rake 任务,它在 Rails/ActiveRecord 之外完成一些 DB 工作。

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

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

con = Mysql.real_connect("host", "user", "pw", "current_db")
78059 次浏览

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

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

这只是使用 装弹从数据库配置文件(database.yml)加载配置,您可以使用这个文件从 Rails 环境外部获取信息:

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

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

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

这是个老问题了,但这是我第一次查找如何做到这一点,所以我想这可能会帮助其他人。我通常都有。主目录中的 my.cnf 文件。因此,在我的 datase.yml 配置文件中使用‘ parsecfig’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

ActiveRecord::Base.connection_config

返回散列中的连接配置:

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

正如 tpett在他们的评论中所说: 这个解决方案考虑到了从 database.yml和环境变量 DATABASE_URL合并配置。

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

 ActiveRecord::Base.configurations[Rails.env]

从 Rails 6.1开始,就不推荐使用 ActiveRecord::Base.connection_config了,新的访问器是 ActiveRecord::Base.connection_db_config

[1] pry(main)> ActiveRecord::Base.connection_db_config
=> #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fe04ae72e58
@configuration_hash=
{:adapter=>"postgresql",
:encoding=>"utf8",
:min_messages=>"WARNING",
:host=>"localhost",
:username=>"postgres",
:password=>"P@ssw0rd",
:port=>5432,
:database=>"myapp_development"},
@env_name="development",
@name="primary">

在 Rails 6.1 + 中,你可以使用:

ActiveRecord::Base.connection_db_config.configuration_hash

这将返回包含当前环境的连接信息的散列:

{
:adapter=>"postgresql",
:encoding=>"utf8",
:min_messages=>"WARNING",
:host=>"localhost",
:username=>"postgres",
:password=>"P@ssw0rd",
:port=>5432,
:database=>"my_app_development"
}