2013-02-06 63 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

这是一般性建议,但与此问题无关。 –