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->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)