为啥回滚方法不能用于 DBI 句柄?
Posted
技术标签:
【中文标题】为啥回滚方法不能用于 DBI 句柄?【英文标题】:Why would the rollback method not be available for a DBI handle?为什么回滚方法不能用于 DBI 句柄? 【发布时间】:2010-09-17 00:03:17 【问题描述】:由于某种原因,我在使用 DBI 句柄时遇到了问题。基本上发生的事情是我在 perl 模块中创建了一个特殊的连接函数并从做切换:
do 'foo.pl'
到
use Foo;
然后我做
$dbh = Foo->connect;
现在由于某种原因我不断收到错误:
无法在 ../Foo.pm 第 171 行通过包“Foo”定位对象方法“rollback”。
所以奇怪的是 $dbh 绝对不是 Foo,它只是在 foo 中定义的。无论如何,到目前为止,我还没有遇到任何麻烦。有什么想法吗?
编辑:@Axeman:connect
在原版中不存在。在我们刚刚使用这样的字符串之前:
do 'foo.pl';
$dbh = DBI->connect($DBConnectString);
所以connect
是这样的
sub connect
my $dbh = DBI->connect('blah');
return $dbh;
【问题讨论】:
你改变了连接调用吗? 【参考方案1】:我们需要查看 Foo 中的实际代码才能回答这个问题。您可能想阅读文档中的Subclassing the DBI 以了解如何正确执行此操作。
基本上,您要么需要 Foo 正确地将 DBI 子类化(同样,您需要阅读文档),要么需要声明一个连接函数以正确委托给 DBI::connect 方法。不过,为 OO 代码编写生产包装器时要小心。以这种方式维持状态变得非常困难。
【讨论】:
【参考方案2】:我同意 Axeman 的观点。您可能应该使用
调用您的函数use Foo;
...
$dbh = Foo::connect();
而不是 Foo->connect();
【讨论】:
【参考方案3】:来自perlfunc:
做'stat.pl'; 就像 评估`cat stat.pl`;
所以当你do 'foo.pl'
时,你在当前上下文中执行代码。因为我不知道foo.pl
或Foo.pm
发生了什么,所以我无法告诉你发生了什么变化。但是,我可以告诉你,它总是在当前上下文中执行,现在在 Foo::
命名空间中执行。
您调用它的方式是将'Foo'
作为第一个参数传递给Foo::connect
或Foo->can('connect')
的返回子。似乎以某种方式将其传递给了一些认为它是数据库句柄的代码,并将该对象告诉rollback
。
【讨论】:
是的,这就是错误。我想要一个静态方法,我假装 Foo 是一个类,但它不是,它是一个包。谢谢!以上是关于为啥回滚方法不能用于 DBI 句柄?的主要内容,如果未能解决你的问题,请参考以下文章