↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 命令行工具 / 客户端程序

psql

psql — PostgreSQL 的交互式终端

当前查看 PostgreSQL 18.6。

说明

psql — PostgreSQL 的交互式终端

手册中的可执行程序
psql
程序版本
18.6
参考清单
客户端程序
选项定义组
35

用法

psql [ option ...] [ dbname [ username ]]

手册中的选项

选项与参数说明
-a --echo-all在读入时将所有非空输入行打印到标准输出(不适用于交互式行读取)。这等效于把变量 ECHO 设置为 all 。
-A --no-align切换到非对齐输出模式(默认输出模式是 aligned )。这等效于 \pset format unaligned 。
-b --echo-errors把失败的 SQL 命令打印到标准错误输出。这等效于把变量 ECHO 设置为 errors 。
-c command --command= command指定 psql 执行一个给定的命令字符串 command 。这个选项可以重复多次并且以任何顺序与 -f 选项组合在一起。当 -c 或者 -f 被指定时, psql 不会从标准输入读取命令,而是在按顺序处理完所有 -c 和 -f 选项后终止。
--csv切换到 CSV (逗号分隔值)输出模式。这相当于 \pset format csv 。
-d dbname --dbname= dbname指定要连接的数据库的名称。这等效于指定 dbname 为命令行上的第一个非选项参数。 dbname 可以是 连接字符串 。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-e --echo-queries也把发送到服务器的所有 SQL 命令复制到标准输出。这等效于把变量 ECHO 设置为 queries 。
-E --echo-hidden回显 \d 以及其他反斜线命令生成的实际查询。可以用它来学习 psql 的内部操作。这等效于把变量 ECHO_HIDDEN 设置为 on 。
-f filename --file= filename从文件 filename 而不是标准输入中读取命令。这个选项可以重复指定,也可以按任意顺序与 -c 选项组合使用。当指定了 -c 或 -f 时, psql 不会从标准输入读取命令,而是在按顺序处理完所有 -c 和 -f 选项后终止。除此之外,这个选项在很大程度上等价于元命令 \i 。
-F separator --field-separator= separator使用 separator 作为非对齐输出的字段分隔符。这等效于 \pset fieldsep 或者 \f 。
-h hostname --host= hostname指定服务器所在机器的主机名。如果值以斜杠开头,则被用作 Unix 域套接字的目录。
-H --html切换到 HTML 输出模式。这等效于 \pset format html 或者 \H 命令。
-l --list列出所有可用的数据库,然后退出。其他非连接选项会被忽略。这与元命令 \list 类似。
-L filename --log-file= filename除了把所有查询输出写到普通输出目标之外,还写到文件 filename 中。
-n --no-readline不要使用 Readline 进行行编辑,也不要使用命令历史记录(请参见下面的 “命令行编辑”一节 )。
-o filename --output= filename把所有查询输出放到文件 filename 中。这等效于命令 \o 。
-p port --port= port指定服务器监听连接的 TCP 端口,或本地 Unix 域套接字的文件名后缀。默认使用 PGPORT 环境变量的值;未设置时,使用编译时指定的端口,通常为 5432。
-P assignment --pset= assignment以 \pset 的形式指定打印选项。注意,这里你必须用一个等号而不是空格来分隔名称和值。例如,要设置输出格式为 LaTeX ,应该写成 -P format=latex 。
-q --quiet指定 psql 应该安静地工作。默认情况下,它会打印出欢迎消息和各种提示信息。如果使用了这个选项,以上那些就都不会输出。在使用 -c 选项时,配合这个选项很有用。这等效于设置变量 QUIET 为 on 。
-R separator --record-separator= separator把 separator 用作非对齐输出的记录分隔符。这等效于 \pset recordsep 命令。
-s --single-step运行在单步模式中。这意味着在每个命令被发送给服务器之前都会提示用户,并允许取消执行。使用这个选项可以调试脚本。
-S --single-line运行在单行模式中,其中换行符会终止一个 SQL 命令,就像分号的作用一样。
-t --tuples-only关闭打印列名和结果行计数页脚等。这等效于 \t 或者 \pset tuples_only 命令。
-T table_options --table-attr= table_options指定要放在 HTML table 标签内的选项。详见 \pset tableattr 。
-U username --username= username作为用户 username 而不是默认用户连接到数据库(当然,你必须具有这样做的权限)。
-v assignment --set= assignment --variable= assignment执行一次变量赋值,和 \set 元命令相似。注意你必须在命令行上用等号分隔名字和值(如果有)。要取消变量的设置,去掉等号就行。要把一个变量设为空字符串,使用等号但是去掉值。这些赋值在命令行处理期间被完成,因此反映连接状态的变量将在稍后被覆盖。
-V --version打印 psql 版本并且退出。
-w --no-password永不发出密码提示。如果服务器要求密码认证,而密码又无法从其他来源获得,例如 .pgpass 文件,则连接尝试将失败。这个选项对于批处理任务和脚本很有用,因为那时通常没有用户在场输入密码。
-W --password强制 psql 在连接数据库之前提示输入密码,即使该密码实际上不会被使用。
-x --expanded打开扩展表格式模式。这等效于 \x 或者 \pset expanded 命令。
-X --no-psqlrc不读取启动文件(既不读取系统范围的 psqlrc 文件,也不读取用户的 ~/.psqlrc 文件)。
-z --field-separator-zero设置非对齐输出的字段分隔符为零字节。这等效于 \pset fieldsep_zero 。
-0 --record-separator-zero设置非对齐输出的记录分隔符为零字节。例如,这有助于与 xargs -0 配合使用。这等效于 \pset recordsep_zero 。
-1 --single-transaction这个选项只能与一个或多个 -c 和/或 -f 选项结合使用。它会导致 psql 在第一个这样的选项之前发出一个 BEGIN 命令,并在最后一个选项之后发出一个 COMMIT 命令,从而将所有命令包装成一个单独的事务。如果任何命令失败且变量 ON_ERROR_STOP 被设置,则会改为发送一个 ROLLBACK 命令。这确保要么所有命令都成功完成,要么不应用任何更改。
-? --help[= topic ]显示有关 psql 的帮助并且退出。可选的 topic 参数(默认为 options )选择要解释 psql 的哪一部分: commands 描述 psql 的反斜线命令; options 描述可以被传递给 psql 的命令行选项;而 variables 则显示有关 psql 配置变量的帮助。

环境变量

变量含义
COLUMNS如果 \pset columns 为零,这个环境变量控制用于 wrapped 格式的宽度以及用来确定较宽的输出是否需要分页器,或者是否应切换到扩展自动模式中的垂直格式的宽度。
PGDATABASE PGHOST PGPORT PGUSER默认连接参数(见 第 32.15 节 )。
PG_COLOR指定诊断消息是否使用颜色。可选值为 always 、 auto 和 never 。
PSQL_EDITOR EDITOR VISUAL\e 、 \ef 以及 \ev 命令所使用的编辑器。会按照列出的顺序检查这些变量,第一个被设置的将被使用。如果都没有被设置,默认是使用Unix系统上的 vi 或者Windows系统上的 notepad.exe 。
PSQL_EDITOR_LINENUMBER_ARG当 \e 、 \ef 或 \ev 带有行号参数使用时,此变量指定将起始行号传给用户编辑器时所用的命令行参数。对于 Emacs 或 vi 之类的编辑器,这个参数是一个加号。如果选项名和行号之间需要空格,请在变量值中包含末尾空格。例如: PSQL_EDITOR_LINENUMBER_ARG='+' PSQL_EDITOR_LINENUMBER_ARG='--line ' 在 Unix 系统上默认是 + (对应于默认编辑器 vi ,且对很多其他常见编辑器可用)。在 Windows 系统上没有默认值。
PSQL_HISTORY命令历史文件的替代位置。波浪线( ~ )扩展会被执行。
PSQL_PAGER PAGER如果查询结果无法在屏幕上显示完整,它们会通过管道传给此命令。典型的值是 more 或 less 。可以通过将 PSQL_PAGER 或 PAGER 设置为空字符串,或通过调整 \pset 命令的与分页相关的选项来禁用分页器。这些变量按照列出的顺序进行检查;使用按该顺序找到的第一个已设置的变量。如果它们都没有设置,默认情况下在大多数平台上使用 more ,但在Cygwin上使用 less 。
PSQL_WATCH_PAGER使用 \watch 命令反复执行查询时,默认不使用分页程序。在 Unix 系统上,可以将 PSQL_WATCH_PAGER 设为分页程序命令来改变此行为。pspg 分页程序(不属于 PostgreSQL,但许多开源软件发行版都提供它)以 --stream 选项启动时,可以显示 \watch 的输出。
PSQLRC用户的 .psqlrc 文件的替代位置。波浪线( ~ )扩展会被执行。
SHELL被 \! 命令执行的命令。
TMPDIR存储临时文件的目录。默认是 /tmp 。

手册定义

psql

psql — PostgreSQL的交互式终端

大纲

psql [option...] [dbname [username]]

说明

psql是PostgreSQL的一个基于终端的前端。它使你能够交互式地输入查询,将其发送给PostgreSQL,并查看查询结果。也可以从文件或命令行参数提供输入。此外,psql还提供了若干元命令和多种类似 shell 的特性,以便于编写脚本和自动化执行各种任务。

选项

-a
--echo-all

在读入时将所有非空输入行打印到标准输出(不适用于交互式行读取)。这等效于把变量ECHO设置为 all。

-A
--no-align

切换到非对齐输出模式(默认输出模式是aligned)。这等效于\pset format unaligned。

-b
--echo-errors

把失败的 SQL 命令打印到标准错误输出。这等效于把变量ECHO设置为errors。

-c command
--command=command

指定psql执行一个给定的命令字符串command。这个选项可以重复多次并且以任何顺序与-f选项组合在一起。当-c或者-f被指定时,psql不会从标准输入读取命令,而是在按顺序处理完所有-c和-f选项后终止。

command必须是一个服务器完全可解析的命令字符串(即不包含psql专有的特性)或者单个反斜线命令。因此不能在一个-c选项中混合SQL和psql元命令。要那样做,可以使用多个-c选项或者把字符串用管道输送到psql中,例如:

psql -c '\x' -c 'SELECT * FROM foo;'

或者

echo '\x \\ SELECT * FROM foo;' | psql

(\\是分隔符元命令)。

每个SQL命令字符串传递给-c都作为一个单独的请求发送到服务器。因此,即使字符串包含多个SQL命令,服务器也会将其作为单个事务执行,除非字符串中包含明确的BEGIN/COMMIT命令将其分成多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参见第 54.2.2.1 节。)

如果不希望在一个事务中执行多个命令,可以使用重复的-c命令,或将多个命令输入到psql的标准输入,可以像上面示例中使用echo,也可以通过shell的here-document,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF
--csv

切换到CSV(逗号分隔值)输出模式。这相当于\pset format csv。

-d dbname
--dbname=dbname

指定要连接的数据库的名称。这等效于指定dbname为命令行上的第一个非选项参数。dbname 可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--echo-queries

也把发送到服务器的所有 SQL 命令复制到标准输出。这等效于把变量ECHO设置为queries。

-E
--echo-hidden

回显\d以及其他反斜线命令生成的实际查询。可以用它来学习psql的内部操作。这等效于把变量ECHO_HIDDEN设置为on。

-f filename
--file=filename

从文件filename而不是标准输入中读取命令。这个选项可以重复指定,也可以按任意顺序与-c选项组合使用。当指定了-c或-f时,psql不会从标准输入读取命令,而是在按顺序处理完所有-c和-f选项后终止。除此之外,这个选项在很大程度上等价于元命令\i。

如果filename是-(连字符),则会读取标准输入,直到遇到 EOF 指示或\q元命令。这可用于将交互式输入与文件输入交错使用。不过请注意,这种情况下不会使用 Readline(很像指定了-n时的情况)。

使用这个选项与写成psql < filename有细微差别。通常两种形式都会得到你期望的结果,但使用-f可以启用一些有用的特性,例如带行号的错误消息。使用这个选项也还有一点机会降低启动开销。另一方面,使用 shell 输入重定向的形式在理论上能保证得到与你手工逐行输入时完全相同的输出。

-F separator
--field-separator=separator

使用separator作为非对齐输出的字段分隔符。这等效于\pset fieldsep或者\f。

-h hostname
--host=hostname

指定服务器所在机器的主机名。如果值以斜杠开头,则被用作 Unix 域套接字的目录。

-H
--html

切换到HTML输出模式。这等效于\pset format html或者\H命令。

-l
--list

列出所有可用的数据库,然后退出。其他非连接选项会被忽略。这与元命令\list类似。

使用该选项时,psql将连接到数据库postgres,除非命令行上指定了其他数据库(通过-d选项或非选项参数,也可能通过服务项,但不能通过环境变量)。

-L filename
--log-file=filename

除了把所有查询输出写到普通输出目标之外,还写到文件filename中。

-n
--no-readline

不要使用Readline进行行编辑,也不要使用命令历史记录(请参见下面的“命令行编辑”一节)。

-o filename
--output=filename

把所有查询输出放到文件filename中。这等效于命令\o。

-p port
--port=port

指定服务器监听连接的 TCP 端口,或本地 Unix 域套接字的文件名后缀。默认使用 PGPORT 环境变量的值;未设置时,使用编译时指定的端口,通常为 5432。

-P assignment
--pset=assignment

以\pset的形式指定打印选项。注意,这里你必须用一个等号而不是空格来分隔名称和值。例如,要设置输出格式为LaTeX,应该写成-P format=latex。

-q
--quiet

