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


146

Rails / ActiveRecordの外部で一部のDBを実行するrakeタスクを作成しています。

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

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

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

回答:


244

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のドキュメントを参照してください。

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

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

27
最近のRailsでは、構成を作成する必要はありません。それを入手するにはRails.configuration
Bryan Larsen、

Rails 3.0.0の場合、「yaml」が必要で、YAML :: load(IO.read( "config / database.yml"))は正常に機能します。
Arivarasan L 2014

それらのいくつかにnil値(私の場合:ホスト、ユーザー名、パスワード)がある場合、Railsが使用するデフォルトは何ですか?
デニス

3
YAMLの使用に注意してください-Railsの最新バージョンでは、最初にERBを介してファイルの内容もフィルタリングします。
ケルビン

@BryanLarsenができます手の込んだ?̶̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶次に何をすることで異なるからTHE ANSWER?̶おそらくその答えは、元から編集されました。@KenBの回答が表示されます。
mlt

156

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

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

7
HerokuでRails 4.1にアップグレードする場合、この行を次の行に切り替える必要がありました:ActiveRecord :: Base.configurations [Rails.env]
quainjn

82
ActiveRecord::Base.connection_config

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

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

tpett彼らのコメントで述べ:このソリューションは、から設定をマージするためのアカウントdatabase.ymlや環境変数からDATABASE_URL


10
これは、database.yml構成とDATABASE_URL環境変数のマージを説明する唯一の方法のようです。
tpett 2016

私は他の人のために話すことはできませんが、これは完璧です。私は正しいデータベースを指していることをプログラムでダブルチェックしたかった
ジェイデル

3

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

 ActiveRecord::Base.configurations[Rails.env]

1

古い質問ですが、これは、これを行う方法を探す上での最初の目的の1つでした。通常、ホームディレクトリには.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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.