156 votes

Vous pouvez obtenir DB username, pw, nom de base de données dans les Rails ?

Je vous écris une tâche de râteau qui effectue des travaux de la DB à l’extérieur des Rails/ActiveRecord.

Y a-t-il un moyen d’obtenir les infos de connexion DB (hôte, nom d’utilisateur, mot de passe, nom de la BD) pour l’environnement actuel, tel que défini dans `` ?

Je voudrais devenir si je peux l’utiliser pour se connecter comme ça...

258voto

Robert Gamble Points 41984

De l'intérieur des rails, vous pouvez créer un objet de configuration et d'obtenir les informations qui leur sont nécessaires:

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 la documentation pour les Rails::Configuration pour plus de détails.

Ce n'utilise YAML::load pour charger la configuration dans la base de données de fichier de configuration (database.yml) que vous pouvez utiliser vous-même pour obtenir de l'information provenant de l'extérieur de l'environnement rails:

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

160voto

KenB Points 2898

Réponse de Bryan dans le commentaire ci-dessus mérite un peu plus de l’exposition :

1voto

edwardsharp Points 564

Vieille question, mais c'était un de mes premiers arrêts en regardant comment le faire donc je me dis cela peut aider quelqu'un d'autre. J'ai normalement .mon.cnf fichiers dans le répertoire d'accueil. Donc, en utilisant le "parseconfig" gem et certains ERB syntaxe dans ma base de données.yml fichier de config que j'ai obtenu dynamique de fichier que je peux sentir bien à propos de la vérification à la source de contrôle et de simplifier les déploiements (dans mon cas). Notez également la liste des sockets, ce qui rend plus facile à déplacer mes applications sur systèmes d'exploitation différents qui peuvent avoir un autre socket Unix chemin.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X