Можете ли вы получить имя пользователя DB, pw, имя базы данных в Rails?

Я пишу задачу rake, которая работает с некоторыми БД вне Rails/ActiveRecord.

Есть ли способ получить информацию о соединении с БД (имя хоста, имя пользователя, пароль, имя БД) для текущей среды, как определено в database.yml?

Я хотел бы получить его, чтобы я мог использовать его для подключения, как это...

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

Ответ 1

Из рельсов вы можете создать объект конфигурации и получить от него необходимую информацию:

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:: Конфигурация.

Это использует YAML:: load для загрузки конфигурации из файла конфигурации базы данных (database.yml), который вы можете использовать для получения информация извне среды рельсов:

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

Ответ 2

Ответ Брайана в комментарии выше заслуживает немного большей экспозиции:

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

Ответ 3

ActiveRecord::Base.connection_config

возвращает конфигурацию соединения в хеше:

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

Как tpett отметили в своем комментарии: это решение учитывает объединение конфигурации из database.yml и из переменной среды DATABASE_URL.

Ответ 4

Старый вопрос, но это была одна из моих первых остановок в поиске того, как это сделать, поэтому я полагаю, что это может помочь кому-то другому. Обычно у меня есть файлы .my.cnf в домашнем каталоге. Поэтому использование "parseconfig" gem и некоторого синтаксиса ERB в моем файле конфигурации database.yml означает, что у меня есть динамический файл, который я могу чувствовать себя хорошо, проверяя исходный контроль, а также упрощаю развертывание (в моем случае). Также обратите внимание на список общих сокетов, что упрощает перенос моего приложения в разные операционные системы, у которых может быть другой путь к сокету 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