Я пишу задачу rake, которая выполняет некоторую работу с БД вне Rails / ActiveRecord.
Есть ли способ получить информацию о подключении к БД (хост, имя пользователя, пароль, имя БД) для текущей среды, как определено в database.yml?
Я бы хотел получить его, чтобы я мог использовать его для такого подключения ...
con = Mysql.real_connect("host", "user", "pw", "current_db")





Изнутри рельсов вы можете создать объект конфигурации и получить от него необходимую информацию:
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"]
Подробности смотрите в документация for Rails :: Configuration.
Это просто использует YAML :: load для загрузки конфигурации из файла конфигурации базы данных (database.yml), который вы можете использовать самостоятельно для получения информации извне среды rails:
require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...
для рельсов 3.0.0 требуется 'yaml' и YAML :: load (IO.read ("config / database.yml")) отлично работает!
Если некоторые из них имеют нулевые значения (в моем случае: хост, имя пользователя и пароль), какие значения по умолчанию будет использовать Rails?
Будьте осторожны при использовании YAML - современные версии Rails также сначала фильтруют содержимое файла через ERB.
@BryanLarsen Вы могли бы уточнить? ̶ ̶̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ Тогда что будет отличаться от ответа? ̶ Возможно, ответ был отредактирован от оригинала. Я вижу ответ @KenB.
При этом не учитывается ENV["DATABASE_URL"], который отменяет настройки из файла YAML.
Ответ Брайана в комментарии выше заслуживает большего внимания:
>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
При обновлении до Rails 4.1 на Heroku мне пришлось переключить эту строку на: ActiveRecord :: Base.configurations [Rails.env]
Старый вопрос, но это была одна из моих первых остановок в поиске того, как это сделать, поэтому я полагаю, что это может помочь кому-то другому. Обычно у меня в домашнем каталоге есть файлы .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
ссылка: http://effectif.com/articles/database-yml-should-be-checked-in
ActiveRecord::Base.connection_config
возвращает конфигурацию подключения в виде хеша:
=> {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT,
:database=>DB, :pool=>POOL, :username=>USERNAME,
:password=>PASSWORD}
Как отметил tpett в своем комментарии: это решение учитывает объединение конфигурации из database.yml и из переменной среды DATABASE_URL.
Кажется, это единственное, что объясняет слияние конфигурации database.yml с переменной среды DATABASE_URL.
Я не могу говорить ни за кого другого, но это прекрасно. Я хотел дважды проверить программно, что я указал на правильную базу данных
Думаю, это самое простое решение. После некоторого тестирования (по крайней мере, в Rails 5.2) это разрешит DATABASE_URL правильно.
ActiveRecord::Base.configurations[Rails.env]
Начиная с Rails 6.1 ActiveRecord::Base.connection_config устарел. Новый правильный способ сделать это - через ActiveRecord::Base.connection_db_config.
ActiveRecord::Base.connection_config => #<ActiveRecord::DatabaseConfigurations::HashConfig @env_name = "development", @name = "primary", @configuration_hash = {:adapter=>"mysql2", :encoding=>"utf8mb4", :database=>"your-db-name", :pool=>5, :host=>"127.0.0.1", :username=>"root", :password=>nil, :socket=>"/var/run/mysqld/mysqld.sock"}>
И вы получите обратно ActiveRecord :: DatabaseConfigurations :: HashConfig объект.
В более поздних версиях Rails вам не нужно создавать конфигурацию, вы можете получить ее через
Rails.configuration.