Czy możesz pobrać DB username, pw, nazwę bazy danych w Rails?

Piszę zadanie rake, które wykonuje jakąś pracę DB poza Rails/ActiveRecord.

Czy istnieje sposób na uzyskanie informacji o połączeniu DB (host, nazwa użytkownika, Hasło, Nazwa DB) dla bieżącego środowiska zdefiniowanego w database.yml?

[2]} chciałbym go zdobyć, abym mógł go użyć do połączenia w ten sposób...
con = Mysql.real_connect("host", "user", "pw", "current_db")
Author: Ethan, 2008-12-30

4 answers

Z poziomu rails można utworzyć obiekt konfiguracyjny i uzyskać z niego niezbędne informacje:

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

Zobacz dokumentację dla Rails::Configuration po szczegóły.

To po prostu używa YAML:: load do załadowania konfiguracji z pliku konfiguracyjnego bazy danych (database.yml), którego możesz użyć samodzielnie, aby uzyskać informacje spoza środowiska rails:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...
 219
Author: Robert Gamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 01:57:19

ODPOWIEDŹ Bryana w komentarzu powyżej zasługuje na trochę więcej ekspozycji:

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
 148
Author: KenB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 17:54:14
ActiveRecord::Base.connection_config

Zwraca konfigurację połączenia w haśle:

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

Jak zauważyli tpett w komentarzu: To rozwiązanie umożliwia połączenie konfiguracji ze zmiennej środowiskowej database.yml i ze zmiennej środowiskowej DATABASE_URL.

 54
Author: qqbenq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 08:46:38

Stare pytanie, ale to był jeden z moich pierwszych przystanków w poszukiwaniu, jak to zrobić, więc pomyślałem, że to może pomóc komuś innemu. Zwykle mam pliki. my. cnf w katalogu domowym. Więc używając kleju 'parseconfig' i składni ERB w mojej bazie danych.plik konfiguracyjny yml oznacza, że mam dynamiczny plik, który mogę dobrze sprawdzić w kontroli źródeł, a także uprościć wdrożenia (w moim przypadku). Zwróć również uwagę na listę typowych gniazd, dzięki czemu łatwiej jest przenieść moją aplikację do różnych systemów operacyjnych, które może mieć inną ścieżkę gniazd uniksowych.

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

 1
Author: edwardsharp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 00:08:48