it-swarm.com.de

Können Sie DB-Benutzernamen, pw, Datenbanknamen in Rails erhalten?

Ich schreibe eine Rechenaufgabe, die einige DB-Aufgaben außerhalb von Rails/ActiveRecord ausführt.

Gibt es eine Möglichkeit, die DB-Verbindungsinformationen (Host, Benutzername, Kennwort, DB-Name) für die aktuelle Umgebung abzurufen, wie in database.yml Definiert?

Ich möchte es bekommen, damit ich es verwenden kann, um eine Verbindung wie folgt herzustellen ...

con = Mysql.real_connect("Host", "user", "pw", "current_db")
136
Ethan

In Rails können Sie ein Konfigurationsobjekt erstellen und die erforderlichen Informationen daraus abrufen:

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

Weitere Informationen finden Sie in der Dokumentation für Rails :: Configuration.

Hierfür wird nur YAML :: load verwendet, um die Konfiguration aus der Datenbankkonfigurationsdatei zu laden (database.yml) mit dem Sie selbst Informationen von außerhalb der Rails Umgebung abrufen können:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["Host"]
print info["production"]["database"]
...
231
Robert Gamble

Bryans Antwort im obigen Kommentar verdient etwas mehr Aufmerksamkeit:

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "Host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
154
KenB
ActiveRecord::Base.connection_config

gibt die Verbindungskonfiguration in einem Hash zurück:

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

Wie tpett in ihrem Kommentar bemerkte: Diese Lösung berücksichtigt das Zusammenführen der Konfiguration von database.yml und aus der Umgebungsvariablen DATABASE_URL.

73
qqbenq

Ich denke, das ist die einfachste Lösung. Nach einigen Tests (mindestens in Rails 5.2)) wird DATABASE_URL korrekt aufgelöst.

 ActiveRecord::Base.configurations[Rails.env]
2
derosm2

Alte Frage, aber dies war eine meiner ersten Stationen bei der Suche nach der Vorgehensweise. Ich glaube, dies könnte jemand anderem helfen. Normalerweise habe ich .my.cnf-Dateien im Ausgangsverzeichnis. Die Verwendung des Gems 'parseconfig' und einiger ERB-Syntax in meiner Konfigurationsdatei database.yml bedeutet, dass ich eine dynamische Datei habe, mit der ich mich gut in die Quellcodeverwaltung einchecken und Bereitstellungen vereinfachen kann (in meinem Fall). Beachten Sie auch die Liste der gängigen Sockets. Dies erleichtert das Verschieben meiner App auf verschiedene Betriebssysteme, die möglicherweise einen anderen Unix-Socket-Pfad haben.

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