Rails'de DB kullanıcı adı, pw, veritabanı adı alabilir misiniz?


149

Bazı DB'nin Rails / ActiveRecord dışında çalışmasını sağlayan bir komisyon görevi yazıyorum.

İçinde tanımlandığı gibi mevcut ortam için DB bağlantı bilgilerini (ana bilgisayar, kullanıcı adı, şifre, DB adı) almanın bir yolu var mı database.yml?

Almak istiyorum ki böyle bağlanmak için kullanabileyim ...

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

Yanıtlar:


248

Rayların içinden bir konfigürasyon nesnesi oluşturabilir ve ondan gerekli bilgileri alabilirsiniz:

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

Ayrıntılar için Rails :: Configuration belgelerine bakın.

Bu , yapılandırmayı , ray ortamının dışından bilgi almak için kendiniz kullanabileceğiniz veritabanı yapılandırma dosyasından ( ) yüklemek için yalnızca YAML :: load kullanır database.yml:

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

27
Daha yeni Rails'te, yapılandırmayı oluşturmanıza gerek yok, Rails.configuration
Bryan Larsen

raylar 3.0.0 için, 'yaml' ve YAML :: load (IO.read ("config / database.yml")) gerekli!
Arivarasan L

Bunlardan bazılarının sıfır değeri varsa (benim durumumda: ana bilgisayar, kullanıcı adı ve şifre), Rails'in kullanacağı varsayılanlar nelerdir?
Dennis

3
YAML'yi kullanırken dikkatli olun - Rails'in modern sürümleri de önce dosya içeriklerini ERB aracılığıyla filtreleyecektir.
Kelvin

@BryanLarsen yaparsın ayrıntılı? ̶ ̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ o zaman ne siz olun farklı mesafede The Cevap? ̶ Belki cevap Orijinalden düzenlendi. @KenB cevabını görüyorum.
mlt

157

Bryan'ın yukarıdaki yorumdaki cevabı biraz daha gösterilmeyi hak ediyor:

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

7
Heroku'da Rails 4.1'e yükseltme yaparken, bu satırı şu şekilde değiştirmem gerekiyordu: ActiveRecord :: Base.configurations [Rails.env]
quainjn

83
ActiveRecord::Base.connection_config

bağlantı yapılandırmasını bir karma biçiminde döndürür:

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

Yorumlarında belirtildiği gibi tpett: bu çözüm, yapılandırmayı database.ymlortam değişkeninden ve ortam değişkeninden birleştirmeyi açıklar DATABASE_URL.


10
Bu, database.ymlkonfigürasyonun DATABASE_URLortam değişkeni ile birleştirilmesinden sorumlu olan tek şey gibi görünüyor .
tpett

Başkası adına konuşamam ama bu mükemmel. Doğru veritabanına işaret ettiğimi programlı olarak iki kez kontrol etmek istedim
jaydel

4

Bence bu en basit çözüm. Bazı testlerden sonra (en azından Rails 5.2'de) bu, DATABASE_URL'yi doğru bir şekilde çözecektir.

 ActiveRecord::Base.configurations[Rails.env]

1

Eski soru ama bu, bunun nasıl yapılacağına bakarken ilk duraklarımdan biriydi, bu yüzden bunun başka birine yardımcı olabileceğini düşündüm. Normalde ana dizinde .my.cnf dosyalarım var. Bu nedenle, veritabanı.yml yapılandırma dosyamda 'parseconfig' gemini ve bazı ERB sözdizimini kullanmak, kaynak kontrolünü kontrol etme konusunda iyi hissedebileceğim ve aynı zamanda dağıtımları basitleştirebileceğim (benim durumumda) dinamik dosyam olduğu anlamına gelir. Ayrıca yaygın soketlerin listesine dikkat edin, bu, uygulamamı farklı bir Unix soket yoluna sahip olabilecek farklı işletim sistemlerine taşımayı kolaylaştırır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.