libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为

Posted

技术标签:

【中文标题】libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为【英文标题】:Correct behavior of libpq's PQexecPrepared and SQL EXECUTE 【发布时间】:2018-06-12 16:56:24 【问题描述】:

看起来,使用 postgres,有两种方法可以准备和执行准备好的语句。您可以直接从libpq 使用函数PQpreparePQexecPrepared;或者您可以发出 SQL 语句:PREPAREEXECUTE。两种方法中的语句名称相同,因此您可以使用PQPrepare 准备一个语句,然后通过发出EXECUTE 查询来执行它(或使用PREPARE 查询然后用PQexecPrepared 执行它)。

所以这两种方法(库函数与 SQL 查询)是等价的。但是,看起来当您使用PQexecPrepared 时,pg_stat_activityquery 列是带有占位符的基础准备好的语句。所以像:

SELECT * from users where name in ($1, $2, $3);

但是当你使用EXECUTE查询时,pg_stat_activity包含EXECUTE的SQL,比如:

EXECUTE user_query('joe', 'bob', 'sally');

问题

    有没有办法让两种不同的执行预准备语句的方式获得相同的输出? 有没有办法在执行预准备语句时同时查看查询和绑定参数?

【问题讨论】:

【参考方案1】:

您是对的,两种执行预准备语句的方式在后台执行相同的操作,但由于它们在 SQL 级别上以不同的方式调用,因此它们在 pg_stat_activity 中看起来不同。没有办法改变它。

要获得语句你必须求助于日志文件的参数。

PQexecPrepared 的情况下,如果您打开语句日志记录,您将看到该语句为LOG 消息,参数为它的DETAIL

使用PREPAREEXECUTE,您别无选择,只能在会话的早期找到PREPARE(两者具有相同的会话标识符,即log_line_prefix 中的%c)。

【讨论】:

以上是关于libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL libpq 客户端接口

Windows 上的 libpq 速度

我在哪里可以获得 libpq 源?

如何安装 libpq-fe.h?

安装 libpq-dev 包报错

libpq VS qpsql(postgre 的 QT 驱动程序)