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

kmbjn2e3  于 2023-04-20  发布在  Ruby
关注(0)|答案(8)|浏览(136)

我正在写一个rake任务,它在Rails/ActiveRecord之外做一些数据库工作。
是否有一种方法可以获得database.yml中定义的当前环境的数据库连接信息(主机、用户名、密码、数据库名)?
我想得到它,这样我就可以用它来连接像这样...

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

g6baxovj1#

在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"]
...
8hhllhi2

8hhllhi22#

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

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

rnmwe5a23#

ActiveRecord::Base.connection_config

以散列形式返回连接配置:

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

正如tpett在评论中所说:该解决方案考虑合并来自database.yml和来自环境变量DATABASE_URL的配置。

9wbgstp7

9wbgstp74#

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

sxpgvts35#

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

ActiveRecord::Base.configurations[Rails.env]
ds97pgxw

ds97pgxw6#

在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"
}
5sxhfpxr

5sxhfpxr7#

老问题了,但这是我第一次去寻找如何做到这一点,所以我想这可能会帮助其他人。我通常在主目录中有.my.cnf文件。所以在我的数据库.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

doinxwow

doinxwow8#

我试图获取用户名和密码以连接到pgAdmin,我尝试了上面的每一种方法,但在rails 7中无法找到我正在开发的数据库的usernamepassword的值。
事实证明,pgAdmin实际上并不需要单个应用程序数据库的用户名和密码;相反,它将向postgres * 服务器 * 进行身份验证,因此可以访问服务器上的所有数据库。
这可能会解决那些出于与我类似的原因需要usernamepassword的人的问题。
但这并不能解释为什么我无法为我的特定(rails 7)应用程序获取usernamepassword。我能猜到的最好的原因是因为Rails 7默认使用默认凭据连接到本地数据库。
在我的例子中(PostgreSQL)默认使用用户名“postgres”,没有密码或密码为空。
因此,如果你签入config/database.yml,而开发环境引用的是default,而这些默认值没有显式列出usernamepassword的任何内容,那么它可能使用了你的数据库的默认creds。不过,我找不到任何方法来证实这一点,这只是我基于在rails 7的database.yml中看到的怀疑,事实ENV没有给出与db相关的任何内容,并且所有上述方法都没有给出结果。

相关问题