当使用 DBI 启用 SQL 跟踪时,如何防止语句被多次输出?

How can I prevent statements from being output multiple times when SQL tracing is enabled with DBI?

像这样使用 DBI I enable trace 连接到 MySQL 数据库后

$dbh->trace('SQL|DBD');

然后我的 SQL 查询被打印两次:

>count_params statement SELECT table1.ID ID, table1.LinkID LinkID, Link.ID Link_ID FROM `table1` `table1` JOIN `table2` `Link` ON `table1`.`LinkID` = `Link`.`ID` WHERE table1.ID = ?
>parse_params statement SELECT table1.ID ID, table1.LinkID LinkID, Link.ID Link_ID FROM `table1` `table1` JOIN `table2` `Link` ON `table1`.`LinkID` = `Link`.`ID` WHERE table1.ID = ?

如何只打印每个执行的 SQL 语句一次?

How can I print every executed SQL statement only once?

你不能。 count_paramsparse_params 是 DBD::mysql 用来在客户端模拟准备好的语句的内部函数。当您执行准备好的语句时,两者都会被调用。

count_params 在准备好包含以下内容的语句时调用:

if (DBIc_DBISTATE(imp_xxh)->debug >= 2)
  PerlIO_printf(DBIc_LOGPIO(imp_xxh), ">count_params statement %s\n", statement);

parse_params 在执行语句时调用,包含以下内容:

if (DBIc_DBISTATE(imp_xxh)->debug >= 2)
  PerlIO_printf(DBIc_LOGPIO(imp_xxh), ">parse_params statement %s\n", statement);

两者的逻辑是一样的,要么全有要么全无。