↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

psql

psql — PostgreSQL 的交互式终端

大纲

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

描述

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

选项

-a
--echo-all

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

-A
--no-align

切换到非对齐输出模式(默认输出模式是对齐的)。这等效于\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 命令将其分成多个事务。此外,psql 只打印字符串中最后一条 SQL 命令的结果。这与从文件读取同一字符串或将其送入 psql 标准输入时的行为不同,因为在这些情况下,psql 会分别发送每条 SQL 命令。

由于这种行为,在单个 -c 字符串中放入多条 SQL 命令常常会产生意外结果。最好重复使用 -c 命令,或将多条命令送入 psql 的标准输入,可以像上面所示使用 echo,也可以使用 shell 的 here-document,例如:

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

-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 进行行编辑,也不要使用命令历史记录。这有助于在剪切和粘贴时关闭 TAB 补全。

-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 命令,从而将所有命令包装成一个单独的事务。这确保要么所有命令都成功完成,要么不应用任何更改。

如果命令本身包含 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 域套接字的机器上则通过 TCP/IP 连接到 localhost。默认端口号在编译时确定。由于数据库服务器使用相同的默认值,因此在大多数情况下不必指定端口。默认用户名是你的操作系统用户名,默认数据库名也是如此。请注意,你不能随意以任意数据库用户名连接到任意数据库。数据库管理员应当已经告知你拥有的访问权限。

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

指定连接参数的另一种方法是使用一个 conninfo 字符串或一个 URI,它可用来替代数据库名。这种机制可以让你对连接进行非常细致的控制。例如:

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

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

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

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

输入 SQL 命令

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

$ psql testdb
psql (10.23)
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" 形式也同样适用。

