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

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

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

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

con = Mysql.real_connect("host", "user", "pw", "current_db")
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
154
0
71 578
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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"]
...

В более поздних версиях Rails вам не нужно создавать конфигурацию, вы можете получить ее через Rails.configuration.

Bryan Larsen 18.08.2010 21:37

для рельсов 3.0.0 требуется 'yaml' и YAML :: load (IO.read ("config / database.yml")) отлично работает!

Arivarasan L 02.01.2014 18:26

Если некоторые из них имеют нулевые значения (в моем случае: хост, имя пользователя и пароль), какие значения по умолчанию будет использовать Rails?

Dennis 26.05.2014 22:48

Будьте осторожны при использовании YAML - современные версии Rails также сначала фильтруют содержимое файла через ERB.

Kelvin 24.12.2014 22:31

@BryanLarsen Вы могли бы уточнить? ̶ ̶̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ Тогда что будет отличаться от ответа? ̶ Возможно, ответ был отредактирован от оригинала. Я вижу ответ @KenB.

mlt 02.11.2016 05:10

При этом не учитывается ENV["DATABASE_URL"], который отменяет настройки из файла YAML.

max 24.01.2019 02:30

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

>> 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]

quainjn 04.06.2014 22:49

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

tpett 02.08.2016 01:18

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

jaydel 11.04.2019 17:27

Думаю, это самое простое решение. После некоторого тестирования (по крайней мере, в 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 объект.

Другие вопросы по теме