5

我正在构建的Catalyst应用程序中使用DBIx::Class 。它工作得很好,但有时我需要使用我自己开发的非常符合我需求的数据库函数。因此,我需要一个 dbh。但是,由于我已经在使用,我知道它已经有一个正在使用的 dbh。为了避免与数据库建立另一个不必要的连接,我只想使用已经创建的 dbh。我知道DBIx::Class::Storage::DBI模块有两个方法和,但我不确定两者之间有什么区别,以及它们是否是访问 dbh 的最佳方式。谁能告诉我获得 dbh 的最佳方法是什么?DBIx::ClassDBIx::Classdbhdbh_doDBIx::ClassCatalyst应用程序?我更喜欢一种我可以转发的方法,它将 dbh 存储在如下所示的存储中:

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

谢谢!

4

2 回答 2

14

我总是要查查这个。假设您有一个模式对象的实例,您可以通过该storage方法获取它的 Storage 对象。假设这是一个Storage::DBI,那么有一个可用的dbh方法可以让你获得你的数据库句柄。所以:

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

应该做的伎俩。

于 2013-02-06T01:23:40.927 回答
-2

@srchulo 答案很棒,dbh_do 是它内置异常处理的方法,但我建议将你的函数转换为不再使用 dbh,而只使用 DBIX::Class。这样,下一次,您只需在一个地方进行更改,而不是继续寻找旧的 dbh 和原始 sql。希望这是有道理的。

于 2013-02-06T05:13:43.733 回答