Rails에서 DB 사용자 이름, 비밀번호, 데이터베이스 이름을 얻을 수 있습니까?


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

자세한 내용은 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

레일 3.0.0의 경우 'yaml'및 YAML :: load (IO.read ( "config / database.yml"))이 필요합니다!
Arivarasan L

이 중 일부에 nil 값이있는 경우 (내 경우 : 호스트, 사용자 이름 및 비밀번호) Rails가 사용하는 기본값은 무엇입니까?
Dennis

3
YAML 사용에주의하십시오. 최신 버전의 Rails는 먼저 ERB를 통해 파일 내용을 필터링합니다.
Kelvin

@BryanLarsen 수 당신 정교한? ̶ ̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ 그 다음에는 요하는 다른의 도움말? ̶은 아마도 대답은 원본과 편집했다. @KenB 답변을 참조하십시오.
mlt

156

위의 의견에 대한 Bryan의 답변은 조금 더 노출 될 가치가 있습니다.

>> 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로 업그레이드, 나는이 선을 전환했다 : 액티브 :: 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

이것이 가장 간단한 해결책이라고 생각합니다. Rails 5.2에서 테스트 한 후에는 DATABASE_URL이 올바르게 해결됩니다.

 ActiveRecord::Base.configurations[Rails.env]

1

오래된 질문이지만 이것은 이것을하는 방법을 찾는 첫 번째 중지 중 하나이므로 다른 사람에게 도움이 될 수 있다고 생각합니다. 일반적으로 홈 디렉토리에 .my.cnf 파일이 있습니다. 따라서 내 database.yml 구성 파일에서 'parseconfig'gem과 일부 ERB 구문을 사용하면 소스 제어를 확인하고 배포를 단순화 할 수있는 동적 파일이 있음을 의미합니다 (필자의 경우). 또한 일반적인 소켓 목록을 참고하면 다른 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.