是否可以使用 psql(cli 工具)输入 运行 事务?

Is it possible enter a running transaction using psql (the cli tool)?

我 运行 使用事务对数据库进行调试器测试。 有时,当我遇到断点时,我想使用我的测试当前正在使用的相同事务在数据库中四处查看,看看它的代码看到了什么。 我知道,我可以通过调试器访问数据库,但一些直接的 SQL 有时会不那么复杂。

这有可能吗?

这是一个合理的愿望,它可能很方便,但在 PostgreSQL 中没有办法做到这一点。

您可以检查 pg_stat_activity table 以查看当前正在处理的所有查询。使用正确的权限,您还可以列出 pg_temp 模式的内容并查看创建了哪些临时对象以及它们的一些元数据。您可以让您的代码将标记和其他信息注入查询中的注释中,这样您就可以 link 将 pg_stat_activity 中看到的查询发送到特定的工作进程。

但是您不能劫持会话或检查属于其他会话的 pg_temp 模式中的 tables 的内容,即使具有更高的权限 - 我认为这是有意维护的技术限制。

如果您正在使用 PL/pgSQL,您可以修改您的函数以在某处保存调试信息。 对于测试运行,您还可以从 temp tables 切换到 unlogged tables 这将为您提供几乎相同的性能,但不会在会话结束。请记住,它可能会导致冲突:如果两个或多个会话曾经各自独立运行 temp table,在切换到 unlogged 之后,它们将不得不使用不同的名称或模式.