Можете ли вы получить имя пользователя 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