2013-02-06 160 views
4

我在使用DBIx::Class創建了一個Catalyst應用程序。它工作得很好,但有時我需要使用我自己開發的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是它內置的異常處理的方式,但我會建議轉換你的函數,而不是使用dbh了,只需使用DBIX :: Class。這樣,下一次,你只需要在一個地方改變,而不是繼續尋找傳統的dbh和原始的sqls。希望它是有道理的。

+1

這是一般性建議,但與此問題無關。 –