web-dev-qa-db-ja.com

RailsでDBユーザー名、pw、データベース名を取得できますか?

Rails/ActiveRecordの外部でDBの作業を行うrakeタスクを書いています。

database.ymlで定義されている現在の環境のDB接続情報(ホスト、ユーザー名、パスワード、DB名)を取得する方法はありますか?

このように接続するために使用できるようにしたい...

con = Mysql.real_connect("Host", "user", "pw", "current_db")
136
Ethan

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の documentation を参照してください。

これは単に YAML :: load を使用して、データベース構成ファイル(database.yml)これを使用して、Rails環境の外部から情報を取得できます。

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["Host"]
print info["production"]["database"]
...
231
Robert Gamble

上記のコメントでのブライアンの回答は、もう少し露出する価値があります。

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "Host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
154
KenB
ActiveRecord::Base.connection_config

接続構成をハッシュで返します。

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

tpettがコメントで述べたように、このソリューションはdatabase.ymlと環境変数DATABASE_URLからの構成のマージを説明しています。

73
qqbenq

これが最も簡単な解決策だと思います。いくつかのテスト(Rails 5.2で少なくとも)の後、これはDATABASE_URLを正しく解決します。

 ActiveRecord::Base.configurations[Rails.env]
2
derosm2

古い質問ですが、これは私がこれを行う方法を調べる最初の目的の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

1
edwardsharp