【问题标题】:Perl DBI: how to see failed query with bound values?Perl DBI:如何使用绑定值查看失败的查询?
【发布时间】:2011-09-21 16:37:15
【问题描述】:

这是来自DBI手册的标准插入示例:

     my $query = q{
       INSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };
     my $sth = $dbh->prepare($query) or die $dbh->errstr;
     while (<>) {
         chomp;
         my ($product_code, $qty, $price) = split /,/;
         $sth->execute($product_code, $qty, $price) or die ($query . " " . $dbh->errstr);
     }
     $dbh->commit or die $dbh->errstr;

我稍微修改了一下,所以我可以看到哪个查询失败了 (die ($query . " " . $dbh-&gt;errstr))。我仍然希望看到带有绑定值的查询(因为它已被执行)。如何获得?


编辑

顺便说一句,我也发现了一种查看带有绑定值的查询的尴尬方式:您必须在查询中产生语法错误。例如,如果我像这样更改上面的查询:

     my $query = q{
       xINSERT INTO sales (product_code, qty, price) VALUES (?, ?, ?)
     };

我如愿以偿:

DBD::mysql::st 执行失败:您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 'xINSERT INTO sample (product_code, qty, price) VALUES ('1', '2', '3')' 附近使用的正确语法在第 1 行

有时它真的很有帮助。至少对我有影响。

【问题讨论】:

    标签: perl dbi


    【解决方案1】:

    您可以使用 DBI 的ParamValues 来获取参数值,但是您不太可能在 DBD 中找到任何方法来获取实际在 SQL 中的参数,因为它们大多是在 SQL 解析后发送到数据库的。您可以查看DBIx::Log4perl 以了解在错误处理程序中如何使用 ParamValues。您可能还会发现 DBIx::Log4perl 的某些部分很有用。

    【讨论】:

    • 感谢您指点好方向。我仍然想指出我在 OP 中的添加。
    【解决方案2】:

    没有标准的方法可以做到这一点。最接近的近似值是用(可能引用的)值替换每个占位符。通常,要可靠地解析 SQL 语句以找到占位符而不是分隔标识符或字符串或 cmets 的一部分的问号是相当困难的。在示例中,您可以简单地查找问号;但是,这并不总是有效:

    INSERT /* ? */ INTO "??".Sales VALUES('?', ?, ?, ?);
    

    请注意,对于大多数(但不一定是全部)DBMS(以及因此大多数 DBD 驱动程序),语句在准备好时发送到 DBMS;执行语句时仅发送值。永远不会创建将所有值替换到 VALUES 列表中的语句,因此不应期望 DBI 和 DBMS 创建语句。

    【讨论】:

      【解决方案3】:

      我认为没有任何普遍支持的 DBI 方法可以做到这一点,但个别数据库驱动程序可能允许这样做。你用的是什么数据库?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 2011-10-06
        • 2021-02-28
        • 1970-01-01
        • 2023-03-04
        • 2015-08-12
        • 2017-10-20
        • 2014-01-25
        相关资源
        最近更新 更多