web-dev-qa-db-fra.com

Pouvez-vous obtenir le nom d'utilisateur, le pw et le nom de la base de données dans Rails?

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")
136
Ethan

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"]
...
231
Robert Gamble

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}
154
KenB
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.

73
qqbenq

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]
2
derosm2

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

1
edwardsharp