libpq 的 PQexecPrepared 和 SQL EXECUTE 的正确行为
Correct behavior of libpq's PQexecPrepared and SQL EXECUTE
看起来像postgres,有两种方法来准备和执行准备好的语句。您可以直接从 libpq
使用函数 PQprepare
and PQexecPrepared
;或者您可以发出 SQL 语句:PREPARE
和 EXECUTE
。两种方法中的语句名称相同,因此您可以使用 PQPrepare
准备语句,然后通过发出 EXECUTE
查询来执行它(或使用 PREPARE
查询,然后使用PQexecPrepared
).
所以这两种方法(库函数 vs SQL 查询)是等价的。但是,当您使用 PQexecPrepared
时,pg_stat_activity
的 query
列似乎是带有占位符的基础准备语句。所以像:
SELECT * from users where name in (, , );
但是当您使用 EXECUTE
查询时,pg_stat_activity
包含 EXECUTE
的 SQL,例如:
EXECUTE user_query('joe', 'bob', 'sally');
问题
- 有没有办法让两种不同的预处理语句执行方式得到相同的输出?
- 有没有办法在执行准备语句时同时查看查询和绑定参数?
你是对的,两种执行准备好的语句的方式在幕后做同样的事情,但由于它们在 SQL 级别上以不同的方式被调用,它们在 pg_stat_activity
中看起来不同.没有办法改变它。
要获取语句 和 参数,您必须求助于日志文件。
在 PQexecPrepared
的情况下,如果您打开语句日志记录,您将看到作为 LOG
消息的语句和作为其 DETAIL
的参数。
对于 PREPARE
和 EXECUTE
,您别无选择,只能在会话中更早地找到 PREPARE
(两者具有相同的会话标识符,即 %c
在 log_line_prefix
).
看起来像postgres,有两种方法来准备和执行准备好的语句。您可以直接从 libpq
使用函数 PQprepare
and PQexecPrepared
;或者您可以发出 SQL 语句:PREPARE
和 EXECUTE
。两种方法中的语句名称相同,因此您可以使用 PQPrepare
准备语句,然后通过发出 EXECUTE
查询来执行它(或使用 PREPARE
查询,然后使用PQexecPrepared
).
所以这两种方法(库函数 vs SQL 查询)是等价的。但是,当您使用 PQexecPrepared
时,pg_stat_activity
的 query
列似乎是带有占位符的基础准备语句。所以像:
SELECT * from users where name in (, , );
但是当您使用 EXECUTE
查询时,pg_stat_activity
包含 EXECUTE
的 SQL,例如:
EXECUTE user_query('joe', 'bob', 'sally');
问题
- 有没有办法让两种不同的预处理语句执行方式得到相同的输出?
- 有没有办法在执行准备语句时同时查看查询和绑定参数?
你是对的,两种执行准备好的语句的方式在幕后做同样的事情,但由于它们在 SQL 级别上以不同的方式被调用,它们在 pg_stat_activity
中看起来不同.没有办法改变它。
要获取语句 和 参数,您必须求助于日志文件。
在 PQexecPrepared
的情况下,如果您打开语句日志记录,您将看到作为 LOG
消息的语句和作为其 DETAIL
的参数。
对于 PREPARE
和 EXECUTE
,您别无选择,只能在会话中更早地找到 PREPARE
(两者具有相同的会话标识符,即 %c
在 log_line_prefix
).