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
?
con = Mysql.real_connect("host", "user", "pw", "current_db")
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"]
...
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}
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
.
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
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