क्या आप रेल उपयोगकर्ता नाम, pw, डेटाबेस नाम रेल में प्राप्त कर सकते हैं?


146

मैं एक रेक कार्य लिख रहा हूँ जो Rails / ActiveRecord के बाहर कुछ DB काम करता है।

क्या वर्तमान परिवेश के लिए DB कनेक्शन की जानकारी (होस्ट, उपयोगकर्ता नाम, पासवर्ड, DB नाम) प्राप्त करने का एक तरीका है database.yml?

मैं इसे प्राप्त करना चाहूंगा ताकि मैं इसे इस तरह कनेक्ट करने के लिए उपयोग कर सकूं ...

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

जवाबों:


244

रेल के भीतर से आप एक कॉन्फ़िगरेशन ऑब्जेक्ट बना सकते हैं और उससे आवश्यक जानकारी प्राप्त कर सकते हैं:

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

रेल के लिए प्रलेखन देखें :: विवरण के लिए विन्यास।

यह सिर्फ डेटाबेस कॉन्फ़िगरेशन फ़ाइल ( ) से कॉन्फ़िगरेशन को लोड करने के लिए YAML :: लोड का उपयोग करता है database.ymlजो आप रेल वातावरण के बाहर की जानकारी प्राप्त करने के लिए खुद का उपयोग कर सकते हैं:

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

27
अधिक हाल के रेल में, आपको कॉन्फ़िगरेशन बनाने की आवश्यकता नहीं है, आप इसे प्राप्त कर सकते हैंRails.configuration
ब्रायन लार्सन

रेल के लिए 3.0.0, 'yaml' और YAML की आवश्यकता होती है :: लोड (IO.read ("config / database.yml") ठीक काम करता है!
अरिवरासन L

यदि उनमें से कुछ में शून्य मान हैं (मेरे मामले में: होस्ट, उपयोगकर्ता नाम और पासवर्ड), तो वे कौन से डिफॉल्ट हैं जो रेल का उपयोग करेंगे?
डेनिस

3
YAML का उपयोग करने के बारे में सावधानी - रेल के आधुनिक संस्करण भी पहले फ़ाइल सामग्री को ERB के माध्यम से फ़िल्टर करेंगे।
केल्विन

@BryanLarsen कि आप विस्तृत? ̶ ̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ तो क्या हो अलग का जवाब? ̶ शायद इस सवाल का जवाब मूल से संपादित किया गया था। मैं @KenB उत्तर देखता हूं।
बजे

156

ऊपर टिप्पणी में ब्रायन का जवाब थोड़ा और जोखिम के हकदार हैं:

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

7
Heroku पर रेल 4.1 पर अपग्रेड करना, मुझे इस लाइन को स्विच करना था: ActiveRecord :: Base.configurations [Rails.env]
quainjn

82
ActiveRecord::Base.connection_config

एक हैश में कनेक्शन कॉन्फ़िगरेशन लौटाता है:

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

जैसा कि tpettउनकी टिप्पणी में कहा गया है: यह समाधान database.ymlपर्यावरण चर से और उससे कॉन्फ़िगरेशन को मर्ज करने के लिए खाता है DATABASE_URL


10
यह केवल एक ही प्रतीत होता है database.ymlजो DATABASE_URLपर्यावरण चर के साथ कॉन्फ़िगरेशन के विलय के लिए जिम्मेदार है ।
tpett

मैं किसी और के लिए नहीं बोल सकता, लेकिन यह एकदम सही है। मैं प्रोग्रामेटिकली डबल चेक करना चाहता था कि मैं सही डेटाबेस पर इशारा कर रहा हूँ
jaydel

3

मुझे लगता है कि यह सबसे सरल उपाय है। कुछ परीक्षण के बाद (रेल में 5.2 कम से कम) यह DATABASE_URL को सही ढंग से हल करेगा।

 ActiveRecord::Base.configurations[Rails.env]

1

पुराना सवाल है, लेकिन यह देखने के लिए मेरे पहले पड़ाव में से एक था कि यह कैसे करना है इसलिए मुझे लगता है कि यह किसी और की मदद कर सकता है। मेरे पास सामान्य रूप से .my.cnf फाइलें होम डायरेक्टरी में हैं। इसलिए 'parseconfig' मणि और मेरे डेटाबेस में कुछ ईआरबी सिंटैक्स का उपयोग करके। config फाइल का अर्थ है कि मुझे डायनेमिक फाइल मिली है जिसे मैं सोर्स कंट्रोल में चेक करने के बारे में अच्छा महसूस कर सकता हूं और तैनाती को भी सरल बना सकता हूं (मेरे मामले में)। सामान्य सॉकेट्स की सूची पर भी ध्यान दें, इससे मेरे ऐप को अलग-अलग ऑपरेटिंग सिस्टम में स्थानांतरित करना आसान हो जाता है जिसमें एक अलग यूनिक्स सॉकेट पाथ हो सकता है।

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

रेफरी: http://effectif.com/articles/database-yml-should-be-checked-in

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.