157

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

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

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

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

7 に答える 7

259

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"]
...
于 2008-12-30T02:47:40.973 に答える
161

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

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
于 2010-11-16T17:54:14.173 に答える
94
ActiveRecord::Base.connection_config

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

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

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

于 2015-10-28T14:42:48.717 に答える
1

古い質問ですが、これはこれを行う方法を調べる際の最初の停止の1つであったため、これが他の誰かを助けるかもしれないと思います. 通常、ホーム ディレクトリに .my.cnf ファイルがあります。したがって、「parseconfig」gem と、database.yml 構成ファイルでいくつかの 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

于 2012-01-05T00:08:48.493 に答える