2008-12-30 9 views
124

Escribo una tarea de rake que hace algunos trabajos de DB fuera de Rails/ActiveRecord.¿Puede obtener el nombre de usuario de DB, pw, el nombre de la base de datos en Rails?

¿Hay alguna manera de obtener la información de conexión DB (host, nombre de usuario, contraseña, nombre de base de datos) para el entorno actual tal como se define en database.yml?

me gustaría conseguirlo, así que puede utilizarlo para conectar así ...

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

Respuesta

211

Desde el interior de los carriles se puede crear un objeto de configuración y obtener la información necesaria de ella:

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

Consulte documentation para Rails :: Configuration para obtener más información.

Esto se utiliza YAML::load para cargar la configuración del archivo de configuración de base de datos (database.yml) que se puede utilizar a sí mismo para obtener la información desde fuera del entorno de rieles:

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

En Rails más recientes, no necesita crear la configuración, puede obtenerla a través de 'Rails.configuration' –

+0

para rieles 3.0.0, requiere 'yaml' y YAML :: load (IO.read (" config/database.yml ")) funciona bien! –

+0

Si algunos de ellos tienen valores nulos (en mi caso: host, nombre de usuario y contraseña), ¿cuáles son los valores predeterminados que usaría Rails? – Dennis

143

respuesta de Bryan en el comentario anterior merece una poco más de la exposición:

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

Esta es la mejor respuesta. –

+0

Gracias por esta información adicional, votada :) –

+1

+1 ¡mejor respuesta! – Mattherick

1

vieja pregunta, pero esta fue una de mis primeras paradas mirando hacia arriba en cómo hacer esto por lo que figura que esto puede ayudar a alguien más. Normalmente tengo archivos .my.cnf en el directorio principal. Entonces, usar la gema 'parseconfig' y cierta sintaxis ERB en mi archivo de configuración database.yml significa que tengo un archivo dinámico que me puede ayudar a verificar el control de fuente y también simplificar las implementaciones (en mi caso). También tenga en cuenta la lista de conectores comunes, esto hace que sea más fácil mover mi aplicación a diferentes sistemas operativos que pueden tener una ruta de socket Unix diferente.

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

44
ActiveRecord::Base.connection_config 

devuelve la configuración de la conexión en un hash:

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

Como tpett comentó en su comentario: esta solución cuentas para la fusión de la configuración de database.yml y desde el entorno variab le DATABASE_URL.

+4

Este parece ser el único que da cuenta de la fusión de la configuración 'database.yml' con la variable de entorno' DATABASE_URL'. – tpett

+0

¡Esto se puede leer en Heroku! – knagode

Cuestiones relacionadas