2013-02-06 2 views
4

저는 건물에있는 Catalyst 앱에서 DBIx::Class을 사용하고 있습니다. 그것은 훌륭하게 작동하지만 때로는 필자가 개발 한 자신 만의 db 함수를 사용해야합니다. 이 때문에 dbh가 필요합니다. 그러나, 이미 사용하고 있기 때문에 DBIx::Class 나는 그것이 이미 사용하고 dbh를 가지고 알아. 데이터베이스에 대한 또 다른 불필요한 연결을 피하기 위해, 나는 DBIx::Class이 이미 만든 dbh를 사용하고 싶습니다. DBIx::Class::Storage::DBI 모듈에는 dbhdbh_do의 두 가지 방법이 있지만 두 모듈간에 차이점이 있는지, 그리고 dbh에 액세스하는 가장 좋은 방법인지는 잘 모르겠습니다. 누구든지 DBIx::Class에서 dbh를 가져 오는 가장 좋은 방법은 Catalyst 앱에 무엇이 있는지 말해 줄 수 있습니까? 나는 다음과 같은 숨김에 dbh를 저장하는 방법을 선호합니다.DBIx :: Class dbh 가져 오기

sub dbh :Private { 
    my ($self, $c) = @_; 
    $c->stash->{dbh} = #get dbh from DBIx::Class here 
} 

감사합니다!

답변

9

나는 항상 이것을 봐야합니다. 스키마 개체의 인스턴스가 있다고 가정하면 storage 메서드를 통해 해당 Storage 개체를 가져올 수 있습니다. 그것이 Storage::DBI이라고 가정하면 dbh 방법을 사용할 수 있으며 데이터베이스 핸들을 얻을 수 있습니다. 따라서 :

my $dbh = $c->model('My::DB')->storage->dbh; 

트릭을해야합니다.

+0

대신 'dbh_do'를 사용해야하는 이유가 있습니까? dbh에 대한 문서에서 다음과 같이 말하기 때문에 : "대신에"dbh_do "를 사용해보십시오." – srchulo

+1

직접 사용하지는 않았지만 dbh_do에 대한 문서에서는 새로운 예외 시스템을 사용한다고합니다. (나는'$ dbh-> do'를 래핑하고 제공된 함수를 실행하는 것으로 추측한다.) 그래서 나는 그것이 이유라고 생각한다. 내가 원시'$ dbh '를 사용하는 데 전혀 문제가 없었습니다. – friedo

+3

@srchulo 네,'dbh_do'에서 실행되는 모든 것은 DBIx :: Class 연결 관리 (DB 연결이 끊어지면 재 연결)의 영향을받습니다. 아주 멋진 트랜잭션 관리를위한'txn_do'도 있습니다. – hobbs

-1

@srchulo 답변은 훌륭하고 dbh_do는 inbuilt 예외 처리를위한 방법이지만 더 이상 dbh를 사용하지 않고 DBIX :: Class를 사용하여 함수를 변환하는 데 도움이됩니다. 그렇게하면 다음 번에 한 곳에서 변경하고 레거시 dbh 및 원시 sqls를 계속 찾아 보지 않아도됩니다. 그것이 의미가 있기를 바랍니다.

+1

유용한 조언이지만이 질문과 관련이 없습니다. –

관련 문제