ruby-on-rails - sesiones - ruby in rails tutorial
¿Puedes obtener el nombre de usuario de DB, pw, nombre de la base de datos en Rails? (4)
Estoy escribiendo una tarea de rake que hace algunos trabajos de DB fuera de Rails / ActiveRecord.
¿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 obtenerlo para poder usarlo para conectarme así ...
con = Mysql.real_connect("host", "user", "pw", "current_db")
Desde dentro de los rieles puede crear un objeto de configuración y obtener la información necesaria de él:
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 la documentation de Rails :: Configuration para obtener detalles.
Esto solo usa YAML::load para cargar la configuración desde el archivo de configuración de la base de database.yml
( database.yml
) que puede usar usted mismo para obtener la información desde fuera del entorno de los rieles:
require ''YAML''
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...
La respuesta de Bryan en el comentario anterior merece un poco más de exposición:
>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
Una vieja pregunta, pero esta fue una de mis primeras paradas al buscar cómo hacer esto, así que creo 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
ActiveRecord::Base.connection_config
devuelve la configuración de 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 explica la fusión de la configuración de database.yml
y de la variable de entorno DATABASE_URL
.