J'écris une tâche de rake qui effectue certains travaux de base de données en dehors de Rails/ActiveRecord.
Existe-t-il un moyen d’obtenir les informations de connexion à la base de données (hôte, nom d’utilisateur, mot de passe, nom de la base de données) pour l’environnement actuel tel que défini dans database.yml
?
J'aimerais bien l'obtenir pour pouvoir l'utiliser comme connexion ...
con = Mysql.real_connect("Host", "user", "pw", "current_db")
De l'intérieur Rails vous pouvez créer un objet de configuration et obtenir les informations nécessaires à partir de celui-ci:
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"]
Voir le documentation pour Rails :: Configuration pour plus de détails.
Ceci utilise simplement YAML :: load pour charger la configuration à partir du fichier de configuration de la base de données (database.yml
) que vous pouvez utiliser vous-même pour obtenir les informations en dehors de l’environnement Rails:
require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["Host"]
print info["production"]["database"]
...
La réponse de Bryan dans le commentaire ci-dessus mérite un peu plus de visibilité:
>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "Host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
ActiveRecord::Base.connection_config
renvoie la configuration de la connexion dans un hachage:
=> {:adapter=>ADAPTER_NAME, :Host=>Host, :port=>PORT,
:database=>DB, :pool=>POOL, :username=>USERNAME,
:password=>PASSWORD}
Comme le remarque tpett
dans leur commentaire: cette solution permet de fusionner la configuration de database.yml
et de la variable d'environnement DATABASE_URL
.
Je pense que c'est la solution la plus simple. Après quelques tests (dans Rails 5.2 au moins)), cela résoudra correctement DATABASE_URL.
ActiveRecord::Base.configurations[Rails.env]
Vieille question, mais c’était l’un de mes premiers arrêts à chercher comment faire cela, alors je pense que cela pourrait aider quelqu'un d’autre. J'ai normalement des fichiers .my.cnf dans le répertoire personnel. Donc, utiliser la gemme 'parseconfig' et une syntaxe ERB dans mon fichier de configuration database.yml signifie que j'ai un fichier dynamique que je peux vérifier en vérifiant le contrôle de source et simplifiant également les déploiements (dans mon cas). Notez également la liste des sockets communs, cela facilite le déplacement de mon application vers différents systèmes d'exploitation pouvant avoir un chemin de socket Unix différent.
<%
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