Puoi ottenere nome utente DB, pw, nome del database in Rails?


147

Sto scrivendo un'attività rake che fa funzionare alcuni DB al di fuori di Rails / ActiveRecord.

Esiste un modo per ottenere le informazioni sulla connessione DB (host, nome utente, password, nome DB) per l'ambiente corrente come definito in database.yml?

Mi piacerebbe ottenerlo in modo da poterlo utilizzare per connettermi in questo modo ...

con = Mysql.real_connect("host", "user", "pw", "current_db")

Risposte:


245

Dall'interno delle rotaie è possibile creare un oggetto di configurazione e ottenere le informazioni necessarie da esso:

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

Per i dettagli, consultare la documentazione di Rails :: Configuration.

Questo usa solo YAML :: load per caricare la configurazione dal file di configurazione del database ( database.yml) che puoi usare tu stesso per ottenere le informazioni dall'esterno dell'ambiente rails:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...

27
In Rails più recenti, non è necessario creare la configurazione, è possibile ottenerla tramiteRails.configuration
Bryan Larsen,

per rails 3.0.0, richiede 'yaml' e YAML :: load (IO.read ("config / database.yml")) funziona bene!
Arivarasan L

Se alcuni di questi hanno valori nulli (nel mio caso: host, nome utente e password), quali sono le impostazioni predefinite che Rails userebbe?
Dennis,

3
Attento all'utilizzo di YAML: le versioni moderne di Rails filtreranno prima anche i contenuti del file tramite ERB.
Kelvin,

@BryanLarsen C̶o̶u̶l̶d̶ ̶y̶o̶u̶ ̶e̶l̶a̶b̶o̶r̶a̶t̶e̶? ̶ ̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ ̶t̶h̶e̶n̶ ̶w̶h̶a̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ edited̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ Vedo la risposta di @KenB.
mlt

156

La risposta di Bryan nel commento sopra merita un po 'più di visibilità:

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}

7
Aggiornamento a Rails 4.1 su Heroku, ho dovuto cambiare questa linea in: ActiveRecord :: Base.configurations [Rails.env]
quainjn

82
ActiveRecord::Base.connection_config

restituisce la configurazione della connessione in un hash:

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

Come tpettosservato nel loro commento: questa soluzione tiene conto della fusione della configurazione da database.ymle verso la variabile d'ambiente DATABASE_URL.


10
Questo sembra essere l'unico che tiene conto della fusione della database.ymlconfigurazione con la DATABASE_URLvariabile di ambiente.
tpett

Non posso parlare per nessun altro, ma questo è perfetto. Volevo ricontrollare programmaticamente che stavo puntando al database corretto
jaydel,

3

Penso che questa sia la soluzione più semplice. Dopo alcuni test (almeno in Rails 5.2) questo risolverà correttamente DATABASE_URL.

 ActiveRecord::Base.configurations[Rails.env]

1

Vecchia domanda, ma questa è stata una delle mie prime tappe nel cercare come fare, quindi immagino che questo possa aiutare qualcun altro. Normalmente ho i file .my.cnf nella home directory. Quindi, usando la gemma 'parseconfig' e una certa sintassi ERB nel mio file di configurazione database.yml significa che ho un file dinamico che mi fa sentire bene controllando il controllo del codice sorgente e anche semplificando le distribuzioni (nel mio caso). Nota anche l'elenco dei socket comuni, questo rende più semplice spostare la mia app su diversi sistemi operativi che potrebbero avere un percorso socket Unix diverso.

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

rif: http://effectif.com/articles/database-yml-should-be-checked-in

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.