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

6

这是来自 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->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')'处使用正确的语法

有时这确实有帮助。至少对我有帮助。

3个回答

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

谢谢您指出正确的方向。不过我还想指出我的补充在原帖中。 - w.k

1

没有标准的方法来做到这一点。最接近的近似方法是通过(可能带引号的)值替换每个占位符。通常,可靠地解析SQL语句以查找作为占位符而不是定界标识符、字符串或注释部分的问号是相当困难的。在这个例子中,你可以简单地寻找问号;但这并不总是有效的:

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

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

0

我认为没有通用支持的DBI方法可以做到这一点,但是个别数据库驱动程序可能允许它。你使用的是哪种数据库?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接