【问题标题】:Dump prepared sql query from DBI statement in PERL从 PERL 中的 DBI 语句转储准备好的 sql 查询
【发布时间】:2011-08-18 15:19:29
【问题描述】:

我在 Perl 中使用 DBI 连接到我的 PostgreSQL 数据库。 一切正常,但在我的调试(打印结果等)中,我无法查看 perls DBI 模块准备的查询是否真的正确。

我有这样的事情:

$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';

有没有办法得到这个?它仅用于调试目的。

【问题讨论】:

    标签: perl debugging dbi dump


    【解决方案1】:

    使用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;
    

    【讨论】:

    • 好的,但这不是只有在出现错误时才有效吗?那么痕迹会转到STDERR吗?无论是否有错误,我都想获得所有查询。我知道我无法为 trace() 提供文件名,但在文档中我无法准备好让它们始终写入的任何东西,不仅在错误情况下。
    【解决方案2】:

    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 确实为您提供了有关跟踪所需的所有信息。

    【讨论】:

      【解决方案3】:

      除了其他人提到的跟踪之外,您还应该查看 https://metacpan.org/pod/DBI#Statement,它会为您提供上次执行的 SQL,以及告诉您参数的 https://metacpan.org/pod/DBI#ParamValues 和 https://metacpan.org/pod/DBI#ParamTypes。

      还有DBIx::Log4perl 可以记录您想要的内容,而无需进行所有 DBI 跟踪。

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 2014-04-17
        • 2014-03-07
        • 1970-01-01
        • 2016-09-11
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多