指定psql应该安静地工作。默认情况下,它会打印出欢迎消息和各种提示信息。如果使用了这个选项,以上那些就都不会输出。在使用-c选项时,配合这个选项很有用。这等效于设置变量QUIET为on。

-R separator
--record-separator=separator

把separator用作非对齐输出的记录分隔符。这等效于\pset recordsep命令。

-s
--single-step

运行在单步模式中。这意味着在每个命令被发送给服务器之前都会提示用户,并允许取消执行。使用这个选项可以调试脚本。

-S
--single-line

运行在单行模式中,其中换行符会终止一个 SQL 命令,就像分号的作用一样。

注意

这种模式是为坚持使用它的用户提供的,但并不一定值得推荐。特别是,如果在一行中混合了SQL和元命令,对于没有经验的用户来说,它们的执行顺序未必总是清楚的。

-t
--tuples-only

关闭打印列名和结果行计数页脚等。这等效于\t或者\pset tuples_only命令。

-T table_options
--table-attr=table_options

指定要放在HTML table标签内的选项。详见\pset tableattr。

-U username
--username=username

作为用户username而不是默认用户连接到数据库(当然,你必须具有这样做的权限)。

-v assignment
--set=assignment
--variable=assignment

执行一次变量赋值,和\set元命令相似。注意你必须在命令行上用等号分隔名字和值(如果有)。要取消变量的设置,去掉等号就行。要把一个变量设为空字符串,使用等号但是去掉值。这些赋值在命令行处理期间被完成,因此反映连接状态的变量将在稍后被覆盖。

-V
--version

打印psql版本并且退出。

-w
--no-password

永不发出密码提示。如果服务器要求密码认证,而密码又无法从其他来源获得,例如.pgpass文件,则连接尝试将失败。这个选项对于批处理任务和脚本很有用,因为那时通常没有用户在场输入密码。

请注意,这个选项在整个会话期间都会保持生效,因此它不仅影响初始连接尝试,也会影响元命令\connect。

-W
--password

强制psql在连接数据库之前提示输入密码,即使该密码实际上不会被使用。

如果服务器要求密码认证,而密码又无法从其他来源获得,例如.pgpass文件,则psql无论如何都会提示输入密码。不过,psql需要先浪费一次连接尝试,才能知道服务器要求密码。在某些情况下,显式指定-W值得用来避免这次额外的连接尝试。

请注意,这个选项在整个会话期间都会保持生效,因此它不仅影响初始连接尝试,也会影响元命令\connect。

-x
--expanded

打开扩展表格式模式。这等效于\x或者\pset expanded命令。

-X
--no-psqlrc

不读取启动文件(既不读取系统范围的psqlrc文件,也不读取用户的~/.psqlrc文件)。

-z
--field-separator-zero

设置非对齐输出的字段分隔符为零字节。这等效于\pset fieldsep_zero。

-0
--record-separator-zero

设置非对齐输出的记录分隔符为零字节。例如,这有助于与xargs -0配合使用。这等效于\pset recordsep_zero。

-1
--single-transaction

这个选项只能与一个或多个-c和/或-f选项结合使用。它会导致psql在第一个这样的选项之前发出一个BEGIN命令,并在最后一个选项之后发出一个COMMIT命令,从而将所有命令包装成一个单独的事务。如果任何命令失败且变量ON_ERROR_STOP被设置,则会改为发送一个ROLLBACK命令。这确保要么所有命令都成功完成,要么不应用任何更改。

如果命令本身包含BEGIN、COMMIT或ROLLBACK,这个选项就不会产生期望的效果。另外,如果某个单独命令不能在事务块中执行,指定这个选项将导致整个事务失败。

-?
--help[=topic]

显示有关psql的帮助并且退出。可选的topic参数(默认为options)选择要解释psql的哪一部分:commands描述psql的反斜线命令;options描述可以被传递给psql的命令行选项;而variables则显示有关psql配置变量的帮助。

退出状态

如果psql正常结束,它会向 shell 返回 0;如果它自身发生致命错误(例如内存耗尽、找不到文件),则返回 1;如果到服务器的连接发生故障且该会话不是交互式的,则返回 2;如果脚本中发生错误且变量ON_ERROR_STOP已设置,则返回 3。

用法

连接到数据库

psql 是常规的 PostgreSQL 客户端应用程序。要连接到数据库,你需要知道目标数据库名称、服务器的主机名和端口号,以及要以哪个数据库用户名连接。psql 可以通过命令行选项 -d、-h、-p 和 -U 分别指定这些参数。如果遇到一个不属于任何选项的参数,它将被解释为数据库名(如果数据库名已经给出,则解释为数据库用户名)。并非所有这些选项都是必需的;它们都有有用的默认值。如果省略主机名,psql 在 Unix 上将通过 Unix 域套接字连接到本地主机上的服务器,在 Windows 上则通过 TCP/IP 连接到 localhost。默认端口号在编译时确定。由于数据库服务器使用相同的默认值,因此在大多数情况下不必指定端口。默认数据库用户名是你的操作系统用户名。数据库用户名确定后,它也会被用作默认数据库名。请注意,你不能随意以任意数据库用户名连接到任意数据库。数据库管理员应当已经告知你拥有的访问权限。

当默认值不完全合适时,可以通过把环境变量PGDATABASE、PGHOST、PGPORT和PGUSER设置为适当的值来少敲一些键盘(额外的环境变量见第 32.15 节)。另外,准备一个~/.pgpass文件也很方便,这样就不必经常手工输入密码。详见第 32.16 节。

另一种指定连接参数的方法是使用 conninfo 字符串或 URI 来代替数据库名。此机制允许对连接进行非常广泛的控制。例如:

$ psql "service=myservice sslmode=require"
$ psql postgresql://dbmaster:5433/mydb?sslmode=require

用这种方式,你也可以把LDAP用于第 32.18 节中描述的连接参数查找。可用连接选项的更多信息请见第 32.1.2 节。

如果由于任何原因(例如权限不足、服务器没有在目标主机上运行等)导致连接无法建立,psql将返回一个错误并且终止。

如果标准输入和标准输出都是终端,那么psql会把客户端编码设置为“auto”,从区域设置中检测合适的客户端编码(在 Unix 系统上是LC_CTYPE环境变量)。如果结果不符合预期,可以使用环境变量PGCLIENTENCODING覆盖客户端编码。

输入 SQL 命令

在正常操作时,psql会提供一个提示符,该提示符是psql当前连接到的数据库名称后面跟上字符串=>。例如:

$ psql testdb
psql (18.6)
Type "help" for help.

testdb=>

在提示符下,用户可以输入SQL命令。通常,当遇到表示命令结束的分号时,输入的内容就会被发送给服务器。行结束并不会终止一条命令,因此为了提高清晰度,命令可以分布在多行上。如果命令被发送并成功执行,其结果就会显示在屏幕上。

如果不受信任的用户能够访问尚未采用模式的安全使用方式的数据库,请在会话开始时从search_path中移除所有公众可写的模式。可以在连接字符串中加入options=-csearch_path=,或者在执行其他 SQL 命令之前发出SELECT pg_catalog.set_config('search_path', '', false)。这种考虑并非psql特有;它适用于任何执行任意 SQL 命令的接口。

每当执行命令时,psql也会轮询由LISTEN和NOTIFY生成的异步通知事件。

虽然 C 风格的块注释会被传给服务器处理并移除,但 SQL 标准注释会由psql自行移除。

元命令

你输入到psql中的任何以未加引号的反斜线开始的东西都是一个psql元命令,它们由psql自行处理。这些命令让psql对管理和编写脚本更有用。元命令常常被称作斜线或者反斜线命令。

psql命令的格式是用反斜线后面直接跟上一个命令动词,然后是一些参数。参数与命令动词和其他参数之间用任意多个空白字符分隔开。

