psql
13.2 无论如何在退出编辑器时都会执行查询缓冲区,即使在退出编辑器之后也是如此 - 在这种情况下,缓冲区现在可能会保存最近执行的 SQL 查询。
重现:
- 使用控制台或从控制台启动编辑器(
vim
在我的情况下) 。\e
\e filename
psql
- 输入或不输入,没有区别。
- 取消编辑
:q
(或:q!
强制)
预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。
似乎发生了什么\e
:
它执行 (相当于)
\p
,因此当前查询缓冲区在它为空时包含上一个命令。(编辑文件时用户看不到!) 手册\p
:\p
或者\print
将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。
启动编辑器。如果提供了文件名,则加载文件,否则,加载查询缓冲区。
如果编辑器以写入结束,则将结果复制到查询缓冲区。
如果编辑被取消(:q
在 vim 中),不要覆盖查询缓冲区。(它现在保存上一个命令!)执行查询缓冲区。或者,准确地说,执行以下操作:
该行为似乎可以\p
(只需复制查询缓冲区,不会造成伤害),但不适用于\e
,它可以执行我什至没有看到的命令。
它是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎是不可能的。还是我错过了什么?
作为对此问题的回应,这已在 v14 中得到修复。答案的其余部分指的是 v14 之前的行为:
这是(某种)记录在案的:
如果您在不保存的情况下退出编辑器,则会执行当前查询缓冲区或最近执行的查询。
我同意你的看法,这很烦人,而且你不是我第一个听到抱怨的人。
在编辑脚本时,这种行为显然违反了“最小惊讶原则”: