我在Perl中使用DBI连接到我的PostgreSQL数据库。 一切正常,但在我的调试(打印结果等)中,我无法看到perls DBI模块准备的查询是否真的正确。
我有这样的事情:
$sth->prepare( qq{SELECT * FROM company WHERE companyname LIKE ? AND city = ?});
$sth->execute( $name.'%', $city);
在调用execute之后,我无法看到sql查询的外观,因为execute是将参数绑定到查询的最新步骤。
我希望有$sth->getLastExecutedQuery()
之类的东西来查看查询的外观。
在这种情况下,函数getLastExecutedQuery()
将返回:
SELECT * FROM company WHERE companyname LIKE 'Company Name%' AND city = 'City name';
有没有办法得到这个?它仅用于调试目的。
答案 0 :(得分:6)
使用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;
答案 1 :(得分:6)
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确实为您提供了跟踪所需的一切。
答案 2 :(得分:5)
除了其他人提到的跟踪之外,您应该查看https://metacpan.org/pod/DBI#Statement,它会为您提供上次执行的SQL以及https://metacpan.org/pod/DBI#ParamValues和https://metacpan.org/pod/DBI#ParamTypes,它们会告诉您有关参数的信息。
还有DBIx::Log4perl可以在没有所有DBI跟踪的情况下记录您想要的内容。