2008-12-30 19 views
124

मैं एक रेक कार्य लिख रहा हूं जो कुछ डीबी रेल/ActiveRecord के बाहर काम करता है।क्या आप रेल में डीबी उपयोगकर्ता नाम, पीडब्ल्यू, डेटाबेस नाम प्राप्त कर सकते हैं?

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

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

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

उत्तर

211

के भीतर से रेल आप एक विन्यास वस्तु बनाने और इसे से आवश्यक जानकारी प्राप्त कर सकते हैं:

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

रेल के लिए documentation देखें :: विवरण के लिए कॉन्फ़िगरेशन।

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

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

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

+0

के माध्यम से प्राप्त कर सकते हैं, 'yaml' और YAML :: load (IO.read (" config/database.yml ")) ठीक काम करता है! –

+0

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

143

टिप्पणी में ब्रायन के जवाब के ऊपर एक के हकदार छोटे से अधिक जोखिम:

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

यह सबसे अच्छा जवाब है। –

+0

इस अतिरिक्त जानकारी के लिए धन्यवाद, मतदान किया गया :) –

+1

+1 सबसे अच्छा जवाब! – Mattherick

1

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

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

रेफरी:

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

tpett के रूप में उनकी टिप्पणी में कहा था:: http://effectif.com/articles/database-yml-should-be-checked-in

44
ActiveRecord::Base.connection_config 

हैश पर रिटर्न कनेक्शन विन्यास इस समाधान से विन्यास विलय के लिए खातों database.yml और पर्यावरण variab से ले DATABASE_URL

+4

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

+0

इसे हेरोकू पर पढ़ा जा सकता है! – knagode