Можете ли вы получить имя пользователя БД, pw, имя базы данных в Rails? - PullRequest
134 голосов
/ 30 декабря 2008

Я пишу грабли, которые выполняют работу некоторых БД вне Rails / ActiveRecord.

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

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

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

Ответы [ 5 ]

227 голосов
/ 30 декабря 2008

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

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), который вы можете использовать самостоятельно для получения информации извне среды rails:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...
154 голосов
/ 16 ноября 2010

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

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
71 голосов
/ 28 октября 2015
ActiveRecord::Base.connection_config

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

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

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

1 голос
/ 05 января 2012

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

0 голосов
/ 18 марта 2019

Я думаю, что это самое простое решение. После некоторого тестирования (по крайней мере в Rails 5.2) это правильно разрешит DATABASE_URL.

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