Rails에서 다른 데이터베이스에서 직접 SQL 코드를 어떻게 실행합니까?

StackOverflow https://stackoverflow.com/questions/80859

문제

여기에 사례가 있습니다.

저는 특정 데이터베이스의 데이터 품질을 모니터링하는 Rails 애플리케이션을 작성 중입니다.이를 위해서는 이러한 데이터베이스에 대해 직접적인 SQL 쿼리를 실행할 수 있어야 합니다. 물론 이는 Rails 애플리케이션 모델을 구동하는 데 사용되는 것과 동일하지 않습니다.간단히 말해서 이는 ActiveRecord 기본 연결을 통과하는 트릭을 사용할 수 없음을 의미합니다.

연결해야 하는 데이터베이스가 디자인 타임에 알려지지 않았습니다(예:해당 세부정보를 Database.yaml에 넣을 수 없습니다.)오히려 사용자가 런타임에 애플리케이션이 쿼리를 실행할 데이터베이스의 세부 정보를 입력하는 데 사용할 'database_details' 모델이 있습니다.
따라서 이러한 데이터베이스에 대한 연결은 실제로 동적이며 세부 사항은 런타임에만 확인됩니다.

어떻게 해야 합니까?

감사해요,
롤로

도움이 되었습니까?

해결책

수백 개의 외부 애플리케이션 인스턴스에 연결해야 하는 상황이 있었고 다음과 유사한 코드를 작성했습니다.

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

여기에는 모델이 상속하는 ActiveRecord::Base 연결을 변경하지 않는다는 추가 이점이 있으므로 이 연결에 대해 SQL을 실행하고 작업이 끝나면 개체를 삭제할 수 있습니다.

다른 팁

다음과 같은 호출을 사용하여 프로그래밍 방식으로 연결을 설정할 수 있습니다.

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

보시다시피 somedatabase를 Database_model.database_name 값으로 바꿀 수 있습니다.어댑터와 모두 동일

ActiveRecord::Base.configure_connection 문서

그런 다음 사용할 수 있습니다

ActiveRecord::Base.find_by_sql("select * ") 

SQL 쿼리를 실행합니다.

ActiveRecord::Base.find_by_sql 문서

매트 씨 불완전하다면 옳았다

더 많은 정보(오래되었지만 여전히 디자인 접근 방식에 유용함)를 찾을 수 있습니다. 여기 완료되면 일반 데이터베이스에 다시 연결하는 것을 잊지 마세요 :)

다음을 통해 이 작업을 수행할 수도 있습니다. self.configure_connection

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top