原文: PostgreSQL 13: psql客户端提示符新增%x变量显示事务状态
PostgreSQL 13 版本的psql
客户端提示符新增%x
变量显示事务状态,手册说明如下:
手册说明
Add the transaction status (%x) to the default psql prompts (Vik Fearing)
关于%x
psql
命令中关于%x
变量的解说如下:
%x
Transaction status: an empty string when not in a transaction block, or * when in a transaction block,
or ! when in a failed transaction block, or ? when the transaction state is indeterminate (for example, because there is no connection).
psql
命令中%x
变量值为以下: - 如果没在事务中,显示空字符 - 如果在事务中,显示* - 当事务失败,显示! - 当事务状态不确定,显示?
为了更好理解以上内容,先来看看psql
的Prompting
。
关于Prompting
Prompting
是指psql
的客户端提示符,有三个变量:PROMPT1, PROMPT2, ROMPT3
,具体为以下:
- PROMPT1: 当
psql
等待新命令发出时的常规提示符,PROMPT1最常见。 - PROMPT2: 在命令输入过程中等待更多输入时发出的提示符,例如当命令没有使用分号终止或者引用没有被关闭时就会发出这个提示符。
- PROMPT3: 在运行一个
COPY FROM STDIN
命令,并且需要在终端上输入一个行值时发出的提示符。
PROMPT2
的默认设置值与PROMPT1
一样,默认值都为%/%R%#
,这三个字符的解释如下:
- %/: 当前的数据库名称。
- %R:
PROMPT1
通常为=,如果会话断开,则显示!;PROMPT2
中-表示命令等待更多输入,*表示未完成的注释,更多符号解释参考手册。 - %#: 如果是超级用户则显示#,其他用户显示>,在数据库会话期间,这个值可能因为命令
SET SESSION AUTHORIZATION
的结果而改变。
PostgreSQL 12 版本的PROMPT1
示例如下:
[pg12@ydtf02 ~]$ psql
psql (12.2)
Type "help" for help.
postgres=# SELECT version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 12.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)
postgres=#
PROMPT3默认值显示为>>
字符,本文不做详细介绍。
PostgreSQL 13 %x 演示
PostgreSQL 12或之前版本PROMPT1
和PROMPT2
的默认值为%/%R%#
,PostgreSQL 13 版本的PROMPT1
和PROMPT2
中新增了%x
变量,具体为%/%R%x%#
。
PostgreSQL 13 版本的PROMPT1
示例如下:
示例一: 没在事务中
[pg13@ydtf01 ~]$ psql
psql (13beta1)
Type "help" for help.
postgres=#
没在时务中时,%x
变量为空,这种情况下13版本和12版本的PROMPT1
无差异。
示例二:在事务中
[pg13@ydtf01 ~]$ psql
psql (13beta1)
Type "help" for help.
postgres=# BEGIN;
BEGIN
postgres=*# SELECT now();
now
-------------------------------
2020-07-12 19:56:43.312297+08
在事务中时,%x
变量显示为*
字符。
示例三: 事务失败
[pg13@ydtf01 ~]$ psql
psql (13beta1)
Type "help" for help.
postgres=# BEGIN;
BEGIN
postgres=*# SELECT now();
now
-------------------------------
2020-07-12 19:57:57.753642+08
(1 row)
postgres=*# hello;
ERROR: syntax error at or near "hello"
LINE 1: hello;
^
postgres=!#
事务失败时,%x
变量显示为!
字符。
参考
- PostgreSQL 13 psql prompts
- PostgreSQL 12 psql prompts
- Waiting for PostgreSQL 13 – Add %x to default PROMPT1 and PROMPT2 in psq