在参数中,用反引号(`)包围的文本会被视为传给 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 命令文本的缓冲区。其中既包括先前输入的行,也包括同一行上位于元命令之前的文本。

定义了以下元命令:

\a

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

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

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

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

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

如果成功建立了新连接,则关闭先前的连接。如果连接尝试失败(用户名错误、访问被拒绝等),当 psql 处于交互模式时,会保留先前的连接。但在执行非交互式脚本时,会立即报错并停止处理。这一区别一方面使用户能够方便地应对输入错误,另一方面也作为安全机制,防止脚本意外地作用于错误的数据库。

例如:

=> \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    -- 仅更改 sslmode
=> \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title ]

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

\cd [ directory ]

将当前工作目录更改为 directory。如果没有参数,则切换到当前用户的主目录。

提示

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

\conninfo

输出当前数据库连接的信息。

\copy { table [ ( column_list ) ] | ( query ) } { from | to } { 'filename' | program 'command' | stdin | stdout | pstdin | 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) 处的单元格包含查询结果中 colD 列的值,该结果行的 colH 值为 x,colV 值为 y。如果没有这样的行,单元格为空。如果存在多条这样的行,则报错。

\d[S+] [ pattern ]

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

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

\d+形式的命令与之相同,但会显示更多信息:表各列关联的注释、表中是否存在 OID、视图定义(如果关系是视图),以及非默认的复制标识设置。

默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。

注意

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

\da[S] [ pattern ]

列出聚合函数及其返回类型和操作的数据类型。如果指定了 pattern,则只显示名称匹配该模式的聚合函数。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。

\dA[+] [ pattern ]

列出访问方法。如果指定了 pattern,则只显示名称匹配该模式的访问方法。如果在命令名后附加+,还会列出每个访问方法关联的处理器函数和描述。

\db[+] [ pattern ]

列出表空间。如果指定了 pattern,则只显示名称匹配该模式的表空间。如果在命令名后附加+,还会列出每个表空间关联的选项、磁盘大小、权限和描述。

\dc[S+] [ pattern ]

列出字符集编码之间的转换。如果指定了 pattern,则只列出名称匹配该模式的转换。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果在命令名后附加+,还会列出每个对象关联的描述。

\dC[+] [ pattern ]

列出类型转换。如果指定了 pattern,则只列出源类型或目标类型匹配该模式的类型转换。如果在命令名后附加+,还会列出每个对象关联的描述。

\dd[S] [ pattern ]

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

\dd 显示匹配 pattern 的对象的描述;如果没有给出参数,则显示适当类型的可见对象的描述。但无论哪种情况,都只列出有描述的对象。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。

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

\dD[S+] [ pattern ]

列出域。如果指定了 pattern,则只显示名称匹配该模式的域。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果在命令名后附加+,还会列出每个对象关联的权限和描述。

\ddp [ pattern ]

列出默认访问权限设置。对于默认权限设置已偏离内置默认值的每个角色(以及模式,如果适用),都会显示一个条目。如果指定了 pattern,则只列出角色名或模式名匹配该模式的条目。

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

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

在这组命令中,字母 E、i、m、s、t 和 v 分别代表外部表、索引、物化视图、序列、表和视图。可以按任意顺序指定这些字母中的任意一个或全部,以获取相应类型的对象列表。例如,\dit 列出索引和表。如果在命令名后附加+,还会列出每个对象的磁盘上的物理大小以及关联的描述(如果有)。如果指定了 pattern,则只列出名称匹配该模式的对象。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。

\des[+] [ pattern ]

列出外部服务器(助记词:“external servers”)。如果指定了 pattern,则只列出名称匹配该模式的服务器。如果使用\des+形式,则显示每个服务器的完整说明,包括服务器的 ACL、类型、版本、选项和描述。

\det[+] [ pattern ]

列出外部表(助记词:“external tables”)。如果指定了 pattern,则只列出表名或模式名匹配该模式的条目。如果使用\det+形式,还会显示通用选项和外部表描述。

\deu[+] [ pattern ]

列出用户映射(助记词:“external users”)。如果指定了 pattern,则只列出用户名匹配该模式的映射。如果使用\deu+形式,还会显示每个映射的附加信息。

小心

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

\dew[+] [ pattern ]

列出外部数据包装器(助记词:“external wrappers”)。如果指定了 pattern,则只列出名称匹配该模式的外部数据包装器。如果使用\dew+形式,还会显示外部数据包装器的 ACL、选项和描述。

\df[antwS+] [ pattern ]

列出函数及其结果数据类型、参数数据类型和函数类型。函数类型分为“agg”(聚合)、“normal”、“trigger”或“window”。要仅显示特定类型的函数,可在命令中添加对应的字母 a、n、t 或 w。如果指定了 pattern,则只显示名称匹配该模式的函数。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果使用\df+形式,还会显示每个函数的附加信息,包括易变性、并行安全性、拥有者、安全分类、访问权限、语言、源代码和描述。

提示

要查找接受特定数据类型参数或返回特定数据类型值的函数,请使用分页器的搜索功能浏览\df 输出。

\dF[+] [ pattern ]

列出全文检索配置。如果指定了 pattern,则只显示名称匹配该模式的配置。如果使用\dF+形式,则显示每个配置的完整说明,包括底层全文检索解析器和每种解析器词元类型的词典列表。

\dFd[+] [ pattern ]

列出全文检索词典。如果指定了 pattern,则只显示名称匹配该模式的词典。如果使用\dFd+形式,还会显示每个选中词典的附加信息,包括底层全文检索模板和选项值。

\dFp[+] [ pattern ]

列出全文检索解析器。如果指定了 pattern,则只显示名称匹配该模式的解析器。如果使用\dFp+形式,则显示每个解析器的完整说明,包括底层函数和可识别的词元类型列表。

\dFt[+] [ pattern ]

列出全文检索模板。如果指定了 pattern,则只显示名称匹配该模式的模板。如果使用\dFt+形式,还会显示每个模板的附加信息,包括底层函数名。

\dg[S+] [ pattern ]

列出数据库角色。(由于“用户”和“组”的概念已经统一为“角色”,此命令现在等价于\du。)默认只显示用户创建的角色;提供 S 修饰符可包含系统角色。如果指定了 pattern,则只列出名称匹配该模式的角色。如果使用\dg+形式,还会显示每个角色的附加信息;目前会增加每个角色的注释。

\dl

这是\lo_list 的别名,用于显示大对象列表。

\dL[S+] [ pattern ]

列出过程语言。如果指定了 pattern,则只列出名称匹配该模式的语言。默认只显示用户创建的语言;提供 S 修饰符可包含系统对象。如果在命令名后附加+,还会列出每种语言的调用处理器、验证器、访问权限,以及它是否为系统对象。

\dn[S+] [ pattern ]

列出模式(命名空间)。如果指定了 pattern,则只列出名称匹配该模式的模式。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果在命令名后附加+,还会列出每个对象关联的权限和描述(如果有)。

\do[S+] [ pattern ]

列出操作符及其操作数类型和结果类型。如果指定了 pattern,则只列出名称匹配该模式的操作符。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果在命令名后附加+,还会显示每个操作符的附加信息,目前只包括底层函数名。

\dO[S+] [ pattern ]

列出排序规则。如果指定了 pattern,则只列出名称匹配该模式的排序规则。默认只显示用户创建的对象;提供模式或 S 修饰符可包含系统对象。如果在命令名后附加+,还会列出每个排序规则关联的描述(如果有)。请注意,只会显示可用于当前数据库编码的排序规则,因此同一安装中的不同数据库可能会得到不同结果。

\dp [ pattern ]

列出表、视图和序列及其关联的访问权限。如果指定了 pattern,则只列出名称匹配该模式的表、视图和序列。

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

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

列出已定义的配置设置。这些设置可以特定于角色、特定于数据库,或同时特定于两者。role-pattern 和 database-pattern 分别用于选择要列出的角色和数据库。省略某个模式参数或将其指定为* 时,不会按该参数筛选,还会分别包含不特定于角色或不特定于数据库的设置。

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

\dRp[+] [ pattern ]

列出复制发布。如果指定了 pattern,则只列出名称匹配该模式的发布。如果在命令名后附加+,还会显示与每个发布关联的表。

\dRs[+] [ pattern ]

列出复制订阅。如果指定了 pattern,则只列出名称匹配该模式的订阅。如果在命令名后附加+,还会显示订阅的附加属性。

\dT[S+] [ pattern ]

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

\du[S+] [ pattern ]

列出数据库角色。(由于“用户”和“组”的概念已经统一为“角色”,此命令现在等价于\dg。)默认只显示用户创建的角色;提供 S 修饰符可包含系统角色。如果指定了 pattern,则只列出名称匹配该模式的角色。如果使用\du+形式,还会显示每个角色的附加信息;目前会增加每个角色的注释。

\dx[+] [ pattern ]

列出已安装的扩展。如果指定了 pattern,则只列出名称匹配该模式的扩展。如果使用\dx+形式,则列出属于每个匹配扩展的所有对象。

\dy[+] [ pattern ]

列出事件触发器。如果指定了 pattern,则只列出名称匹配该模式的事件触发器。如果在命令名后附加+,还会列出每个对象关联的描述。

\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 代替这个命令。

\ef [ function_description [ line_number ] ]

这个命令获取并编辑指定函数的定义,形式为 CREATE OR REPLACE FUNCTION 命令。编辑方式与\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 [ filename ]
\g [ |command ]

将当前查询缓冲区发送给服务器执行。如果给出参数,查询输出会写入指定文件或通过管道传递给给定的 shell 命令,而不是按通常方式显示。只有查询成功返回零个或更多元组时,才会向文件或命令写入内容;如果查询失败或 SQL 命令不返回数据,则不会写入。

如果当前查询缓冲区为空,则最近发送的查询将被重新执行。除此之外,没有任何参数的\g 基本上等同于一个分号。带有参数的\g 提供了一个“一次性”替代\o 命令的选择。

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

\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 [ filename ]
\gx [ |command ]

\gx 等价于\g,但会对当前查询强制使用扩展输出模式。参见\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 命令读取其参数,并将其作为布尔表达式求值。如果表达式的值为 true,则正常继续处理;否则,跳过后续行,直到遇到匹配的\elif、\else 或\endif。一旦\if 或\elif 测试成功,同一块中后续\elif 命令的参数就不再求值,而是被视为假。只有前面所有匹配的\if 和\elif 测试都未成功时,才会处理\else 后面的行。

与其他反斜线命令的参数一样,\if 或\elif 命令的 expression 参数会经过变量插值和反引号扩展。随后,按开/关选项变量值的规则对结果求值。因此,有效值是以下值的不区分大小写且无歧义的匹配:true、false、1、0、on、off、yes、no。例如,t、T 和 tR 都会被视为 true。

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

被跳过的行仍会正常解析,以识别查询和反斜线命令,但查询不会发送给服务器,条件命令(\if、\elif、\else、\endif)以外的反斜线命令会被忽略。对于条件命令,只检查嵌套是否合法。被跳过的行中的变量引用不会展开,也不会执行反引号扩展。

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

下面是一个示例:

-- 检查数据库中是否存在两条不同的记录,并将
-- 结果分别存入不同的 psql 变量
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[+] 或 \list[+] [ pattern ]

列出服务器中的数据库,并显示其名称、拥有者、字符集编码和访问权限。如果指定了 pattern,则只列出名称匹配该模式的数据库。如果在命令名后附加+,还会显示数据库大小、默认表空间和描述。(大小信息只对当前用户能够连接的数据库可用。)

\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

列出当前存储在数据库中的所有 PostgreSQL 大对象,以及为它们提供的注释。

\lo_unlink loid

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

提示

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

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

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

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

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

提示

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

\p 或 \print

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

\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,以在数据行之间添加分隔线。

columns

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

expanded(或 x)

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

fieldsep

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

fieldsep_zero

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

footer

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

format

将输出格式设置为 unaligned、aligned、wrapped、html、asciidoc、latex(使用 tabular)、latex-longtable 或 troff-ms 之一。允许使用不产生歧义的缩写。

unaligned 格式将一行的所有列写在同一行上,以当前生效的字段分隔符分隔。这适合创建供其他程序读取的输出(例如制表符分隔或逗号分隔格式)。

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

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

asciidoc、html、latex、latex-longtable 和 troff-ms 格式生成的表格旨在包含在使用相应标记语言的文档中。它们不是完整的文档!这在 HTML 中可能不是必需的,但在 LaTeX 中,则必须有一个完整文档的外层结构。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,输出会通过管道传递给指定的程序。否则,使用与平台有关的默认程序(如 more)。

当 pager 选项为 off 时,不使用分页器程序。当 pager 选项为 on 时,会在适当时使用分页器,即输出目标为终端且内容无法在屏幕上完整显示时。pager 选项也可以设为 always,这样所有终端输出都会使用分页器,无论内容是否能在屏幕上完整显示。不带 value 的\pset pager 会切换分页器的使用状态。

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。

这些不同格式的外观示例可参见示例一节。

提示

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

\q 或 \quit

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

\qecho text [ ... ]

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

\r 或 \reset

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

\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 命令的形式呈现。定义将打印到当前查询输出通道,由\o 设置。

目标函数可以只用名称指定,也可以同时给出名称和参数,例如 foo(integer, text)。如果存在多个同名函数,就必须给出参数类型。

如果在命令名后附加+,则会为输出行编号,函数体的第一行编号为 1。

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

\sv[+] view_name

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

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

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

\t

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

\T table_options

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

\timing [ on | off ]

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

\unset name

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

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

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

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

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

\watch [ seconds ]

重复执行当前查询缓冲区(如同 \g 一样),直到被中断或查询失败。两次执行之间等待指定的秒数(默认 2 秒)。每次查询结果都会带有一个头部,其中包含 \pset title 字符串(如果有)、查询开始时的时间以及延迟间隔。

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

\x [ on | off | auto ]

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

\z [ pattern ]

列出表、视图和序列及其关联的访问权限。如果指定了 pattern,则只列出名称匹配该模式的表、视图和序列。

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

\! [ command ]

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

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

\? [ topic ]

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

模式

很多\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 的所有表。如果没有点号,则该匹配模式只匹配当前模式搜索路径中可见的对象。同样,双引号内的点号会失去其特殊含义,而按字面匹配。

高级用户可以使用字符类等正则表达式记法,如[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 更改编码时,这个变量都会被设置,但它可以被更改或者取消设置。

FETCH_COUNT

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

提示

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

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 命令的结果被显示完之前有效。

ON_ERROR_ROLLBACK

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

ON_ERROR_STOP

默认情况下,发生错误后命令处理会继续。当这个变量被设置为 on 时,处理将立即停止。在交互模式下,psql 会返回到命令提示符;否则,psql 会退出,并返回错误代码 3,以便与错误代码 1 所表示的致命错误区分开来。在两种情况下,任何当前正在运行的脚本(顶层脚本以及它可能调用的其他脚本)都会立即中止。如果顶层命令字符串包含多个 SQL 命令,则会在当前命令处停止处理。

PORT

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

PROMPT1
PROMPT2
PROMPT3

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

QUIET

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

SERVER_VERSION_NAME
SERVER_VERSION_NUM

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

SHOW_CONTEXT

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

SINGLELINE

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

SINGLESTEP

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

USER

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

VERBOSITY

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

VERSION
VERSION_NAME
VERSION_NUM

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

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")不会被替换,除非所指的变量当前已设置。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。

变量的冒号语法对嵌入式查询语言(例如 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 命令可能改变该值的扩展结果。)

%/

当前数据库的名称。

%~

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

%#

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

%p

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

%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)。

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

注意

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

命令行编辑

psql 支持 Readline 库,便于编辑和检索输入行。命令历史记录会在 psql 退出时自动保存,并在 psql 启动时重新载入。也支持 Tab 补全,不过其补全逻辑并不声称自己是 SQL 解析器。Tab 补全生成的查询还可能干扰其他 SQL 命令,例如 SET TRANSACTION ISOLATION LEVEL。如果出于某种原因你不喜欢 Tab 补全,可以将以下内容放入主目录下名为 .inputrc 的文件中,将其关闭:

$if psql
set disable-completion on
$endif

(这不是 psql 的功能,而是 Readline 的功能。更多细节请阅读其文档。)

环境

COLUMNS

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

PAGER

如果查询结果无法在屏幕上完整显示,则会通过管道传递给这个命令。典型值为 more 或 less。默认值取决于平台。可以将 PAGER 设置为空,或使用\pset 命令中与分页器有关的选项来禁用分页器。

PGDATABASE
PGHOST
PGPORT
PGUSER

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

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

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

PSQLRC

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

SHELL

被\!命令执行的命令。

TMPDIR

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

和大部分其他 PostgreSQL 工具一样,这个工具也使用 libpq 所支持的环境变量(见第 33.14 节)。

文件

psqlrc 和 ~/.psqlrc

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

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

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

系统范围的启动文件和用户个人的启动文件都可以通过在文件名后附加连字符和 PostgreSQL 的大版本或小版本号来使其与 psql 版本相关,例如 ~/.psqlrc-9.2 或 ~/.psqlrc-9.2.5。最具体版本匹配的文件将优先读取,而不是非特定版本的文件。

.psql_history

命令行历史被存储在文件 ~/.psql_history 中,或者是 Windows 的文件 %APPDATA%\postgresql\psql_history 中。

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

注解

  • psql 最适合与相同或较旧大版本的服务器配合使用。如果服务器的版本比 psql 本身更新,反斜线命令特别容易失败。然而,\d 系列的反斜线命令应该可以在最低至 7.4 版本的服务器上运行,但不一定适用于比 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 unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep ","
Field separator is ",".
peter@localhost testdb=> \pset tuples_only
Showing only tuples.
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

在适合的情况下,可以使用 \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)

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.