Perl DBI:如何使用绑定值查看失败的查询?

Posted

技术标签:

【中文标题】Perl DBI:如何使用绑定值查看失败的查询?【英文标题】:Perl DBI: how to see failed query with bound values? 【发布时间】: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 行

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

【问题讨论】:

【参考方案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 方法可以做到这一点,但个别数据库驱动程序可能允许这样做。你用的是什么数据库?

【讨论】:

以上是关于Perl DBI:如何使用绑定值查看失败的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何打印 Perl 的 DBI 填充占位符后执行的 SQL 查询?

如何检查 Perl 中的 DBI 查询是不是返回了多个记录?

Perl DBI Sybase Asanywhere 绑定变量问题

如何查询某些行的sqlite,即将它分成页面(perl DBI)

如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?

Perl 执行 DBI 循环执行