要在参数中包含空白,可以用单引号将它括起来。要在参数中包含一个单引号,可以在单引号文本内写两个单引号。单引号中的内容还会接受类似 C 语言的替换:\n(换行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(八进制)以及\xdigits(十六进制)。在单引号文本内,反斜线出现在任何其他字符前面时,只是对该单个字符进行转义,不论它是什么字符。

如果在参数中出现一个未加引号的冒号(:),后面紧跟一个psql变量名,它就会被该变量的值替换,如下面SQL 插值所述。其中介绍的:'variable_name'和:"variable_name"形式也同样适用。:{?variable_name}语法允许测试变量是否已定义;它会被 TRUE 或 FALSE 替换。用反斜线转义该冒号可以防止替换发生。

在参数中,用反引号(`)包围的文本会被视为传给 shell 的命令行。该命令的输出(去掉末尾的换行符)会替换反引号中的文本。在反引号包围的文本内部,不会进行特殊的引号处理或其他处理,但出现:variable_name时,如果variable_name是psql变量名,就会被替换为该变量的值。此外,:'variable_name'也会被替换为该变量的值,并会适当地加上引号,使其成为单个 shell 命令参数。(后一种形式几乎总是更可取,除非你非常确定变量中包含什么。)由于无法保证在所有平台上都能对回车和换行字符安全地加引号,当变量值中出现这类字符时,:'variable_name'形式会打印错误消息,并且不会替换变量值。

一些命令接受 SQL 标识符(例如表名)作为参数。这些参数遵循 SQL 语法规则:未加引号的字母会强制转换为小写,而双引号(")会保护字母不被转换大小写,并允许标识符包含空白字符。在双引号内部,连续两个双引号会在最终名称中变为一个双引号。例如,FOO"BAR"BAZ 会被解释为 fooBARbaz,而 "A weird"" name" 会变为 A weird" name。

参数解析会在行尾或遇到另一个未加引号的反斜线时停止。未加引号的反斜线会被视为新元命令的开始。特殊序列\\(两个反斜线)表示参数结束,并继续解析SQL命令(如果还有)。通过这种方式,SQL命令和psql命令可以自由地混合在同一行中。但无论如何,元命令的参数都不能延续到下一行。

许多元命令作用于当前查询缓冲区。这只是一个保存已输入但尚未发送到服务器执行的 SQL 命令文本的缓冲区。其中既包括先前输入的行,也包括同一行上位于元命令之前的文本。

许多元命令还允许在命令名后追加 x 作为选项。这会使结果以扩展模式显示,就像使用了 \x 或 \pset expanded 一样。

定义了以下元命令:

\a

如果当前表格输出格式是非对齐,则切换为对齐;否则切换为非对齐。保留此命令是为了向后兼容。更通用的解决方案请参见\pset。

\bind [ parameter ] ...

为下一次查询执行设置查询参数,并将指定参数传给任意参数占位符($1 等)。

示例:

INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g

这对除 \g 之外的查询执行命令也有效,例如 \gx 和 \gset。

此命令会使用扩展查询协议(参见第 54.1.2 节),不同于psql通常使用的简单查询协议。因此,可以用它在psql中测试扩展查询协议。(即使查询没有参数,而且此命令指定了零个参数,也会使用扩展查询协议。)此命令只影响下一条被执行的查询;之后的所有查询默认仍会使用简单查询协议。

\bind_named statement_name [ parameter ] ...

\bind_named 等同于 \bind,不同之处在于它把现有预备语句的名称作为第一个参数。空字符串表示未命名的预备语句。

示例:

INSERT INTO tbls1 VALUES ($1, $2) \parse stmt1
\bind_named stmt1 'first value' 'second value' \g

此命令会使用扩展查询协议(参见第 54.1.2 节),不同于psql通常使用的简单查询协议。因此,可以用它在psql中测试扩展查询协议。

\c 或 \connect [ -reuse-previous=on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ]

建立到PostgreSQL服务器的新连接。可以使用位置语法(数据库名称、用户、主机和端口中的一个或多个)指定要使用的连接参数,也可以使用conninfo连接字符串,详见第 32.1.1 节。如果没有给出参数,则使用与之前相同的参数建立新连接。

将dbname、username、host或 port中的任意一个指定为 -,等同于省略该参数。

新连接可以重用前一个连接的连接参数;不仅包括数据库名称、用户、主机和端口,还包括其他设置,如sslmode。默认情况下,参数在位置语法中被重用,但在给定conninfo字符串时不会被重用。传递-reuse-previous=on或-reuse-previous=off作为第一个参数将覆盖该默认设置。如果参数被重用,则任何未明确指定为位置参数或在conninfo字符串中的参数将从现有连接的参数中获取。一个例外是,如果使用位置语法更改host设置,使其不同于先前的值,则现有连接参数中存在的任何hostaddr设置将被删除。此外,仅当用户、主机和端口设置未更改时,才会重用现有连接使用的任何密码。当命令既不指定也不重用特定参数时,将使用libpq的默认值。

如果新连接成功建立,则关闭先前的连接。如果连接尝试失败(用户名错误,访问被拒绝等),且psql处于交互模式,则保留先前的连接。但在执行非交互脚本时,旧连接将被关闭并报告错误。这可能会或可能不会终止脚本;如果没有终止,直到成功执行另一个\connect命令之前,所有访问数据库的命令都将失败。采用这种区别,一方面是为了方便用户应对输入笔误,另一方面是为了防止脚本意外操作错误的数据库。请注意,每当\connect命令尝试重新使用参数时,重新使用的值是最后一个成功连接的值,而不是随后的任何失败尝试的值。但是,在非交互\connect失败的情况下,不允许稍后重新使用参数,因为脚本可能期望从失败的\connect中重新使用值。

示例:

=> \c mydb myuser host.dom 6432
=> \c service=foo
=> \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable"
=> \c -reuse-previous=on sslmode=require    -- changes only sslmode
=> \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title ]

设置作为查询结果打印的表的标题,或取消此类标题。该命令等价于\pset title title。(此命令的名称源自“caption”,因为它过去只用于设置HTML表的标题。)

\cd [ directory ]

将当前工作目录更改为 directory。如果没有参数,则切换到当前用户的主目录。关于如何确定主目录,请参见第 32.16 节。

提示

要打印当前工作目录,请使用\! pwd。

\close_prepared prepared_statement_name

关闭指定的预备语句。空字符串表示未命名的预备语句。如果不存在该名称的预备语句,则不执行任何操作。

示例:

SELECT $1 \parse stmt1
\close_prepared stmt1

此命令会使用扩展查询协议,不同于psql通常使用的简单查询协议。因此,可以用它在psql中测试扩展查询协议。

\conninfo

输出当前数据库连接的信息;如果正在使用 SSL,也包括与 SSL 相关的信息。

请注意,Client User 字段显示的是连接建立时的用户,而 Superuser 字段表示当前用户(在当前执行上下文中)是否具有超级用户权限。这两个用户通常相同,但也可能不同,例如当前用户曾通过 SET ROLE 命令被更改。

\copy { table [ ( column_list ) ] } from { 'filename' | program 'command' | stdin | pstdin } [ [ with ] ( option [, ...] ) ] [ where condition ]
\copy { table [ ( column_list ) ] | ( query ) } to { 'filename' | program 'command' | stdout | pstdout } [ [ with ] ( option [, ...] ) ]

执行前端(客户端)复制。该操作会运行一个SQL COPY命令,但并不是由服务器读取或写入指定文件,而是由psql读取或写入文件,并在服务器与本地文件系统之间转送数据。这意味着文件可访问性和权限取决于本地用户,而不是服务器,也不需要 SQL 超级用户权限。

当指定program时,command 由psql执行,传给command的数据或从其中读出的数据都会在服务器与客户端之间转送。再次强调,执行权限属于本地用户,而不是服务器,也不需要 SQL 超级用户权限。

对于 \copy ... from stdin,从发出命令的同一输入源读取数据行,直到读取到仅含 \. 的一行或输入流到达 EOF。这适合在 SQL 脚本中内联填充表。对于 \copy ... to stdout,输出发往与 psql 命令输出相同的位置,且不打印 COPY count 命令状态,以免与数据行混淆。若要始终读写 psql 的标准输入或输出,而不受当前命令来源或 \o 选项影响,请使用 from pstdin 或 to pstdout。

该命令的语法与SQL COPY命令类似。除数据源或目标之外,其他所有选项都与COPY命令中的指定相同。因此,特殊的解析规则适用于\copy元命令。与大多数其他元命令不同,整个剩余行始终被视为\copy的参数,参数中不执行变量插值或反引号扩展。

提示

另一种获得与\copy ... to相同结果的方法是使用SQL COPY ... TO STDOUT命令,并以\g filename 或\g |program结束。与\copy不同,这种方法允许命令跨越多行;此外,可以使用变量插值和反引号扩展。

提示

这些操作不如以文件或程序作为数据源或目标的 SQL COPY 命令高效,因为所有数据都必须通过客户端/服务器连接传输。对于大量数据,使用 SQL 命令可能更合适。

\copyright

显示PostgreSQL的版权和分发条款。

\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]

执行当前查询缓冲区(与\g类似),并以交叉表网格显示结果。查询必须返回至少三列。由colV标识的输出列成为纵向表头,由colH标识的输出列成为横向表头。colD标识要在网格中显示的输出列。sortcolH标识横向表头的可选排序列。

每个列指定项可以是从 1 开始的列号,也可以是列名;列名遵循常规 SQL 大小写折叠和引号规则。省略时,colV 默认为第 1 列,colH 默认为第 2 列。colH 必须与 colV 不同。若不指定 colD,查询结果必须恰有三列,既非 colV 也非 colH 的那一列作为 colD。

纵向表头显示为最左列,包含colV列中的值,其顺序与查询结果中相同,但会移除重复值。

横向表头显示为第一行,包含colH列中的值,并移除重复值。默认情况下,它们按查询结果中的相同顺序显示。但如果给出了可选的sortcolH参数,它所标识的列的值必须是整数,而colH中的值会按照对应的sortcolH值排序后显示在横向表头中。

交叉表中,对于 colH 的每个不同值 x 和 colV 的每个不同值 y,交点 (x,y) 的单元格保存查询结果中 colH=x 且 colV=y 那一行的 colD 值。没有匹配行时单元格为空;存在多行时会报错。

\d[Sx+] [ pattern ]

对于每个与pattern匹配的关系(表、视图、物化视图、索引、序列或外部表)或复合类型,显示所有列、它们的类型、表空间(如果不是默认的)以及任何特殊属性,如NOT NULL或默认值。还显示相关的索引、约束、规则和触发器。对于外部表,还显示关联的外部服务器。(“匹配模式”的定义在下面的模式中。)

对于某些类型的关系,\d显示每列的附加信息:序列的列值,索引的索引表达式,外部表的外部数据包装器选项。

命令形式\d+与前者相同,但会显示更多信息:表列关联的注释、表是否包含 OID、当关系为视图时的视图定义、非默认的复制标识设置,以及当关系具有访问方法时的访问方法名称。

默认情况下,只显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。

注意

如果使用\d而没有pattern参数,它等同于\dtvmsE,它将显示所有可见的表、视图、物化视图、序列和外部表的列表。这纯粹是一种便利措施。

与许多其他命令一样,在命令名后添加 x 会使用扩展显示模式。但这仅适用于不带 pattern 参数的 \d,且 x 不能紧跟 \d(因为 \dx 是另一个命令),只能位于 S 或 + 修饰符之后。例如,\d+x 等价于 \dtvmsE+x,将以扩展模式列出所有关系。

\da[Sx] [ pattern ]

列出聚合函数,以及它们的返回类型和所作用的数据类型。如果指定了 pattern,则只显示名称与模式匹配的聚合。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。

\dA[x+] [ pattern ]

列出访问方法。如果指定了 pattern,则只显示名称与模式匹配的访问方法。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个访问方法都会连同其关联的处理器函数和描述一起列出。

\dAc[x+] [access-method-pattern [input-type-pattern]]

列出操作符类(参见第 36.16.1 节)。如果指定了 access-method-pattern,则只列出与名称匹配该模式的访问方法关联的操作符类。如果指定了 input-type-pattern,则只列出与名称匹配该模式的输入类型关联的操作符类。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个操作符类都会连同其关联的操作符族和所有者一起列出。

\dAf[x+] [access-method-pattern [input-type-pattern]]

列出操作符族(参见第 36.16.5 节)。如果指定了 access-method-pattern,则只列出与名称匹配该模式的访问方法关联的操作符族。如果指定了 input-type-pattern,则只列出与名称匹配该模式的输入类型关联的操作符族。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个操作符族都会连同其所有者一起列出。

\dAo[x+] [access-method-pattern [operator-family-pattern]]

列出与操作符族关联的操作符(参见第 36.16.2 节)。如果指定了 access-method-pattern,则只列出与名称匹配该模式的访问方法所关联的操作符族成员。如果指定了 operator-family-pattern,则只列出名称与该模式匹配的操作符族成员。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个操作符都会连同其排序操作符族(如果它是排序操作符)以及其底层函数是否防漏一起列出。

\dAp[x+] [access-method-pattern [operator-family-pattern]]

列出与操作符族关联的支持函数(参见第 36.16.3 节)。如果指定了 access-method-pattern,则只列出与名称匹配该模式的访问方法所关联的操作符族函数。如果指定了 operator-family-pattern,则只列出名称与该模式匹配的操作符族函数。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,函数会以详细形式显示,并带有其实际参数列表。

\db[x+] [ pattern ]

列出表空间。如果指定了 pattern,则只显示名称与模式匹配的表空间。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个表空间都会连同其关联选项、磁盘大小、权限和描述一起列出。

\dc[Sx+] [ pattern ]

列出字符集编码之间的转换。如果指定了 pattern,则只列出名称与模式匹配的转换。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个对象都会连同其相关描述一起列出。

\dconfig[x+] [ pattern ]

列出服务器配置参数及其值。如果指定了 pattern,则只列出名称与模式匹配的参数。不带 pattern 时,只列出被设置为非默认值的参数。(使用 \dconfig * 可查看所有参数。)如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个参数都会连同其数据类型、该参数可设置的上下文以及访问权限(如果已授予非默认访问权限)一起列出。

\dC[x+] [ pattern ]

列出类型转换。如果指定了 pattern,则只列出其源类型或目标类型与模式匹配的类型转换。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个类型转换的附加信息,包括其底层函数是否防漏,以及该类型转换的描述。

\dd[Sx] [ pattern ]

显示constraint、operator class、operator family、rule和 trigger类型对象的描述。其他注释可通过对应对象类型的反斜线命令查看。

\dd 显示与 pattern 匹配的对象描述;如果没有给出参数,则显示相应类型的可见对象的描述。但无论哪种情况,只列出那些已有描述的对象。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。

可以使用 COMMENT SQL 命令创建对象的描述。

\dD[Sx+] [ pattern ]

列出域。如果指定了 pattern,则只显示名称与模式匹配的域。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个对象都会连同其相关权限和描述一起列出。

\ddp[x] [ pattern ]

列出默认访问权限设置。对于每个默认权限设置已偏离内置默认值的角色(以及适用时的模式),都会显示一条记录。如果指定了 pattern,则只列出角色名或模式名与模式匹配的记录。如果在命令名后追加 x,结果会以扩展模式显示。

ALTER DEFAULT PRIVILEGES命令用于设置默认访问权限。权限显示的含义在第 5.8 节中有解释。

\dE[Sx+] [ pattern ]
\di[Sx+] [ pattern ]
\dm[Sx+] [ pattern ]
\ds[Sx+] [ pattern ]
\dt[Sx+] [ pattern ]
\dv[Sx+] [ pattern ]

在这组命令中,字母 E、i、m、s、t 和 v 分别表示外部表、索引、物化视图、序列、表和视图。你可以按任意顺序指定其中任意一个或多个字母,以获取这些类型对象的列表。例如,\dti 会列出表和索引。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个对象都会连同其持久性状态(永久、临时或不记录 WAL)、磁盘上的物理大小以及相关描述(如果有)一起列出。如果指定了 pattern,则只列出名称与模式匹配的对象。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。

\des[x+] [ pattern ]

列出外部服务器(助记符:“external servers”)。如果指定了 pattern,则只列出名称与模式匹配的服务器。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个服务器的完整描述,包括服务器的访问权限、类型、版本、选项和描述。

\det[x+] [ pattern ]

列出外部表(助记符:“external tables”)。如果指定了 pattern,则只列出表名或模式名与模式匹配的条目。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则还会显示通用选项以及外部表描述。

\deu[x+] [ pattern ]

列出用户映射(助记符:“external users”)。如果指定了 pattern,则只列出用户名与模式匹配的映射。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个映射的附加信息。

小心

\deu+可能还会显示远程用户的用户名和密码,因此应注意不要泄露它们。

\dew[x+] [ pattern ]

列出外部数据包装器(助记符:“external wrappers”)。如果指定了 pattern,则只列出名称与模式匹配的外部数据包装器。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则还会显示外部数据包装器的访问权限、选项和描述。

\df[anptwSx+] [ pattern [ arg_pattern ... ] ]

列出函数,以及它们的结果数据类型、参数数据类型和函数类型,函数类型分为“agg”(聚合)、“normal”、“procedure”、“trigger”或“window”。要只显示特定类型的函数,请在命令后添加相应的字母 a、n、p、t 或 w。如果指定了 pattern,则只显示名称与模式匹配的函数。任何附加参数都是类型名模式,分别与函数第一、第二等参数的类型名匹配。(匹配到的函数可以比你指定的参数更多;若要防止这种情况,可将连字符 - 写成最后一个 arg_pattern。)默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个函数的附加信息,包括易变性、并行安全性、所有者、安全分类、是否防漏、访问权限、语言、内部名称(仅适用于 C 和 internal 函数)以及描述。特定函数的源代码可通过 \sf 查看。

\dF[x+] [ pattern ]

列出全文检索配置。如果指定了 pattern,则只显示名称与模式匹配的配置。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个配置的完整描述,包括底层全文检索解析器以及每种解析器词元类型对应的词典列表。

\dFd[x+] [ pattern ]

列出全文检索词典。如果指定了 pattern,则只显示名称与模式匹配的词典。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个所选词典的附加信息,包括底层全文检索模板和选项值。

\dFp[x+] [ pattern ]

列出全文检索解析器。如果指定了 pattern,则只显示名称与模式匹配的解析器。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个解析器的完整描述,包括底层函数和可识别的词元类型列表。

\dFt[x+] [ pattern ]

列出全文检索模板。如果指定了 pattern,则只显示名称与模式匹配的模板。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个模板的附加信息,包括底层函数名。

\dg[Sx+] [ pattern ]

列出数据库角色。(由于“用户”和“组”的概念已经统一为“角色”,此命令现在等同于 \du。)默认情况下,只显示用户创建的角色;提供 S 修饰符可包括系统角色。如果指定了 pattern,则只列出名称与模式匹配的角色。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个角色的附加信息;目前这会增加每个角色的注释。

\dl[x+]

这是 \lo_list 的别名,后者会显示大对象列表。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会列出每个大对象的相关权限(如果有)。

\dL[Sx+] [ pattern ]

列出过程语言。如果指定了 pattern,则只列出名称与模式匹配的语言。默认情况下,只显示用户创建的语言;提供 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每种语言都会连同其调用处理器、验证器、访问权限以及它是否为系统对象一起列出。

\dn[Sx+] [ pattern ]

列出模式(命名空间)。如果指定了 pattern,则只列出名称与模式匹配的模式。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个对象都会连同其相关权限和描述(如果有)一起列出。

\do[Sx+] [ pattern [ arg_pattern [ arg_pattern ] ] ]

列出操作符及其操作数类型和结果类型。如果指定了 pattern,则只列出名称与模式匹配的操作符。如果指定了一个 arg_pattern,则只列出其右参数类型名称与该模式匹配的前缀操作符。如果指定了两个 arg_pattern,则只列出参数类型名称与这些模式匹配的二元操作符。(对于一元操作符未使用的参数,也可以写成 -。)默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个操作符的附加信息,包括底层函数名以及它是否防漏。

\dO[Sx+] [ pattern ]

列出排序规则。如果指定了 pattern,则只列出名称与模式匹配的排序规则。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个排序规则都会连同其相关描述(如果有)一起列出。请注意,只会显示与当前数据库编码兼容的排序规则,因此在同一安装中的不同数据库里结果可能不同。

\dp[Sx] [ pattern ]

列出表、视图和序列及其相关访问权限。如果指定了 pattern,则只列出名称与模式匹配的表、视图和序列。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。

GRANT和 REVOKE 命令用于设置访问权限。权限显示的含义在第 5.8 节中有解释。

\dP[itnx+] [ pattern ]

列出分区关系。如果pattern被指定,则只列出名称与模式匹配的条目。修饰符t(表)和i(索引)可以附加到命令,过滤要列出的关系类型。默认情况下,列出分区表和索引。

如果使用修饰符n(“nested”),或指定了模式,则将包括非根分区关系,并显示一列,给出每个分区关系的父级。

如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则还会显示每个关系分区大小的总和以及关系描述。如果 n 与 + 组合使用,则会显示两个大小:一个包括直接附加的叶分区的总大小,另一个显示包括间接附加子分区在内的所有分区总大小。

\drds[x] [ role-pattern [ database-pattern ] ]

列出已定义的配置设置。这些设置可以特定于角色、特定于数据库,或同时特定于两者。role-pattern和database-pattern分别用于选择要列出的角色和数据库。省略某个模式参数或将其指定为*时,不会按该参数筛选,还会分别包含不特定于角色或不特定于数据库的设置。如果在命令名后追加x,结果会以扩展模式显示。

ALTER ROLE和 ALTER DATABASE 命令用于定义每个角色和每个数据库的配置设置。

\drg[Sx] [ pattern ]

列出每个被授予角色成员身份的信息,包括被授予的选项(ADMIN、INHERIT 和/或 SET)以及授予者。关于角色成员身份,参见 GRANT 命令。

默认情况下,只显示授予用户创建角色的成员身份;提供 S 修饰符可包括系统角色。如果指定了 pattern,则只列出授予名称与模式匹配的角色的成员身份。如果在命令名后追加 x,结果会以扩展模式显示。

\dRp[x+] [ pattern ]

列出逻辑复制发布。如果指定了 pattern,则只列出名称与模式匹配的发布。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则还会显示与每个发布关联的表和模式。

\dRs[x+] [ pattern ]

列出逻辑复制订阅。如果指定了 pattern,则只列出名称与模式匹配的订阅。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示订阅的其他属性。

\dT[Sx+] [ pattern ]

列出数据类型。如果指定了 pattern,则只列出名称与模式匹配的类型。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个类型都会连同其内部名称、大小和相关权限一起列出;对于 enum 类型,还会显示其允许值。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。

\du[Sx+] [ pattern ]

列出数据库角色。(由于“用户”和“组”的概念已经统一为“角色”,此命令现在等同于 \dg。)默认情况下,只显示用户创建的角色;提供 S 修饰符可包括系统角色。如果指定了 pattern,则只列出名称与模式匹配的角色。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会显示每个角色的附加信息;目前这会增加每个角色的注释。

\dx[x+] [ pattern ]

列出已安装的扩展。如果指定了 pattern,则只列出名称与模式匹配的扩展。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会列出属于每个匹配扩展的全部对象。

\dX[x] [ pattern ]

列出扩展统计信息。如果指定了 pattern,则只列出名称与模式匹配的扩展统计信息。如果在命令名后追加 x,结果会以扩展模式显示。

每种扩展统计的状态显示在以统计种类命名的列中,例如 Ndistinct。defined 表示创建统计时请求了该统计,NULL 表示未请求。若要判断 ANALYZE 是否运行过、统计是否可供规划器使用,可查询 pg_stats_ext。

\dy[x+] [ pattern ]

列出事件触发器。如果指定了 pattern,则只列出名称与模式匹配的事件触发器。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则每个对象都会连同其相关描述一起列出。

\e 或 \edit [ filename ] [ line_number ]

如果指定了filename,则编辑该文件;编辑器退出后,文件内容将被复制到当前查询缓冲区。如果没有给出filename,则将当前查询缓冲区复制到临时文件中,然后以相同方式进行编辑。或者,如果当前查询缓冲区为空,则将最近执行的查询复制到临时文件中,并以相同方式进行编辑。

如果编辑文件或上一个查询后在未修改文件的情况下退出编辑器,则查询缓冲区将被清除。否则,查询缓冲区的新内容将根据psql的正常规则重新解析,将整个缓冲区视为单行。任何完整的查询将立即执行;也就是说,如果查询缓冲区包含分号或以分号结尾,则执行并从查询缓冲区中删除到该点的所有内容。查询缓冲区中剩余的内容将重新显示。输入分号或\g发送它,或输入\r通过清除查询缓冲区来取消。

将缓冲区视为单行主要影响元命令:在元命令后的缓冲区将被视为元命令的参数,即使它跨越多行。(因此,不能用这种方式创建使用元命令的脚本。请使用\i。)

如果指定了行号,psql将光标定位在文件或查询缓冲区的指定行上。请注意,如果只给出一个全是数字的参数,psql会假定它是一个行号,而不是文件名。

提示

关于如何配置和自定义编辑器,请参见下面的环境。

\echo text [ ... ]

将求值后的参数打印到标准输出,用空格分隔,并在末尾加上换行符。这对于在脚本输出中穿插信息很有用。例如:

=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999

如果第一个参数是未加引号的-n,则不会写入尾随的换行符(也不会写入第一个参数)。

提示

如果使用\o命令重定向查询输出,可能会想用\qecho代替这个命令。另请参阅\warn。

\ef [ function_description [ line_number ] ]

这个命令获取并编辑指定函数或过程的定义,形式为CREATE OR REPLACE FUNCTION或 CREATE OR REPLACE PROCEDURE命令。编辑方式与\edit相同。如果在不保存的情况下退出编辑器,则该语句会被丢弃。如果保存并退出编辑器,并在其中添加了分号,则更新后的命令会立即执行。否则它会重新显示;键入分号或\g发送它,或用\r取消。

目标函数可仅用名称指定,也可用名称和参数指定,例如 foo(integer, text)。若有多个同名函数,则必须提供参数类型。

如果未指定函数,则会呈现一个空的CREATE FUNCTION模板供编辑。

如果指定了行号,psql将光标定位在函数体的指定行上。(请注意,函数体通常不会从文件的第一行开始。)

与大多数其他元命令不同,整个行的剩余部分始终被视为\ef的参数,参数中不进行变量插值或反引号扩展。

提示

关于如何配置和自定义编辑器,请参见下面的环境。

\encoding [ encoding ]

设置客户端字符集编码。没有参数时,此命令显示当前编码。

\errverbose

以最大的详细程度重复最近的服务器错误消息,就好像VERBOSITY被设置为verbose,SHOW_CONTEXT被设置为always一样。

\ev [ view_name [ line_number ] ]

这个命令获取并编辑指定视图的定义,形式为CREATE OR REPLACE VIEW命令。编辑方式与\edit相同。如果在不保存的情况下退出编辑器,则该语句会被丢弃。如果保存并退出编辑器,并在其中添加了分号,则更新后的命令会立即执行;否则将重新显示;输入分号或\g发送它,或用\r取消。

如果未指定视图,则会呈现一个空的CREATE VIEW模板供编辑。

如果指定了行号,psql将光标定位在视图定义的指定行上。

与大多数其他元命令不同,整个行的剩余部分始终被视为\ev的参数,参数中不进行变量插值或反引号扩展。

\f [ string ]

设置非对齐查询输出的字段分隔符。默认值是竖线(|)。它等同于\pset fieldsep。

\g [ (option=value [...]) ] [ filename ]
\g [ (option=value [...]) ] [ |command ]

将当前查询缓冲区发送给服务器执行。

如果在\g后面出现括号,则括号中是用空格分隔的option=value格式选项子句列表。这些子句的解释方式与\pset option value命令相同,但仅在此查询执行期间生效。在此列表中,=符号周围不允许有空格,但选项子句之间必须有空格。如果=value被省略,则指定的option会按以下命令的方式更改:\pset option,其中不显式指定value。

如果给出了filename或|command参数,查询输出就会写入指定文件,或通过管道传给指定的 shell 命令,而不是照常显示。只有当查询成功返回零个或多个元组时,才会向文件或命令写入;如果查询失败,或执行的是不返回数据的 SQL 命令,则不会写入。

如果当前查询缓冲区为空,则最近发送的查询将被重新执行。除此之外,没有任何参数的\g基本上等同于一个分号。带有参数的\g提供了一个“一次性”替代\o命令的选择,并且还允许一次性调整通常由\pset设置的输出格式选项。

当最后一个参数以|开头时,该行剩余的全部内容都会被视为要执行的command,其中既不进行变量插值,也不进行反引号扩展。该行剩余部分会直接按字面传给 shell。

\gdesc

显示当前查询缓冲区中查询结果的描述(即列名和数据类型)。查询并不会实际执行;不过,如果其中存在语法错误,会按通常的方式报告。

如果当前查询缓冲区为空,则改为描述最近发送的查询。

\getenv psql_var env_var

获取环境变量env_var的值,并将其赋给psql变量psql_var。如果env_var在psql进程的环境中未定义,psql_var不会被改变。示例:

=> \getenv home HOME
=> \echo :home
/home/postgres
\gexec

将当前查询缓冲区发送到服务器,然后将查询输出的每行每列视为要执行的SQL语句。例如,要在my_table的每一列上创建索引:

=> SELECT format('create index on my_table(%I)', attname)
-> FROM pg_attribute
-> WHERE attrelid = 'my_table'::regclass AND attnum > 0
-> ORDER BY attnum
-> \gexec
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX

生成的查询按返回行的顺序执行;同一行有多列时从左到右执行,忽略 NULL 字段。查询原样发送给服务器,因此不能是 psql 元命令,也不能包含 psql 变量引用。除非设置 ON_ERROR_STOP,某条查询失败后仍继续执行其余查询。每条查询均遵循 ECHO 设置(使用 \gexec 时,通常建议将 ECHO 设为 all 或 queries),查询日志、单步模式、计时等执行功能也分别应用于每条生成的查询。

若当前查询缓冲区为空,则重新执行最近发送的查询。

\gset [ prefix ]

将当前查询缓冲区发送给服务器,并将查询输出存入 psql 变量(参见下面的变量)。要执行的查询必须恰好返回一行。该行的每一列分别存入一个变量,变量名与列名相同。例如:

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset
=> \echo :var1 :var2
hello 10

如果指定了prefix,则会将该字符串加到查询的列名前面,以构成要使用的变量名:

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset result_
=> \echo :result_var1 :result_var2
hello 10

如果某一列的结果为 NULL,则取消设置对应的变量,而不是设置它。

如果查询失败或没有恰好返回一行,则不会更改任何变量。

若当前查询缓冲区为空,则重新执行最近发送的查询。

\gx [ (option=value [...]) ] [ filename ]
\gx [ (option=value [...]) ] [ |command ]

\gx 与 \g 等价,但会强制此查询使用扩展输出模式,相当于在 \pset 选项列表中指定 expanded=on。另见 \x。

\h或\help [ command ]

给出指定SQL命令的语法帮助。如果未指定command,则psql将列出所有可用语法帮助的命令。如果command是星号(*),则显示所有SQL命令的语法帮助。

与大多数其他元命令不同,整个行的剩余部分始终被视为\help的参数,参数中不进行变量插值或反引号扩展。

注意

为了简化输入,由多个单词组成的命令不需要加引号。因此,可以直接输入\help alter table。

\H 或 \html

打开HTML查询输出格式。如果HTML格式已经打开,则切换回默认的对齐文本格式。此命令是为兼容性和便利性而保留的;设置其他输出选项的方法见\pset。

\i 或 \include filename

从文件filename中读取输入,并像在键盘上输入一样执行它。

如果filename是-(连字符),则从标准输入读取,直到遇到 EOF 指示或\q元命令。这可用于将交互式输入与文件输入交错使用。请注意,只有在最外层启用了 Readline,此处才会使用 Readline 功能。

注意

如果想在屏幕上看到被读入的各行,请将变量ECHO设置为all。

\if expression
\elif expression
\else
\endif

这组命令实现了可嵌套的条件块。条件块必须以\if开始,并以\endif结束。在两者之间可以有任意数量的\elif子句,后面可以选择性地跟着一个\else子句。在形成条件块的命令之间通常会出现普通查询和其他类型的反斜线命令。

\if 和 \elif 读取参数并将其作为布尔表达式求值。结果为真时继续正常处理,否则跳过后续行,直到遇到匹配的 \elif、\else 或 \endif。某个 \if 或 \elif 条件成立后,同一块中后续 \elif 的参数不再求值,直接视为假。只有之前匹配的 \if 和 \elif 均未成立,才处理 \else 后的行。

与其他反斜杠命令参数一样,\if 或 \elif 的表达式参数先进行变量插值和反引号展开,然后像开关选项变量一样求值。有效值为 true、false、1、0、on、off、yes、no 的任意无歧义、不区分大小写的匹配。例如 t、T 和 tR 都会视为真。

不能正确求值为真或假的表达式会产生警告,并被视为假。

被跳过的行会被正常解析以识别查询和反斜线命令,但查询不会发送到服务器,而且除了条件命令(\if、\elif、\else、\endif)之外的反斜线命令会被忽略。仅检查跳过行中条件命令的有效嵌套。跳过行中的变量引用不会被展开,也不会执行反引号扩展。

同一个条件块的所有反斜线命令必须出现在同一个源文件中。如果主输入文件或通过\include引入的文件到达 EOF 时,仍有本地\if块未关闭,psql就会报错。

下面是一个示例:

-- check for the existence of two separate records in the database and store
-- the results in separate psql variables
SELECT
    EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
    EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
\gset
\if :is_customer
    SELECT * FROM customer WHERE customer_id = 123;
\elif :is_employee
    \echo 'is not a customer but is an employee'
    SELECT * FROM employee WHERE employee_id = 456;
\else
    \if yes
        \echo 'not a customer or employee'
    \else
        \echo 'this will never print'
    \endif
\endif
\ir 或 \include_relative filename

\ir命令与\i相似,但解析相对文件名的方式不同。在交互模式下执行时,这两个命令的行为相同。不过,在脚本中调用时,\ir会相对于脚本所在的目录来解释文件名,而不是相对于当前工作目录。

\l[x+]或\list[x+] [ pattern ]

列出服务器中的数据库,并显示其名称、所有者、字符集编码和访问权限。如果指定了 pattern,则只列出名称与模式匹配的数据库。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则还会显示数据库大小、默认表空间和描述。当前用户对其拥有 CONNECT 权限的数据库可以显示大小信息;如果当前用户是超级用户或具有 pg_read_all_stats 角色的权限,也可以显示大小信息。

\lo_export loid filename

从数据库中读取具有OIDloid的大对象,并将其写入filename。请注意,这与服务器函数 lo_export略有不同,后者使用运行数据库服务器的用户的权限,并在服务器的文件系统上操作。

提示

使用 \lo_list 查找大对象的 OID。

\lo_import filename [ comment ]

将文件存储到一个PostgreSQL大对象中。可选地,它将给定的注释与对象关联起来。例如:

foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801

响应表明大对象获得了对象 ID 152801,这个 ID 可以用来在将来访问新创建的大对象。为便于阅读,建议始终为每个对象关联一条便于人阅读的注释。查看 OID 和注释时,可以使用\lo_list命令。

请注意,此命令与服务器端的lo_import略有不同,因为它作为本地用户在本地文件系统上操作,而不是服务器的用户和文件系统。

\lo_list[x+]

显示当前存储在数据库中的全部 PostgreSQL 大对象列表,以及为它们提供的任何注释。如果在命令名后追加 x,结果会以扩展模式显示。如果在命令名后追加 +,则会列出每个大对象的相关权限(如果有)。

\lo_unlink loid

从数据库中删除OID 为 loid的大对象。

提示

使用 \lo_list 查找大对象的 OID。

\o 或 \out [ filename ]
\o 或 \out [ |command ]

将后续查询结果保存到文件filename,或通过管道传给 shell 命令command。如果没有指定参数,查询输出将恢复为标准输出。

如果参数以|开头,则该行剩余的全部内容会被视为要执行的command,其中不会进行变量插值或反引号扩展。该行剩余的内容只会原样传递给 shell。

“查询结果”包括从数据库服务器获取的所有表格、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\d);但不包括错误消息。

提示

要在查询结果之间插入文本输出,使用\qecho。

\p或\print

将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。

\parse statement_name

基于目标预备语句对象的名称,从当前查询缓冲区创建一个预备语句。空字符串表示未命名的预备语句。

示例:

SELECT $1 \parse stmt1

此命令会使用扩展查询协议,不同于psql通常使用的简单查询协议。该命令会发出一条Parse (F)消息,因此可用于在psql中测试扩展查询协议。此命令只影响下一条被执行的查询;之后的所有查询默认仍会使用简单查询协议。

\password [ username ]

更改指定用户(默认为当前用户)的密码。此命令提示输入新密码,对其进行加密,并将其作为ALTER ROLE命令发送到服务器。这样可以确保新密码不会以明文形式出现在命令历史记录、服务器日志或其他地方。

\prompt [ text ] name

提示用户提供文本,将其赋值给变量name。可以指定一个可选的提示字符串text。(对于多个单词的提示,用单引号括起文本。)

默认情况下,\prompt 使用终端进行输入和输出。然而,如果使用了 -f 命令行开关,\prompt 将使用标准输入和标准输出。

\pset [ option [ value ] ]

这个命令设置影响查询结果表输出的选项。option指定要设置哪个选项。value的含义取决于所选的选项。对于某些选项,省略value会切换或取消设置该选项,具体见各选项的说明。如果没有提及这类行为,那么省略value只会显示当前设置。

不带任何参数的\pset会显示所有打印选项的当前状态。

可调整打印选项有:

border

value必须是数字。一般来说,数字越大,表格的边框和分隔线就越多,但细节取决于具体格式。在HTML格式中,它会直接转换为border=...属性。在大多数其他格式中,只有值 0(无边框)、1(内部分隔线)和 2(表格外框)有意义,大于 2 的值会与border = 2作相同处理。latex和latex-longtable格式还允许使用值 3,以在数据行之间添加分隔线。

列

设置wrapped格式的目标宽度,同时也是确定输出是否足够宽以需要分页器或在扩展自动模式下切换到垂直显示的宽度限制。零(默认值)会导致目标宽度由环境变量COLUMNS控制,或者如果未设置 COLUMNS则由检测到的屏幕宽度控制。另外,如果columns为零,则wrapped格式仅影响屏幕输出。如果columns为非零,则文件和管道输出也会按该宽度折行。

csv_fieldsep

指定在CSV输出格式中使用的字段分隔符。如果分隔符字符出现在字段的值中,则该字段将根据标准CSV规则在双引号内输出。默认值是逗号。

expanded(或x)

如果指定了value,它必须是on或off(分别启用或禁用扩展模式),或者是auto。如果省略value,该命令会在开启和关闭设置之间切换。启用扩展模式时,查询结果以两列显示,左侧为列名,右侧为数据。如果数据在通常的“横向”模式下无法适应屏幕,这种模式就很有用。在自动设置下,当查询输出包含多列且宽度超过屏幕时,会使用扩展模式;否则使用常规模式。自动设置只在对齐和折行格式中有效。在其他格式中,它的行为始终与关闭扩展模式相同。

fieldsep

指定非对齐输出格式使用的字段分隔符。这样可以创建例如制表符分隔的输出,这可能更符合其他程序的需要。要将制表符设置为字段分隔符,请输入\pset fieldsep '\t'。默认字段分隔符是'|'(竖线)。

fieldsep_zero

将非对齐输出格式使用的字段分隔符设置为零字节。

footer

如果指定了value,它必须是on或off,分别启用或禁用表格页脚((n rows)计数)的显示。如果省略value,该命令会切换页脚显示的开关状态。

format

设置输出格式为aligned、asciidoc、csv、html、latex、latex-longtable、troff-ms、unaligned或wrapped。允许使用唯一缩写。

aligned格式是标准的、适合人阅读且排版整齐的文本输出;这是默认格式。

unaligned格式将一行中的所有列写在一行上,由当前活动的字段分隔符分隔。这对于创建可能被其他程序读取的输出很有用,例如,制表符分隔或逗号分隔格式。然而,如果字段分隔符字符出现在列的值中,则不会被特殊处理;因此,CSV格式可能更适合这些目的。

csv格式按逗号分隔的列值输出,并应用 RFC 4180 中描述的加引号规则。此输出与服务器的CSV格式的 COPY命令兼容。生成包含列名的表头行,除非 tuples_only参数设置为 on。不打印表格标题和页脚。每行以系统相关的行结束字符结束,对于类Unix系统通常是单个换行符(\n),对于Microsoft Windows则是回车和换行序列(\r\n)。可以用\pset csv_fieldsep选择逗号以外的字段分隔字符。

wrapped格式与aligned相似,但会将较宽的数据值折成多行,使输出适应目标列宽。目标宽度的确定方式见columns选项的说明。请注意,psql不会尝试对列标题折行;因此,如果列标题所需的总宽度超过目标宽度,wrapped格式的行为就与aligned相同。

asciidoc、html、latex、latex-longtable 和 troff-ms 格式输出的是可嵌入相应标记语言文档的表格,并非完整文档。HTML 可能不要求完整封装,但 LaTeX 必须有完整文档结构。latex 使用 LaTeX 的 tabular 环境;latex-longtable 需要 LaTeX 的 longtable 和 booktabs 宏包。

linestyle

设置边框线绘制样式为ascii、old-ascii或unicode之一。允许使用唯一缩写。(这意味着一个字母就足够了。)默认设置为ascii。此选项仅影响aligned和wrapped输出格式。

ascii样式使用普通的ASCII字符。数据中的换行符以右边缘的+符号表示。当wrapped格式在没有换行符的位置把数据折到下一行时,会在第一行的右边缘显示一个点(.),并在下一行的左边缘再次显示。

old-ascii样式使用普通的ASCII字符,采用PostgreSQL 8.4 及更早版本的格式样式。数据中的换行符以替代左侧列分隔符的:符号表示。当数据在没有换行符的位置折到下一行时,则用;符号替代左侧列分隔符。

unicode样式使用 Unicode 框线绘制字符。数据中的换行符以右边缘的回车符号表示。当数据在没有换行符的位置折到下一行时,会在第一行的右边缘显示省略号符号,并在下一行的左边缘再次显示。

当border设置大于零时,linestyle选项还决定用哪些字符绘制边框线。普通的ASCII字符在任何环境中都可用,但在支持 Unicode 的显示设备上,Unicode 字符更美观。

null

设置用于代替空值打印的字符串。默认不打印任何内容,这很容易被误认为空字符串。例如,你可能更喜欢使用\pset null '(null)'。

numericlocale

如果指定了value,它必须是on或off,分别启用或禁用使用区域设置特定的字符来分隔小数点左侧的数字组。如果省略value,该命令会在常规数字输出和区域设置特定的数字输出之间切换。

pager

控制查询结果与 psql 帮助输出使用分页程序的方式。当 pager 为 off 时,不使用分页程序;为 on 时,在适当情况下使用,即输出目标是终端且内容无法在屏幕内显示完。设为 always 时,所有终端输出均使用分页程序,无论是否能在屏幕内显示完。不带值的 \pset pager 会切换分页的开关状态。

如果设置了环境变量PSQL_PAGER或PAGER,需要分页的输出会通过管道传给指定程序。否则,使用与平台有关的默认程序(如more)。

当使用 \watch 命令重复执行查询时,在 Unix 系统上会改用环境变量 PSQL_WATCH_PAGER 来查找分页器程序。之所以单独配置它,是因为这种用法可能会让传统分页器无法正常工作;但它可用于把输出发送给能够理解 psql 输出格式的工具(例如 pspg --stream)。

pager_min_lines

若 pager_min_lines 大于屏幕页高,只有输出行数达到该值时才调用分页程序。默认值为 0。

recordsep

指定非对齐输出格式使用的记录(行)分隔符。默认为换行符。

recordsep_zero

将非对齐输出格式使用的记录分隔符设置为零字节。

tableattr(或T)

在HTML格式中,这指定要放在table标签内的属性,例如cellpadding或bgcolor。请注意,你可能不需要在这里指定border,因为\pset border已经负责处理它。如果没有给出value,则取消设置表格属性。

在latex-longtable格式中,这控制每个包含左对齐数据类型的列的宽度比例。它以空白分隔的值列表指定,例如'0.2 0.2 0.6'。未指定的输出列使用最后指定的值。

title(或C)

设置随后打印的所有表格的标题。这可以为输出提供描述性标签。如果没有给出value,则取消设置标题。

tuples_only(或t)

如果指定了value,它必须是on或off,分别启用或禁用仅元组模式。如果省略value,该命令会在常规输出和仅元组输出之间切换。常规输出包含列标题、表格标题和各种页脚等附加信息。在仅元组模式下,只显示实际的表格数据。

unicode_border_linestyle

将unicode线条样式的边框绘制样式设置为single或double。

unicode_column_linestyle

将unicode线条样式的列分隔线绘制样式设置为single或double。

unicode_header_linestyle

将unicode线条样式的表头分隔线绘制样式设置为single或double。

xheader_width

将扩展输出标题的最大宽度设为 full(默认值)、column、page 或一个整数值。

full:扩展表头不截断,其宽度与最宽的输出行相同。

column:将表头行截断为第一列的宽度。

page:将表头行截断为终端宽度。

整数值:精确指定标题行的最大宽度。

这些不同格式的外观示例可参见下面的示例。

提示

有各种快捷命令用于\pset。请参见\a、\C、\f、\H、\t、\T和\x。

\q或\quit

退出psql程序。在脚本文件中,只会终止该脚本的执行。

\qecho text [ ... ]

这个命令与\echo相同,只是输出会写入由\o设置的查询输出通道。

\r或\reset

重置(清空)查询缓冲区。

\restrict restrict_key

使用给定的密钥进入“受限”模式。在该模式下,唯一允许的元命令是用于退出受限模式的\unrestrict。密钥只能包含字母数字字符。

此命令主要用于 pg_dump、pg_dumpall 和 pg_restore 生成的纯文本转储,也可能适用于其他场景。

\s [ filename ]

打印psql的命令行历史记录到filename。如果省略filename,历史记录将被写入标准输出(如果适用,将使用分页器)。如果psql在构建时没有使用Readline支持,则此命令不可用。

\set [ name [ value [ ... ] ] ]

设置psql变量name为value,如果给出多个值,则设置为所有值的连接。如果只给出一个参数,则将变量设置为空字符串值。要取消变量设置,请使用\unset命令。

\set没有任何参数时,显示当前设置的所有psql变量的名称和值。

有效的变量名可以包含字母、数字和下划线。有关详细信息,请参见下面的变量。变量名区分大小写。

某些变量是特殊的,它们控制psql的行为或者自动设置以反映连接状态。这些变量在下面的变量中有文档记录。

注意

这个命令与SQL命令SET无关。

\setenv name [ value ]

设置环境变量name为value,或者如果未提供value,则取消设置环境变量。示例:

testdb=> \setenv PAGER less
testdb=> \setenv LESS -imx4F
\sf[+] function_description

这个命令获取并显示指定函数或过程的定义,以CREATE OR REPLACE FUNCTION或 CREATE OR REPLACE PROCEDURE命令的形式呈现。定义将打印到当前查询输出通道,由\o设置。

目标函数可仅用名称指定,也可用名称和参数指定,例如 foo(integer, text)。若有多个同名函数,则必须提供参数类型。

在命令名后添加 +,会为输出行编号,函数体第一行为第 1 行。

与大多数其他元命令不同,整个行的剩余部分始终被视为\sf的参数,参数中不进行变量插值或反引号扩展。

\sv[+] view_name

这个命令获取指定视图的定义,并以CREATE OR REPLACE VIEW命令的形式显示。定义会打印到由\o设置的当前查询输出通道。

如果在命令名称后添加+,那么输出行将从1开始编号。

与大多数其他元命令不同,整个行的剩余部分始终被视为\sv的参数,参数中不进行变量插值或反引号扩展。

\startpipeline
\sendpipeline
\syncpipeline
\endpipeline
\flushrequest
\flush
\getresults [ number_results ]

这组命令实现 SQL 语句的管道化。一个管道必须以 \startpipeline 开始,并以 \endpipeline 结束。其间可以出现任意数量的 \syncpipeline 命令,它会发送一条同步消息,而不会结束当前管道,也不会刷新发送缓冲区。在管道模式下,语句会被发送到服务器,而不等待前面语句的结果。更多细节见第 32.5 节。

管道进行期间执行的所有查询都使用扩展查询协议。以分号结束的查询会被追加到管道中。元命令 \bind、\bind_named、\close_prepared 和 \parse 可以在进行中的管道里使用。管道进行期间,\sendpipeline 会将当前查询缓冲区追加到管道中。其他元命令,如 \g、\gx 或 \gdesc,则不允许在管道模式中使用。

\flushrequest 会向管道追加一条 flush 命令,使得可以在不发送 sync 或结束管道的情况下通过 \getresults 读取结果。\getresults 会自动将尚未发送的数据推送到服务器。\flush 可用于手动推送未发送的数据。

\getresults 接受一个可选的 number_results 参数。如果提供,则只读取前 number_results 个待处理结果。若省略该参数或其值为 0,则读取所有待处理结果。

当管道模式处于活动状态时,可使用一个专用的提示符变量来报告管道状态。详见%P。

COPY 在管道模式中不支持。

示例:

\startpipeline
SELECT * FROM pg_class;
SELECT 1 \bind \sendpipeline
\flushrequest
\getresults
\endpipeline
\t

切换输出中的列名标题和行数页脚的显示状态。这个命令等价于\pset tuples_only,提供它是为了使用方便。

\T table_options

指定在HTML输出格式中放在table标签内的属性。这个命令等价于\pset tableattr table_options。

\timing [ on | off ]

带参数时,开启或关闭每条 SQL 语句执行耗时的显示。不带参数时,切换显示的开关状态。耗时以毫秒显示;超过 1 秒的时间间隔还会以分钟:秒的格式显示,必要时添加小时和天字段。

\unrestrict restrict_key

退出“受限”模式(即所有其他元命令都被阻止的模式),前提是指定的密钥与进入受限模式时传给\restrict的密钥匹配。

此命令主要用于 pg_dump、pg_dumpall 和 pg_restore 生成的纯文本转储,也可能适用于其他场景。

与大多数其他元命令不同,整个剩余行始终被视为\unrestrict的参数,并且不会执行变量插值或反引号扩展。

\unset name

取消设置(删除)psql变量name。

大多数控制psql行为的变量不能取消设置;对于这些变量,\unset命令会被解释为将其设置为默认值。参见下面的变量。

\w 或 \write filename
\w 或 \write |command

将当前查询缓冲区写入文件filename,或通过管道传递给 shell 命令command。如果当前查询缓冲区为空,则改为写入最近执行的查询。

如果参数以|开头,则该行剩余的全部内容会被视为要执行的command,其中不会进行变量插值或反引号扩展。该行剩余的内容只会原样传递给 shell。

\warn text [ ... ]

这个命令与\echo命令相同,只是输出将被写入psql的标准错误通道,而不是标准输出。

\watch [ i[nterval]=seconds ] [ c[ount]=times ] [ m[in_rows]=rows ] [ seconds ]

重复执行当前查询缓冲区(如同 \g 一样),直到被中断、查询失败、达到执行次数上限(如果给定)或查询返回的行数低于最小要求。两次执行之间等待指定的秒数(默认 2 秒)。默认等待时间可通过变量WATCH_INTERVAL修改。为保持向后兼容,seconds 可以带或不带 interval= 前缀。每次查询结果都会带有一个头部,其中包含 \pset title 字符串(如果有)、查询开始时的时间以及延迟间隔。

若当前查询缓冲区为空,则重新执行最近发送的查询。

\x [ on | off | auto ]

设置或切换扩展表格格式模式。它等价于\pset expanded。

\z[Sx] [ pattern ]

列出表、视图和序列及其相关访问权限。如果指定了 pattern,则只列出名称与模式匹配的表、视图和序列。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符可包括系统对象。如果在命令名后追加 x,结果会以扩展模式显示。

这是\dp的别名(“显示权限”)。

\! [ command ]

不带参数时,进入一个子 shell;子 shell 退出后,psql恢复运行。带参数时,执行 shell 命令command。

与大多数其他元命令不同,该行剩余的全部内容始终被视为\!的参数,其中不会进行变量插值或反引号扩展。该行剩余内容会原样传给 shell。

\? [ topic ]

显示帮助信息。可选的topic参数(默认为commands)选择要解释的psql的哪个部分:commands描述psql的反斜线命令;options描述可以传递给psql的命令行选项;而variables显示关于psql配置变量的帮助。

\;

反斜线分号不像前面的命令那样是一个元命令;相反,它只是在不进行进一步处理的情况下将一个分号添加到查询缓冲区中。

通常,psql会在到达命令结束的分号时立即将SQL命令发送到服务器,即使当前行还有更多输入。因此,例如输入

select 1; select 2; select 3;

将导致三个SQL命令分别发送到服务器,每个命令的结果在继续下一个命令之前显示。然而,输入为\;的分号不会触发命令处理,因此它之前和之后的命令实际上被合并并作为一个请求发送到服务器。因此,例如

select 1\; select 2\; select 3;

会在遇到前面没有反斜线的分号时,将这三个 SQL 命令作为单个请求发送到服务器。服务器会将此类请求作为单个事务执行,除非字符串中包含显式的BEGIN/COMMIT命令将其分成多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参见第 54.2.2.1 节。)

模式

很多\d命令都可以用一个pattern参数来指定要被显示的对象名称。在最简单的情况下,模式正好就是该对象的准确名称。在模式中的字符通常会被变成小写形式(就像在 SQL 名称中那样),例如\dt FOO将会显示名为foo的表。就像在 SQL 名称中那样,把模式放在双引号中可以阻止它被转换成小写形式。如果需要在一个模式中包括一个真正的双引号字符,则需要在双引号包围的文本内把它写成两个相邻的双引号,这同样是符合 SQL 加引号标识符的规则。例如,\dt "FOO""BAR"将显示名为FOO"BAR(不是foo"bar)的表。和普通的 SQL 名称规则不同,你可以只在模式的一部分周围放上双引号,例如\dt FOO"FOO"BAR将会显示名为fooFOObar的表。

只要完全省略pattern参数,\d命令就会显示当前模式搜索路径中可见的全部对象 — 这等价于用*作为模式(如果一个对象所在的模式位于搜索路径中,并且在搜索路径中该模式之前没有同类且同名的对象,则该对象就是可见的。这表示可以直接用名称引用该对象,而不需要用模式来限定)。要查看数据库中所有对象而不考虑其可见性,可以把*.*用作模式。

如果放在一个模式中,*将匹配任意字符序列(包括空序列),而?会匹配任意的单个字符(这种记号方法就像 Unix shell 的文件名模式一样)。例如,\dt int*会显示名称以int开始的表。但是如果被放在双引号内,*和?就会失去这些特殊含义而变成普通的字符。

包含点号(.)的关系名模式会被解释为模式名匹配模式,后接对象名匹配模式。例如,\dt foo*.*bar* 会显示所有模式名以 foo 开头、表名包含 bar 的表。没有点号时,只匹配当前模式搜索路径中可见的对象。同样,双引号内的点号不具有特殊含义,按字面匹配。包含两个点号(.)的关系名模式会被解释为数据库名,后接模式名匹配模式,再接对象名匹配模式。数据库名部分不作为匹配模式,必须与当前连接的数据库名称相同,否则会报错。

如果用于匹配模式名的模式包含一个点(.),则会被解释为数据库名,后接模式名的匹配模式。例如,\dn mydb.*foo*会显示名称中包含foo的所有模式。数据库名部分不会被当作匹配模式,必须与当前连接的数据库名相同,否则会报错。

高级用户可以使用字符类等正则表达式记法,如[0-9]可以匹配任意数字。所有的正则表达式特殊字符都按照第 9.7.3 节所说的工作,以下字符除外:.会按照上面所说的作为一种分隔符,*会被翻译成正则表达式记号.*,?会被翻译成.,而$则按字面意思匹配。根据需要,可以用?模拟.,用(R+|)模拟R*,或用(R|)模拟R?。$不需要作为一个正则表达式字符,因为模式必须匹配整个名称,而不是像正则表达式的常规用法那样解释(换句话说,$会被自动地追加到模式上)。如果不希望该模式的匹配位置被固定,可以在开头或者结尾写上*。注意在双引号内,所有的正则表达式特殊字符会失去其特殊含义并且按照其字面意思进行匹配。还有,在操作符名称模式中(即作为\do的参数),正则表达式特殊字符也按照字面意思进行匹配。

高级特性

变量

psql提供了和普通 Unix 命令 shell 相似的变量替换特性。变量简单来说就是一对名称/值,其中值可以是任意长度的任意字符串。名称必须由字母(包括非拉丁字母)、数字和下划线构成。

要设置一个变量,可以使用psql的元命令\set。例如,

testdb=> \set foo bar

会将foo设置为值bar。要检索该变量的内容,可以在名称前放一个冒号,例如:

testdb=> \echo :foo
bar

这在常规 SQL 命令和元命令中均有效,下文的SQL 插值中有更多细节。

如果调用\set时没有第二个参数,该变量会被设置为一个空字符串值。要取消设置(即删除)一个变量,可以使用命令\unset。要显示所有变量的值,在调用\set时不带任何参数即可。

注意

\set的参数服从与其他命令相同的替换规则。因此可以构造有趣的引用,例如\set :foo 'something'以及分别得到Perl或者PHP的“软链接”或者“可变变量”。不幸的是(或者幸运的是?),这些构造出来的东西并没有什么用处。在另一方面,\set bar :foo是一种很好的拷贝变量的方法。

有一些变量会被psql特殊对待。它们表示特定的选项设置,运行时这类选项设置可以通过修改该变量的值来改变,或者在某些情况下它们表示psql的可更改的状态。按照惯例,所有被特殊对待的变量的名称由全部大写形式的 ASCII 字母(还有可能是数字和下划线)组成。为了确保未来最大的兼容性,最好避免把这类变量名用于自己的目的。

控制psql行为的变量通常不能被取消设置或者设置为无效值。允许\unset命令,但它会被解释为将变量设置为它的默认值。没有第二参数的\set命令会被解释为将变量设置为on(对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值on和off的控制变量也能接受其他常见的布尔值拼写方式,例如true和false。

被特殊对待的变量是:

AUTOCOMMIT

在被设置为on(默认)时,每一个 SQL 命令在成功完成时会被自动提交。在这种模式中要推迟提交,必须输入一个BEGIN或者START TRANSACTION SQL 命令。当被设置为off或者被取消设置时,在显式发出COMMIT或者END之前,SQL 命令不会被提交。自动提交关闭模式会为你发出一个隐式的BEGIN,这会发生在命令执行之前,前提是该命令不在事务块中,且其本身既不是BEGIN或其他事务控制命令,也不是无法在事务块中执行的命令(例如VACUUM)。

注意

在自动提交关闭模式中,必须通过ABORT或者ROLLBACK显式地放弃任何失败的事务。还要记住,如果退出会话时没有提交,则所有的工作都会丢失。

注意

自动提交打开模式是PostgreSQL的传统行为,但是自动提交关闭模式更接近于 SQL 的规范。如果更喜欢自动提交关闭模式,可以在系统级的psqlrc文件或者个人的~/.psqlrc文件中设置它。

COMP_KEYWORD_CASE

确定在补全一个 SQL 关键词时要使用的大小写形式。如果被设置为lower或者upper,补全后的词将分别是小写或者大写形式。如果被设置为preserve-lower或者preserve-upper(默认),补全后的词将会保持该词已输入部分的大小写形式,但是如果被补全的词还没有被输入,则它会被分别补全成小写或者大写形式。

DBNAME

当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者取消设置。

ECHO

如果被设置为all,所有非空输入行会在读入时打印到标准输出(不适用于交互式读取的行)。要在程序开始时选择这种行为,可以使用开关-a。如果被设置为queries,psql会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e。如果被设置为errors,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b。如果被设置为none(默认值)则不会显示任何查询。

ECHO_HIDDEN

当这个变量被设置为on且一个反斜线命令查询数据库时,相应的查询会被先显示。这种特性可以帮助我们学习PostgreSQL的内部并且在自己的程序中提供类似的功能(要在程序开始时选择这种行为,可以使用开关-E)。如果把这个变量设置为值noexec,则对应的查询只会被显示而并不真正被发送给服务器执行。默认值是off。

ENCODING

当前的客户端字符集编码。每一次你连接到一个数据库(包括程序启动)时以及当你用\encoding更改编码时,这个变量都会被设置,但它可以被更改或者取消设置。

ERROR

如果上一个SQL查询失败则为true,如果成功则是false。另见SQLSTATE。

FETCH_COUNT

如果这个变量被设置为一个大于零的整数值,SELECT查询的结果会以一组一组的方式取出并且显示(而不是像默认的那样把整个结果集拿到以后再显示),每组包含的行数等于该整数值。因此,这种方式只会使用有限的内存量,而不管整个结果集的大小。在启用这个特性时,通常会使用 100 到 1000 的设置。记住在使用这种特性时,一个查询可能会在已经显示了一些行之后失败。

提示

尽管可以把这种特性用于任何的输出格式,但是默认的aligned格式看起来会比较糟糕,因为每一组的FETCH_COUNT行将被单独格式化,这就会导致不同的行组的列宽不同。其他的输出格式会更好。

HIDE_TABLEAM

如果此变量设置为true,则不显示表的访问方法的详细信息。这主要用于回归测试。

HIDE_TOAST_COMPRESSION

如果这个变量被设置为true,不显示列压缩方法的细节。这主要用于回归测试。

HISTCONTROL

如果这个变量被设置为ignorespace,则以一个空格开始的行不会被放入到历史列表中。如果被设置为值ignoredups,则与上一条历史记录相同的行不会被放入。值ignoreboth组合了上述两种值。如果被设置为none(默认值),所有在交互模式中被读入的行都会保存在历史列表中。

注意

这个特性是可耻地从Bash抄袭过来的。

HISTFILE

该文件名将被用于存储历史列表。如果未设置该变量,文件名将从PSQL_HISTORY环境变量中取得。如果该环境变量也没有被设置,则默认值是~/.psql_history,在Windows上是%APPDATA%\postgresql\psql_history。例如,

\set HISTFILE ~/.psql_history-:DBNAME

放在~/.psqlrc中将会导致psql为每一个数据库维护一个单独的历史。

注意

这个特性是可耻地从Bash抄袭过来的。

HISTSIZE

命令历史中最多保存的命令数(默认 500)。设为负值时,不设上限。

注意

这个特性是可耻地从Bash抄袭过来的。

HOST

当前连接到的数据库服务器主机。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或取消设置。

IGNOREEOF

如果设为 1 或更小的值,向 psql 交互会话发送 EOF 字符(通常为 Control + D)就会终止应用。如果设为更大的数值,则必须连续输入相应次数的 EOF 字符才会终止交互会话。如果变量设为非数值,会被解释为 10。默认值为 0。

注意

这个特性是可耻地从Bash抄袭过来的。

LASTOID

最近一次受影响的 OID 值,由 INSERT 或 \lo_import 命令返回。此变量仅保证在下一条 SQL 命令的结果显示之前有效。从版本 12 起,PostgreSQL 服务器不再支持 OID 系统列,因此连接到这些服务器时,执行 INSERT 后 LASTOID 始终为 0。

LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE

当前psql会话中最近一个失败查询的主错误消息和相关的SQLSTATE代码,如果在当前会话中没有发生错误,则是一个空字符串和00000。

ON_ERROR_ROLLBACK

当被设置为on时,如果事务块中的一个语句产生一个错误,该错误会被忽略并且该事务会继续。当被设置为interactive时,只在交互式会话中忽略这类错误,而读取脚本文件时则不会忽略错误。当被设置为off(默认值)时,事务块中产生错误的一个语句会中止整个事务。错误回滚模式的工作原理是在事务块的每个命令之前都为你发出一个隐式的SAVEPOINT,然后在该命令失败时回滚到该保存点。

ON_ERROR_STOP

默认情况下,出错后仍会继续处理命令。将此变量设为 on 后,处理会立即停止。在交互模式下,psql 会返回命令提示符;否则,psql 会退出并返回错误码 3,以区别于错误码 1 所表示的致命错误。无论哪种情况,当前正在运行的所有脚本(如果存在顶层脚本,则包括该脚本及其调用的其他脚本)都会立即终止。如果顶层命令字符串包含多条 SQL 命令,则会在当前命令处停止处理。

PIPELINE_COMMAND_COUNT

正在运行的管道中排队的命令数。

PIPELINE_RESULT_COUNT

正在进行的管道中,有多少条命令后面跟着 \flushrequest 或 \syncpipeline,从而强制服务器发送结果。这些结果可以通过 \getresults 取回。

PIPELINE_SYNC_COUNT

正在运行的管道中排队的同步消息数量。

PORT

当前连接到的数据库服务器端口。每次连接到数据库时都会设置该变量(包括程序启动时),但也可以被更改或取消设置。

PROMPT1
PROMPT2
PROMPT3

这些变量指定psql发出的提示符的模样。见下文的提示符。

QUIET

把这个变量设置为on等效于命令行选项-q。在交互模式下可能用处不大。

ROW_COUNT

最近一条 SQL 查询返回或影响的行数;如果查询失败或没有报告行数,则为 0。

SERVER_VERSION_NAME
SERVER_VERSION_NUM

字符串形式的服务器版本号,例如9.6.2、10.1或者11beta1,以及数字形式的服务器版本号,例如90602或者100001。每次你连接到一个数据库(包括程序启动)时,这些都会被设置,但可以被改变或者取消设置。

SERVICE

服务名称(如果适用)。

SHELL_ERROR

如果最后一个 shell 命令失败,则为 true;如果成功,则为 false。这适用于通过 \!、\g、\o、\w 和 \copy 元命令调用的 shell 命令,也适用于反引号(`)扩展。请注意,对于 \o,该变量会在下一个 \o 命令关闭输出管道时更新。另见 SHELL_EXIT_CODE。

SHELL_EXIT_CODE

最后一个 shell 命令返回的退出状态。0–127 表示程序退出码,128–255 表示因信号而终止,-1 表示未能启动程序或未能取得其退出状态。这适用于通过 \!、\g、\o、\w 和 \copy 元命令调用的 shell 命令,也适用于反引号(`)扩展。请注意,对于 \o,该变量会在下一个 \o 命令关闭输出管道时更新。另见 SHELL_ERROR。

SHOW_ALL_RESULTS

当此变量被设为 off 时,组合查询(\;)只显示最后一个结果,而不是显示全部结果。默认值为 on。设为 off 的行为是为了兼容旧版本的 psql。

SHOW_CONTEXT

这个变量可以被设置为值never、errors或者always来控制是否在来自服务器的消息中显示CONTEXT字段。默认是errors(表示在错误消息中显示上下文,但在通知和警告消息中不显示)。当VERBOSITY被设置为terse或sqlstate时,这个设置无效(另见\errverbose,它可以用来得到刚遇到的错误的详细信息)。

SINGLELINE

设置这个变量为on等效于命令行选项-S。

SINGLESTEP

设置这个变量为on等效于命令行选项-s。

SQLSTATE

与上一个SQL查询的失败相关的错误代码(见附录 A),如果上一个查询成功则为00000。

USER

当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者取消设置。

VERBOSITY

这个变量可以被设置为值default、verbose、terse或者sqlstate来控制错误报告的详细程度(另见\errverbose,在想得到刚遇到的错误的详细信息时使用)。

VERSION
VERSION_NAME
VERSION_NUM

这些变量在程序启动时被设置以反映psql的版本,分别是一个详细的字符串、一个短字符串(例如9.6.2、10.1或者11beta1)以及一个数字(例如90602或者100001)。它们可以被更改或取消设置。

WATCH_INTERVAL

此变量设置\watch在两次执行查询之间等待的默认间隔,单位为秒。默认值为 2 秒。若在命令中指定了间隔,则会覆盖此变量。

SQL 插值

psql变量的一个关键特性是可以把它们替换(“插值”)到常规SQL语句中,也可以把它们替换到元命令的参数中。此外,psql还提供了功能来确保被用作 SQL 字面量和标识符的变量值会被正确地加引号。不加引号地插值一个值的语法是在变量名前面加上一个冒号(:)。例如,

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;

将查询表my_table。注意这可能会不安全:该变量的值会被按字面拷贝,因此它可能包含不平衡的引号甚至反斜线命令。必须确保把它放在那里是有意义的。

当一个值要用作 SQL 字面量或标识符时,最安全的做法是为它加上引号。要将变量值作为 SQL 字面量加引号,应写一个冒号,后面跟用单引号括起来的变量名。要将变量值作为 SQL 标识符加引号,则在冒号后面用双引号括起变量名。这些写法能正确处理变量值中嵌入的引号和其他特殊字符。前面的示例可用以下更安全的写法:

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";

在加引号的SQL字面量和标识符内部,不会执行变量插值。因此,':foo'这样的写法不能根据变量值生成加引号的字面量(即使能够生效,也不安全,因为它无法正确处理变量值中嵌入的引号)。

使用这种机制的一个示例是把一个文件的内容拷贝到一个表列中。首先把该文件载入到一个变量,然后把该变量的值作为一个加引号的字符串进行插值:

testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');

(注意如果my_file.txt包含 NUL 字节,这样也不行。psql不支持在变量值中嵌入 NUL 字节)。

因为冒号可以合法地出现在 SQL 命令中,看似插值的写法(即:name、:'name'或者:"name")不会被替换,除非所指的变量当前已设置。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。

:{?name}特殊语法会根据该变量是否存在返回 TRUE 或 FALSE,因此总是会被替换,除非冒号被反斜线转义。

变量的冒号语法对嵌入式查询语言(例如ECPG)来说是标准的SQL。用于数组切片和类型转换的冒号语法是PostgreSQL扩展,它有时可能会与标准用法冲突。把一个变量值转义成 SQL 字面量或者标识符的冒号加引号语法是一种psql扩展。

提示符

psql 发出的提示符可以按你的喜好进行定制。PROMPT1、PROMPT2 和 PROMPT3 这三个变量包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 请求新命令时发出的常规提示符。提示符 2 会在录入命令期间还需要更多输入时发出,例如命令尚未以分号结束,或者引号尚未闭合时。在执行 SQL COPY FROM STDIN 命令并需要在终端中输入一行值时,会发出提示符 3。

选中的提示符变量值会按字面输出,除非遇到百分号(%)。根据下一个字符的不同,会替换成某些其他文本。已定义的替换如下:

%M

数据库服务器的完整主机名(含域名);如果通过 Unix 域套接字连接,则为[local];如果 Unix 域套接字不在编译时指定的默认位置,则为[local:/dir/name]。

%m

数据库服务器的主机名,在第一个点号处截断;如果通过 Unix 域套接字连接,则为[local]。

%>

数据库服务器监听的端口号。

%n

数据库会话用户名。(在数据库会话期间,SET SESSION AUTHORIZATION命令可能改变该值的扩展结果。)

%s

服务名称。

%/

当前数据库的名称。

%~

类似 %/,但如果该数据库是你的默认数据库,则输出 ~(波浪号)。

%#

如果会话用户是数据库超级用户,则为#,否则为>。(在数据库会话期间,SET SESSION AUTHORIZATION命令可能改变该值的扩展结果。)

%p

当前所连接后端的进程 ID。

%P

管道状态:不在管道中时为 off,在进行中的管道中时为 on,在已中止的管道中时为 abort。

%R

在提示符 1 中,通常显示 =;但如果会话处于条件块中未激活的分支,则显示 @;如果处于单行模式,则显示 ^;如果会话已断开数据库连接(例如 \connect 失败时),则显示 !。在提示符 2 中,%R 会替换为表示 psql 等待更多输入原因的字符:命令尚未结束时为 -;存在未结束的 /* ... */ 注释时为 *;存在未结束的带引号字符串时为单引号;存在未结束的带引号标识符时为双引号;存在未结束的美元引用字符串时为美元符号;存在未匹配的左括号时为 (。在提示符 3 中,%R 不产生任何内容。

%x

事务状态:如果当前不在事务块中,则为空字符串;如果处于事务块中,则为 *;如果处于失败的事务块中,则为 !;如果事务状态不确定(例如因为当前没有连接),则为 ?。

%l

当前语句中的行号,从 1 开始。

%digits

替换为指定八进制代码对应的字符。

%:name:

psql 变量 name 的值。详见上面的变量。

%`command`

command 的输出,类似普通的“反引号”替换。

%[ ... %]

提示符中可以包含终端控制字符,例如改变提示文本的颜色、背景或样式,或者改变终端窗口标题。为了让 Readline 的行编辑功能正常工作,这些不可打印的控制字符必须用 %[ 和 %] 包围起来,以标记为不可见字符。提示符中可以出现多组这样的标记。例如:

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '

其效果是在兼容 VT100 且支持颜色的终端上,生成一个粗体(1;)的黑底黄字提示符(33;40)。

%w

与最近一次输出的 PROMPT1 具有相同宽度的空白。这可用作 PROMPT2 的设置,使多行语句与第一行对齐,但不显示可见的二级提示符。

要在提示符中插入百分号,请写 %%。提示符 1 和 2 的默认值为 '%/%R%x%# ',提示符 3 的默认值为 '>> '。

注意

这个特性是可耻地从tcsh抄袭过来的。

命令行编辑

如果可用,psql 会使用Readline或libedit库,以便进行便捷的行编辑和历史检索。当psql退出时,命令历史会自动保存;当psql启动时,又会重新载入。输入上箭头或 control-P 可以取回之前的行。

在许多(绝非全部)上下文中,还可以使用 TAB 补全部分输入的关键字和 SQL 对象名。例如,在命令开头输入ins并按下 TAB 键,会补全为insert into 。然后输入表名或模式名的几个字符,再按下TAB键,就会补全尚未输完的名称;如果有多个候选项,则会给出可能的补全菜单。(具体取决于所使用的库,可能需要按多次TAB键才能看到菜单。)

对 SQL 对象名进行 TAB 补全时,需要向服务器发送查询来查找可能的匹配项。在某些上下文中,这可能会干扰其他操作。例如,在BEGIN之后,如果中间发出了一次 TAB 补全查询,那么再发出SET TRANSACTION ISOLATION LEVEL就为时已晚了。如果根本不想使用 TAB 补全,可以把下面的内容放到主目录中名为.inputrc的文件里,从而永久关闭它:

$if psql
set disable-completion on
$endif

(这不是psql而是一个Readline功能。阅读其文档以获取更多详细信息。)

-n(--no-readline)命令行选项也可用于在单次运行psql时禁用 Readline。这会阻止TAB 补全、命令行历史的使用或记录,以及多行命令的编辑。当你需要复制粘贴包含 TAB 字符的文本时,它尤其有用。

环境

COLUMNS

如果\pset columns为零,这个环境变量控制用于wrapped格式的宽度以及用来确定较宽的输出是否需要分页器,或者是否应切换到扩展自动模式中的垂直格式的宽度。

PGDATABASE
PGHOST
PGPORT
PGUSER

默认连接参数(见第 32.15 节)。

PG_COLOR

指定诊断消息是否使用颜色。可选值为 always、auto和 never。

PSQL_EDITOR
EDITOR
VISUAL

\e、\ef以及\ev命令所使用的编辑器。会按照列出的顺序检查这些变量,第一个被设置的将被使用。如果都没有被设置,默认是使用Unix系统上的vi或者Windows系统上的notepad.exe。

PSQL_EDITOR_LINENUMBER_ARG

当 \e、\ef 或 \ev 带有行号参数使用时,此变量指定将起始行号传给用户编辑器时所用的命令行参数。对于 Emacs 或 vi 之类的编辑器,这个参数是一个加号。如果选项名和行号之间需要空格,请在变量值中包含末尾空格。例如:

PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '

在 Unix 系统上默认是+(对应于默认编辑器vi,且对很多其他常见编辑器可用)。在 Windows 系统上没有默认值。

PSQL_HISTORY

命令历史文件的替代位置。波浪线(~)扩展会被执行。

PSQL_PAGER
PAGER

如果查询结果无法在屏幕上显示完整,它们会通过管道传给此命令。典型的值是more或less。可以通过将PSQL_PAGER或PAGER设置为空字符串,或通过调整\pset命令的与分页相关的选项来禁用分页器。这些变量按照列出的顺序进行检查;使用按该顺序找到的第一个已设置的变量。如果它们都没有设置,默认情况下在大多数平台上使用more,但在Cygwin上使用less。

PSQL_WATCH_PAGER

使用 \watch 命令反复执行查询时,默认不使用分页程序。在 Unix 系统上,可以将 PSQL_WATCH_PAGER 设为分页程序命令来改变此行为。pspg 分页程序(不属于 PostgreSQL,但许多开源软件发行版都提供它)以 --stream 选项启动时,可以显示 \watch 的输出。

PSQLRC

用户的.psqlrc文件的替代位置。波浪线(~)扩展会被执行。

SHELL

被\!命令执行的命令。

TMPDIR

存储临时文件的目录。默认是/tmp。

与大多数其他 PostgreSQL 工具一样,此工具也使用 libpq 支持的环境变量(见第 32.15 节)。

文件

psqlrc 和 ~/.psqlrc

如果没有-X选项,在连接到数据库后但在接收正常的命令之前,psql会尝试依次从系统级的启动文件(psqlrc)和用户的个人启动文件(~/.psqlrc)中读取并且执行命令。这些文件可以被用来设置客户端或者服务器,通常是一些\set和SET命令。

系统范围的启动文件名为 psqlrc。默认情况下,会在安装的“系统配置”目录中查找它,最可靠的识别方式是运行 pg_config --sysconfdir。通常这个目录是相对于包含 PostgreSQL 可执行文件的目录的 ../etc/。也可以通过 PGSYSCONFDIR 环境变量显式指定查找目录。

用户的个人启动文件名为.psqlrc,并且在调用用户的主目录中寻找。在Windows上,个人启动文件的名称改为%APPDATA%\postgresql\psqlrc.conf。在任何情况下,可以通过设置PSQLRC环境变量来覆盖此默认文件路径。

系统范围的启动文件和用户个人的启动文件都可以通过在文件名后附加连字符和PostgreSQL的大版本或小版本标识符来使其与psql版本相关,例如~/.psqlrc-18或~/.psqlrc-18.6。最具体版本匹配的文件将优先读取,而不是非特定版本的文件。这些版本后缀是在确定文件路径后添加的,如上所述。

.psql_history

命令行历史被存储在文件~/.psql_history中,在 Windows 上则存储在文件%APPDATA%\postgresql\psql_history中。

历史文件的位置可以通过HISTFILE psql变量或者PSQL_HISTORY环境变量显式设置。

注解

  • psql最适合与相同或较旧大版本的服务器配合使用。如果服务器的版本比psql本身更新,反斜线命令特别容易失败。然而,\d系列的反斜线命令应该可以在最低至 9.2 版本的服务器上运行,但不一定适用于比psql本身更新的服务器。运行SQL命令和显示查询结果的一般功能也应该可以在更新大版本的服务器上运行,但不能保证在所有情况下都能实现。

    如果你想用psql连接到多个具有不同大版本的服务器,推荐使用最新版本的psql。或者,你可以为每一个大版本保留一份psql拷贝,并且针对相应的服务器使用匹配的版本。但实际上,这种额外的麻烦是不必要的。

  • 在 PostgreSQL 9.6 之前,-c 选项意味着 -X(--no-psqlrc);现在已经不是这样了。

  • 在PostgreSQL 8.4 之前,psql允许一个单字母反斜线命令的第一个参数直接写在该命令后面,中间不需要空白。现在则要求用空白分隔。

给 Windows 用户的注解

psql是一个“控制台应用”。由于 Windows 的控制台窗口使用的是一种和系统中其他应用不同的编码,在psql中使用 8 位字符时要特别注意。如果psql检测到一个有问题的控制台代码页,它将会在启动时警告你。要更改控制台代码页,有两件事是必要的:

  • 输入cmd.exe /c chcp 1252可以设置代码页(1252 是适用于德语的一个代码页,请在这里替换成你的值)。如果正在使用 Cygwin,可以把这个命令放在/etc/profile中。

  • 把控制台字体设置为Lucida Console,因为栅格字体无法与 ANSI 代码页一起使用。

示例

第一个示例展示了如何把一条命令分散到多行输入中。注意提示符的变化:

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text)
testdb-> ;
CREATE TABLE

现在再来看一下这个表的定义:

testdb=> \d my_table
              Table "public.my_table"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 first  | integer |           | not null | 0
 second | text    |           |          |

现在我们把提示符改成更有趣的形式:

testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>

假设你已经向表中填入数据,并想看一看:

peter@localhost testdb=> SELECT * FROM my_table;
 first | second
-------+--------
     1 | one
     2 | two
     3 | three
     4 | four
(4 rows)

你可以使用 \pset 命令以不同方式显示表格:

peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
    1 one
    2 two
    3 three
    4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format csv
Output format is csv.
peter@localhost testdb=> \pset tuples_only
Tuples only is on.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep '\t'
Field separator is "    ".
peter@localhost testdb=> SELECT second, first FROM my_table;
one     1
two     2
three   3
four    4

或者使用短命令:

peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

此外,可以使用\g为一个查询设置这些输出格式选项:

peter@localhost testdb=> SELECT * FROM my_table
peter@localhost testdb-> \g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

下面是一个使用 \df 命令只查找名称匹配 int*pl 且第二个参数类型为 bigint 的函数的示例:

testdb=> \df int*pl * bigint
                          List of functions
   Schema   |  Name   | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
 pg_catalog | int28pl | bigint           | smallint, bigint    | func
 pg_catalog | int48pl | bigint           | integer, bigint     | func
 pg_catalog | int8pl  | bigint           | bigint, bigint      | func
(3 rows)

这里,+ 选项用于显示其中一个函数的附加信息,而 x 用于以扩展模式显示结果:

testdb=> \df+x int*pl integer bigint
List of functions
-[ RECORD 1 ]-------+-----------------------------
Schema              | pg_catalog
Name                | int48pl
Result data type    | bigint
Argument data types | integer, bigint
Type                | func
Volatility          | immutable
Parallel            | safe
Owner               | postgres
Security            | invoker
Leakproof?          | no
Access privileges   |
Language            | internal
Internal name       | int48pl
Description         | implementation of + operator

在适合的情况下,可以使用 \crosstabview 命令将查询结果显示为交叉表:

testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;
 first | second | gt2
-------+--------+-----
     1 | one    | f
     2 | two    | f
     3 | three  | t
     4 | four   | t
(4 rows)

testdb=> \crosstabview first second
 first | one | two | three | four
-------+-----+-----+-------+------
     1 | f   |     |       |
     2 |     | f   |       |
     3 |     |     | t     |
     4 |     |     |       | t
(4 rows)

第二个示例展示了一个乘法表,其中行按数字倒序排列,而列按独立的升序数字排列。

testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
testdb-> row_number() over(order by t2.first) AS ord
testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb-> \crosstabview "A" "B" "AxB" ord
 A | 101 | 102 | 103 | 104
---+-----+-----+-----+-----
 4 | 404 | 408 | 412 | 416
 3 | 303 | 306 | 309 | 312
 2 | 202 | 204 | 206 | 208
 1 | 101 | 102 | 103 | 104
(4 rows)

相关条目

文档与源码

来源构建
版本
18.6
构建
https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
来源指纹
ee8d1a3612338fd9adf250730cb640fcc5233b5491337cc00a316a44e3a0b9f8

版本比较

PostgreSQL 16 → 17: 属性变化。

以下差异保留原始字段名与英文源描述。

--- PostgreSQL 16
+++ PostgreSQL 17
@@ -5,7 +5,7 @@
       "name": "COLUMNS"
     },
     {
-      "description": "Default connection parameters (see Section 34.15 ).",
+      "description": "Default connection parameters (see Section 32.15 ).",
       "name": "PGDATABASE PGHOST PGPORT PGUSER"
     },
     {
@@ -71,7 +71,7 @@
       "signature": "-b --echo-errors"
     },
     {
-      "description": "Specifies that psql is to execute the given command string, command . This option can be repeated and combined in any order with the -f option. When either -c or -f is specified, psql does not read commands from standard input; instead it terminates after processing all the -c and -f options in sequence. command must be either a command string that is completely parsable by the server (i.e., it contains no psql -specific features), or a single backslash command. Thus you cannot mix SQL and psql meta-commands within a -c option. To achieve that, you could use repeated -c options or pipe the string into psql , for example: psql -c '\\x' -c 'SELECT * FROM foo;' or echo '\\x \\\\ SELECT * FROM foo;' | psql ( \\\\ is the separator meta-command.) Each SQL command string passed to -c is sent to the server as a single request. Because of this, the server executes it as a single transaction even if the string contains multiple SQL commands, unless there are explicit BEGIN / COMMIT commands included in the string to divide it into multiple transactions. (See Section 55.2.2.1 for more details about how the server handles multi-query strings.) If having several commands executed in one transaction is not desired, use repeated -c commands or feed multiple commands to psql 's standard input, either using echo as illustrated above, or via a shell here-document, for example: psql <<EOF \\x SELECT * FROM foo; EOF",
+      "description": "Specifies that psql is to execute the given command string, command . This option can be repeated and combined in any order with the -f option. When either -c or -f is specified, psql does not read commands from standard input; instead it terminates after processing all the -c and -f options in sequence. command must be either a command string that is completely parsable by the server (i.e., it contains no psql -specific features), or a single backslash command. Thus you cannot mix SQL and psql meta-commands within a -c option. To achieve that, you could use repeated -c options or pipe the string into psql , for example: psql -c '\\x' -c 'SELECT * FROM foo;' or echo '\\x \\\\ SELECT * FROM foo;' | psql ( \\\\ is the separator meta-command.) Each SQL command string passed to -c is sent to the server as a single request. Because of this, the server executes it as a single transaction even if the string contains multiple SQL commands, unless there are explicit BEGIN / COMMIT commands included in the string to divide it into multiple transactions. (See Section 53.2.2.1 for more details about how the server handles multi-query strings.) If having several commands executed in one transaction is not desired, use repeated -c commands or feed multiple commands to psql 's standard input, either using echo as illustrated above, or via a shell here-document, for example: psql <<EOF \\x SELECT * FROM foo; EOF",
       "names": [
         "-c command",
         "--command= command"

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

相关条目

导出 JSON · 返回命令行工具 · 收录范围为 PostgreSQL 10 至 20;最早采样版本不一定是实际引入版本。