【发布时间】:2016-12-08 14:29:23
【问题描述】:
我正在使用一个数据库工具(Elixir's Ecto),它使用prepared statements 进行大多数 PostgreSQL 查询。我想看看它是如何以及何时这样做的。
我通过在psql 中运行SHOW config_file; 找到了正确的Postgres 配置文件postgresql.conf。我对其进行了编辑以包含
log_statement = 'all'
正如 Dogbert 建议的 here。
根据the PostgreSQL 9.6 docs,此设置应导致PREPARE 语句被记录。
重启 PostgreSQL 后,我可以 tail -f 其日志文件(运行 postgres 可执行文件时由 -r 标志指定的文件),我确实看到了这样的条目:
LOG: execute ecto_728: SELECT i0."id", i0."store_id", i0."title", i0."description"
FROM "items" AS i0 WHERE (i0."description" LIKE $1)
DETAIL: parameters: $1 = '%foo%'
这对应于一个查询(尽管我认为是通过二进制协议完成的)
EXECUTE ecto_728('%foo%');
但是,我没有看到创建 ecto_728 的原始 PREPARE。
我尝试删除并重新创建数据库。之后,同样的查询被执行为ecto_578,所以看起来原来的prepared statement与数据库一起被删除并创建了一个新的。
但是当我在 PostgreSQL 日志中搜索 ecto_578 时,我只看到它正在执行,而不是创建。
如何在 PostgreSQL 日志中查看 PREPARE 语句?
【问题讨论】:
-
为什么,出于兴趣?无论如何,您在执行时都会看到查询文本。
-
@CraigRinger 没有实际原因。 :) 我只是想了解我正在使用的工具。例如,我很好奇 Ecto 是否在编译我的代码或启动应用程序时执行
PREPARE。我想我可以在 PostgreSQL 未运行时尝试编译,看看会发生什么。 -
原来它在给定会话中第一次执行查询之前执行
PREPARE,因为"a named prepared-statement object lasts till the end of the current session"所以真的没有其他方法可以做到这一点。
标签: postgresql