คุณจะได้รับชื่อผู้ใช้ DB ชื่อฐานข้อมูลใน Rails หรือไม่


146

ฉันกำลังเขียนภารกิจเรคที่ฐานข้อมูลบางตัวทำงานนอก Rails / ActiveRecord

มีวิธีรับข้อมูลการเชื่อมต่อฐานข้อมูล (โฮสต์ชื่อผู้ใช้รหัสผ่านชื่อฐานข้อมูล) สำหรับสภาพแวดล้อมปัจจุบันตามที่กำหนดไว้database.ymlหรือไม่?

ฉันอยากได้มันเพื่อที่ฉันจะได้ใช้มันเชื่อมต่อแบบนี้ ...

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

คำตอบ:


244

จากภายใน Rails คุณสามารถสร้างวัตถุการกำหนดค่าและรับข้อมูลที่จำเป็นจากมัน

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

ดูเอกสารประกอบสำหรับ Rails :: Configuration สำหรับรายละเอียด

สิ่งนี้ใช้YAML :: loadเพื่อโหลดการกำหนดค่าจากไฟล์กำหนดค่าฐานข้อมูล ( database.yml) ซึ่งคุณสามารถใช้เพื่อรับข้อมูลจากสภาพแวดล้อมภายนอกของราง:

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

27
ใน Rails ล่าสุดคุณไม่จำเป็นต้องสร้างการกำหนดค่าคุณสามารถรับมันได้ผ่านทางRails.configuration
Bryan Larsen

สำหรับ Rails 3.0.0 ต้องการ 'yaml' และ YAML :: load (IO.read ("config / database.yml")) ทำงานได้ดี!
Arivarasan L

หากบางส่วนมีค่าศูนย์ (ในกรณีของฉัน: โฮสต์ชื่อผู้ใช้และรหัสผ่าน) ค่าเริ่มต้นที่ Rails จะใช้คืออะไร
Dennis

3
ระมัดระวังเกี่ยวกับการใช้ YAML - Rails รุ่นที่ทันสมัยจะกรองเนื้อหาของไฟล์ผ่าน ERB ก่อน
เคลวิน

@BryanLarsen คุณอาจจะทำอย่างละเอียด? ̶̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶แล้วสิ่งที่จะแตกต่างจากคำตอบ? ̶บางทีคำตอบถูกแก้ไขไปจากเดิม ฉันเห็นคำตอบ @KenB
mlt

156

คำตอบของไบรอันในความคิดเห็นข้างต้นสมควรได้รับการเปิดเผยมากขึ้น:

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

7
การอัพเกรดเป็น Rails 4.1 บน Heroku ฉันต้องเปลี่ยนบรรทัดนี้เป็น: 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.ymlDATABASE_URL


10
นี่น่าจะเป็นสิ่งเดียวที่บัญชีสำหรับการรวมการdatabase.ymlกำหนดค่ากับDATABASE_URLตัวแปรสภาพแวดล้อม
tpett

ฉันไม่สามารถพูดกับคนอื่นได้ แต่มันสมบูรณ์แบบ ฉันต้องการตรวจสอบอีกครั้งโดยทางโปรแกรมว่าฉันกำลังชี้ไปที่ฐานข้อมูลที่ถูกต้อง
30711

3

ฉันคิดว่านี่เป็นทางออกที่ง่ายที่สุด หลังจากการทดสอบบางอย่าง (ใน Rails 5.2 อย่างน้อย) สิ่งนี้จะแก้ไข DATABASE_URL ได้อย่างถูกต้อง

 ActiveRecord::Base.configurations[Rails.env]

1

คำถามเก่า แต่นี่เป็นหนึ่งในการหยุดแรกของฉันในการค้นหาวิธีการทำดังนั้นฉันคิดว่านี่อาจช่วยคนอื่น ปกติฉันมีไฟล์. my.cnf อยู่ในโฮมไดเร็กตอรี่ ดังนั้นการใช้ 'parseconfig' gem และไวยากรณ์ ERB บางอย่างในไฟล์ config ของ database.yml ของฉันหมายความว่าฉันมีไฟล์แบบไดนามิกที่ฉันรู้สึกดีเกี่ยวกับการตรวจสอบลงในการควบคุมแหล่งที่มาและทำให้การปรับใช้ง่ายขึ้น (ในกรณีของฉัน) นอกจากนี้ให้สังเกตรายการของซ็อกเก็ตทั่วไปซึ่งทำให้การย้ายแอพของฉันไปยังระบบปฏิบัติการอื่นนั้นอาจมีเส้นทางซ็อกเก็ต Unix ที่แตกต่างกันได้ง่ายขึ้น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.