2011-05-04 39 views
7

即时通讯在Perl中使用DBI连接到我的PostgreSQL数据库。 一切工作正常,但在我的调试(打印结果等)iam无法看到由perls DBI模块准备的查询是否真的正确。从PERL中的DBI语句转储准备的sql查询

我有这样的事情:

$sth->prepare(qq{SELECT * FROM company WHERE companyname LIKE ? AND city = ?}); 
$sth->execute($name.'%', $city); 

荫无法看到SQL查询看起来如何调用执行后,执行如在这里参数绑定到查询的最新步骤。

我想要有类似$sth->getLastExecutedQuery()或类似的东西来查看查询的样子。

在这种情况下,功能getLastExecutedQuery()将返回:

SELECT * FROM company WHERE companyname LIKE 'Company Name%' AND city = 'City name'; 

有没有什么办法让这个?它仅用于调试目的。

回答

5

DBI支持以下功能: 还有就是DBI->trace($tracefile_handle)方法(跟踪所有DBI相互作用),或$dbh->trace($tracefile_handle)这将跟踪某个特定的手柄正好相互作用。输出默认为STDERR,但通过提供$tracefile_handle,您可以将输出显式发送到不同的文件(或仅使用shell重定向)。

DBD :: pg也支持$h->trace('SQL');这必须得到DBD驱动程序的支持,幸运的是DBD :: Pg支持该功能。

DBI的文档,在CPAN - DBI, 和DBD :: Pg在CPAN - DBD::Pg真的给你所有你需要知道的跟踪。

+0

啊,就是这样。谢谢。 – NovumCoder 2011-05-04 15:42:02

5

使用DBI tracing facility。它的工作原理是这样的:

use strict; 
use warnings; 
use DBI; 
my %opt = (RaiseError => 1); 
my $dbh = DBI->connect('dbi:mysql:test', 'fred', 'secret', \%opt); 
$dbh->trace(2); # level 2 shows statement with inserted parameters 
my $sql_i = 'insert into t1 (a, b) values (?, ?)'; 
my $sth_i = $dbh->prepare($sql_i); 
for (qw/ eins zwei drei /) { 
    $sth_i->execute($_, $_); 
} 
$dbh->disconnect; 
+0

好吧,但这不工作,如果有错误?那么痕迹会去STDERR?无论错误是否存在,我都希望得到所有的疑问。我知道我不能提供一个文件名来跟踪(),但在文档中,我无法准备好让他们永远不仅写在错误的情况下。 – NovumCoder 2011-05-04 15:40:16