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

aid*_*dan 17 mysql sql perl prepared-statement dbi

我正在使用Perl的DBI模块.我使用占位符准备一个语句,然后执行查询.

是否可以打印出执行的最终查询而无需手动转义参数并将其放入占位符?

谢谢

Sin*_*nür 16

请参阅DBI中的跟踪.以下工作使用DBD::SQLite但产生了大量输出:

$dbh->trace($dbh->parse_trace_flags('SQL|1|test'));
Run Code Online (Sandbox Code Playgroud)

输出:

<- prepare('SELECT ... FROM ... WHERE ... = ?')= DBI::st=HASH(0x21ee924) at booklet-excel.pl line 213

<- execute('Inhaler')= '0E0' at booklet-excel.pl line 215

等等

您可以将自己的过滤器插入到跟踪流中以仅保留prepares.


mas*_*sto 10

不一般,因为DBI不一定产生这样的查询.如果您的数据库在其API中支持预处理语句和占位符,则DBI将传递它们并让数据库完成工作,这是使用预准备语句的原因之一.


Upe*_*dra 10

您可以使用Statement属性对准备语句进行调试打印.可以使用"语句句柄"或"数据库句柄"访问它.

print $sth->{Statement} # with a statement handle

print $dbh->{Statement} # with a database handle
Run Code Online (Sandbox Code Playgroud)

  • 可以使用`print Dumper($ statement_handle-&gt; {'ParamValues'});`分别打印绑定参数-可能足以调试大多数查询。 (2认同)

rjh*_*rjh 5

这适用于DBD::mysql禁用服务器端准备(默认)的情况:

$ DBI_TRACE=2 perl your-script-here
Run Code Online (Sandbox Code Playgroud)

它会将每个语句打印两次,一次在绑定参数之前,一次在绑定参数之后。后者将是格式良好的 SQL,您可以自己运行。

还有一个模块DBI::Log,它仅打印 SQL 语句(没有其他调试噪音)以及可选的计时信息和调用者堆栈跟踪。这真的很有用。