Rails / ActiveRecord 외부에서 일부 DB 작업을 수행하는 레이크 작업을 작성 중입니다.
에 정의 된 현재 환경에 대한 DB 연결 정보 (호스트, 사용자 이름, 비밀번호, DB 이름)를 얻는 방법이 database.yml
있습니까?
나는 그것을 이렇게 연결하는 데 사용할 수 있도록하고 싶습니다 …
con = Mysql.real_connect("host", "user", "pw", "current_db")
답변
레일 내에서 구성 오브젝트를 작성하고 필요한 정보를 얻을 수 있습니다.
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"]
...
답변
위의 의견에 대한 Bryan의 답변은 조금 더 노출 될 가치가 있습니다.
>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}
답변
ActiveRecord::Base.connection_config
연결 구성을 해시로 반환합니다.
=> {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT,
:database=>DB, :pool=>POOL, :username=>USERNAME,
:password=>PASSWORD}
tpett
그들의 의견에서 언급 했듯이, 이 솔루션 database.yml
은 환경 변수와 구성을 병합하는 것을 설명합니다 DATABASE_URL
.
답변
이것이 가장 간단한 해결책이라고 생각합니다. Rails 5.2에서 테스트 한 후에는 DATABASE_URL이 올바르게 해결됩니다.
ActiveRecord::Base.configurations[Rails.env]
답변
오래된 질문이지만 이것은 이것을하는 방법을 찾는 첫 번째 중지 중 하나이므로 다른 사람에게 도움이 될 수 있다고 생각합니다. 일반적으로 홈 디렉토리에 .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