PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

psql

psql — PostgreSQL 的交互式终端

Synopsis

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 特有的功能),或者是一个单独的反斜杠命令。因此,SQL 和 psql 元命令不能混用在同一个 -c 选项中。要达到这个目的,你可以使用多个 -c 选项,或者把字符串通过管道传给 psql,例如:

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

或者

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

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

每个 SQL 命令字符串在被传递给 -c 时,都会作为一个单独的请求被发送到服务器。正因如此,即使该字符串包含多条 SQL 命令,服务器也会把它当做一个事务来执行,除非字符串中显式地包含 BEGIN/COMMIT 命令把它划分成多个事务。(有关服务器如何处理多查询字符串的更多细节,请参见 Section 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 可以是一个 connection string(连接字符串)。如果是这样,连接字符串参数将覆盖任何与之冲突的命令行选项。

-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 进行行编辑,也不使用命令历史(参见下文的 the section called “命令行编辑”)。

-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 命令。

Note

提供这种模式是为了满足那些坚持使用它的人,但并不一定鼓励你使用它。特别是,如果你在一行中混用 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 域套接字连接到本地主机上的服务器,在 Windows 上则通过 TCP/IP 连接到 localhost。默认端口号在编译时确定。由于数据库服务器使用相同的默认值,在大多数情况下你不必指定端口。默认的数据库用户名是你的操作系统用户名。一旦数据库用户名确定下来,它就会被用作默认的数据库名。注意,你不能以任意的数据库用户名连接到任意的数据库。你的数据库管理员应该已经把你的访问权限告知了你。

当默认值不太合适时,你可以通过把环境变量 PGDATABASE、PGHOST、PGPORT 和/或 PGUSER 设置为适当的值来省去一些输入。(关于更多的环境变量,请参见 Section 32.15。)另外,拥有一个 ~/.pgpass 文件也很方便,可以避免经常性地输入密码。更多信息请参见 Section 32.16。

指定连接参数的另一种方式是在 conninfo 字符串或 URI 中给出,它们将取代数据库名被使用。这种机制让你可以对连接进行非常广泛的控制。例如:

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

通过这种方式,你还可以使用 LDAP 进行连接参数查找,如 Section 32.18 中所述。有关所有可用连接选项的更多信息,请参见 Section 32.1.2。

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

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

输入 SQL 命令

在正常操作中,psql 提供的提示符中带有 psql 当前所连接数据库的名称,后跟字符串 =>。例如:

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

testdb=>

在提示符处,用户可以键入 SQL 命令。通常,当到达终止命令的分号时,输入行就会被发送到服务器。一行的结束并不会终止一条命令。因此,为了清晰起见,命令可以分散在多行中。如果命令被发送并执行且没有出错,命令的结果就会显示在屏幕上。

如果不可信的用户可以访问一个尚未采用 secure schema usage pattern(安全的模式使用模式)的数据库,请在开始会话时从 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 Interpolation 中所述。那里描述的 :'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 等)。

Example:

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

这也适用于 \g 之外的其他查询执行命令,例如 \gx 和 \gset。

这个命令会让扩展查询协议(见 Section 54.1.2)被使用,而正常的 psql 操作使用的是简单查询协议。因此,这个命令对于从 psql 测试扩展查询协议很有用。(即使查询没有参数且此命令指定了零个参数,也会使用扩展查询协议。)这个命令只影响下一次执行的查询;所有后续查询默认仍会使用简单查询协议。

\bind_named statement_name [ parameter ] ... #

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

Example:

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

这个命令会让扩展查询协议(见 Section 54.1.2)被使用,而正常的 psql 操作使用的是简单查询协议。因此,这个命令对于从 psql 测试扩展查询协议很有用。

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

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

把 dbname、username、host 或 port 指定为 - 等价于省略该参数。

新连接可以复用上一个连接的连接参数;不仅是数据库名、用户、主机和端口,还包括诸如 sslmode 之类的其他设置。默认情况下,位置语法会复用参数,但给定 conninfo 字符串时则不会。传递第一个参数 -reuse-previous=on 或 -reuse-previous=off 将覆盖该默认行为。如果复用参数,那么任何没有作为位置参数或在 conninfo 字符串中显式指定的参数都将取自现有连接的参数。一个例外是,如果使用位置语法把 host 设置改成了与之前不同的值,那么现有连接参数中存在的任何 hostaddr 设置都会被丢弃。另外,只有当用户、主机和端口设置都没有改变时,现有连接使用的密码才会被复用。当命令既不指定也不复用某个特定参数时,将使用 libpq 的默认值。

如果新连接成功建立,上一个连接就会被关闭。如果连接尝试失败(用户名错误、访问被拒绝等),在 psql 处于交互模式时会保留上一个连接。但在执行非交互式脚本时,旧连接会被关闭并报告一个错误。这可能会也可能不会终止脚本;如果没有终止,那么在另一个 \connect 命令成功执行之前,所有访问数据库的命令都会失败。这种区别的选定是出于用户便利的考虑:一方面防止拼写错误,另一方面作为一种安全机制,防止脚本意外地作用于错误的数据库。注意,每当 \connect 命令尝试复用参数时,被复用的值是上一次成功连接的值,而不是其后任何失败尝试的值。但是,在非交互式的 \connect 失败的情况下,之后不允许复用任何参数,因为脚本很可能期望复用失败的 \connect 所使用的值。

Examples:

=> \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。不带参数时,更改到当前用户的主目录。关于如何找到主目录的详细信息,请参见 Section 32.16。

Tip

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

\close_prepared prepared_statement_name #

关闭指定的预备语句。空字符串表示未命名的预备语句。如果不存在具有该名称的预备语句,则该操作是一个空操作。

Example:

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 的参数,并且在参数中既不进行变量插值,也不进行反引号展开。

Tip

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

Tip

这些操作的效率不如带有文件或程序数据源/目的地的 SQL COPY 命令,因为所有数据都必须通过客户端/服务器连接。对于大量数据来说,SQL 命令可能更可取。

显示 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 值排序后出现在水平表头中。

在交叉表网格内,对于每个不同的 x 值(来自 colH)和每个不同的 y 值(来自 colV),位于交叉点 (x,y) 处的单元格包含 colD 列在该查询结果行中的值,该行满足 colH 的值为 x 且 colV 的值为 y。如果不存在这样的行,该单元格为空。如果存在多个这样的行,则会报告一个错误。

\d[Sx+] [ pattern ] #

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

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

命令形式 \d+ 与之相同,但会显示更多信息:会显示与表的列相关联的任何注释,以及表中是否存在 OID;如果该关系是视图,还会显示视图定义;以及非默认的 replica identity(复制标识)设置和 access method(访问方法)名称(如果该关系有访问方法)。

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

Note

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

与许多其他命令一样,如果在命令名后面附加了 x,结果将以扩展模式显示,但请注意,这只适用于 \d 在没有 pattern 参数的情况下使用时,并且 x 修饰符不能紧跟在 \d 之后(因为 \dx 是另一条命令);x 修饰符只能出现在 S 或 + 修饰符之后。例如,\d+x 等价于 \dtvmsE+x,将以扩展模式显示所有关系的列表。

\da[Sx] [ pattern ] #

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

\dA[x+] [ pattern ] #

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

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

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

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

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

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

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

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

列出与操作符族相关联的支持函数(见 Section 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 命令用于设置默认访问特权。特权显示的含义在 Section 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,结果将以扩展模式显示。如果在命令名后面附加了 +,每个对象会连同其持久性状态(永久、临时或非日志)、磁盘上的物理大小以及关联的描述(如果有)一起列出。如果指定了 pattern,则只列出名称匹配该模式的对象。默认情况下只显示用户创建的对象;提供一个模式或 S 修饰符可以包含系统对象。

\des[x+] [ pattern ] #

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

\det[x+] [ pattern ] #

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

\deu[x+] [ pattern ] #

列出用户映射(助记:“外部用户”)。如果指定了 pattern,则只列出用户名匹配该模式的映射。如果在命令名后面附加了 x,结果将以扩展模式显示。如果在命令名后面附加了 +,会显示关于每个映射的额外信息。

Caution

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

\dew[x+] [ pattern ] #

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

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

列出函数,以及它们的结果数据类型、参数数据类型和函数类型,函数类型被分类为 “agg”(聚集)、“normal”(普通)、“procedure”(过程)、“trigger”(触发器)或 “window”(窗口)。要只显示特定类型的函数,可以在命令后面加上相应的字母 a、n、p、t 或 w。如果指定了 pattern,则只显示名称匹配该模式的函数。任何额外的参数都是类型名模式,它们会与该函数的第一个、第二个等等参数的类型名进行匹配。(匹配的函数可以拥有比你指定的更多的参数。要防止这种情况,请把一个短划线 - 写在最后一个 arg_pattern 的位置。)默认情况下只显示用户创建的对象;提供一个模式或 S 修饰符可以包含系统对象。如果在命令名后面附加了 x,结果将以扩展模式显示。如果在命令名后面附加了 +,会显示关于每个函数的额外信息,包括易变性、并行安全性、所有者、安全分类、是否防泄漏、访问特权、语言、内部名称(仅适用于 C 和内部函数)以及描述。可以使用 \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 命令用于设置访问特权。特权显示的含义在 Section 5.8 中解释。

\dP[itnx+] [ pattern ] #

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

如果使用了修饰符 n(“嵌套”)或者指定了一个模式,那么非根分区关系也会被包括进来,并且会显示一列来展示每个分区关系的父级。

如果在命令名后面附加了 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 表示未请求它。你可以使用 pg_stats_ext 来了解是否运行过 ANALYZE 以及统计信息是否可供规划器使用。

\dy[x+] [ pattern ] #

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

\e or \edit [ filename ] [ line_number ] #

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

如果你编辑了一个文件或上一次的查询,并且在未修改文件的情况下退出了编辑器,查询缓冲区会被清空。否则,查询缓冲区的新内容会按照 psql 的正常规则重新解析,把整个缓冲区视为单独的一行。任何完整的查询都会被立即执行;也就是说,如果查询缓冲区包含分号或者以分号结尾,那么到该位置为止的所有内容都会被执行并从查询缓冲区中移除。查询缓冲区中剩余的内容会被重新显示。键入分号或 \g 来发送它,或键入 \r 通过清空查询缓冲区来取消它。

把缓冲区视为单独的一行主要影响元命令:元命令之后缓冲区中的任何内容都会被当作该元命令的参数,即使它跨越多行。(因此,你无法用这种方式编写使用元命令的脚本。为此请使用 \i。)

如果指定了行号,psql 会把光标定位到文件或查询缓冲区的指定行。注意,如果给出了一个全由数字组成的单一参数,psql 会认为它是行号而不是文件名。

Tip

关于如何配置和自定义你的编辑器,请参见下文的 Environment。

\echo text [ ... ] #

把经过求值的参数打印到标准输出,以空格分隔,并在后面跟一个换行符。这对于在脚本的输出中穿插信息很有用。例如:

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

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

Tip

如果你使用 \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 的参数,并且在参数中既不进行变量插值,也不进行反引号展开。

Tip

关于如何配置和自定义你的编辑器,请参见下文的 Environment。

\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 处理。(把 ECHO 设置为 all 或 queries 在使用 \gexec 时通常是明智的。)查询日志记录、单步模式、计时以及其他查询执行特性也同样适用于每个生成的查询。

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

\gset [ prefix ] #

把当前查询缓冲区发送到服务器,并把查询的输出存储到 psql 变量中(参见下文 Variables)。要执行的查询必须正好返回一行。该行的每一列都被存储到一个单独的变量中,变量名与该列的名称相同。例如:

=> 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,不同之处在于它强制这个查询使用扩展输出模式,就像 expanded=on 被包含在 \pset 选项列表中一样。另请参见 \x。

\h or \help [ command ] #

给出指定的 SQL 命令的语法帮助。如果没有指定 command,那么 psql 将列出所有可以提供语法帮助的命令。如果 command 是一个星号(*),则会显示所有 SQL 命令的语法帮助。

与大多数其他元命令不同,该行其余的全部内容总是被当作 \help 的参数,并且在参数中既不进行变量插值,也不进行反引号展开。

Note

为了简化输入,由多个词组成的命令不必加引号。因此,键入 \help alter table 是可以的。

\H or \html #

开启 HTML 查询输出格式。如果 HTML 格式已经开启,则会切换回默认的对齐文本格式。这个命令是为了兼容性和方便性而提供的,但设置其他输出选项请参见 \pset。

\i or \include filename #

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

如果 filename 是 -(连字符),那么会一直读取标准输入,直到出现 EOF 指示或者 \q 元命令。这可以用来把交互式输入与来自文件的输入穿插在一起。注意,只有当 Readline 在最外层处于活动状态时,才会使用 Readline 行为。

Note

如果你想在读取这些行时在屏幕上看到它们,你必须把变量 ECHO 设置为 all。

\if expression
\elif expression
\else
\endif #

这组命令实现了可嵌套的条件块。一个条件块必须以 \if 开始并以 \endif 结束。在其中可以有任意数量的 \elif 子句,它们后面可以选择性地跟一个单独的 \else 子句。普通查询和其他类型的反斜杠命令可以(而且通常会)出现在构成条件块的各命令之间。

\if 和 \elif 命令会读取它们的参数并把它们作为布尔表达式求值。如果表达式得到 true,则正常继续处理;否则,会跳过一些行,直到到达匹配的 \elif、\else 或 \endif。一旦某个 \if 或 \elif 测试成功,同一块中后面的 \elif 命令的参数就不会被求值,而是被当作 false。跟在 \else 之后的行仅在没有更早的匹配 \if 或 \elif 成功时才会被处理。

expression 参数(属于某个 \if 或 \elif 命令)会像任何其他反斜杠命令参数一样接受变量插值和反引号展开。在此之后,它会像一个开/关选项变量的值那样被求值。因此,一个有效的值是对 true、false、1、0、on、off、yes、no 中某一个的无歧义的大小写不敏感匹配。例如,t、T 和 tR 都会被认为是 true。

不能正确求值为 true 或 false 的表达式会产生一个警告并被当作 false。

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

一个给定条件块的所有反斜杠命令必须出现在同一个源文件中。如果在主输入文件或某个被 \include 的文件中,在所有本地 \if 块被关闭之前到达了 EOF,那么 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 or \include_relative filename #

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

\l[x+] or \list[x+] [ pattern ] #

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

\lo_export loid filename #

从数据库中读取具有 OID loid 的大对象,并将其写入 filename。注意,这与服务器函数 lo_export 有着细微的不同,后者以数据库服务器运行时所用的用户的权限进行操作,并且作用于服务器的文件系统。

Tip

使用 \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,以后可以使用它来访问这个新创建的大对象。为了便于阅读,建议始终为每个对象关联一个人类可读的注释。OID 和注释都可以用 \lo_list 命令查看。

注意,这个命令与服务器端的 lo_import 有着细微的不同,因为它以本地用户的身份在本地文件系统上操作,而不是以服务器的用户和文件系统操作。

\lo_list[x+] #

显示当前存储在数据库中的所有 PostgreSQL 大对象的列表,以及为它们提供的任何注释。如果在命令名后面附加了 x,结果将以扩展模式显示。如果在命令名后面附加了 +,每个大对象会连同其关联的权限(如果有)一起列出。

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

Tip

使用 \lo_list 可以找出大对象的 OID。

\o or \out [ filename ]
\o or \out [ |command ] #

安排把未来的查询结果保存到文件 filename 中,或者把未来的结果通过管道传给 shell 命令 command。如果没有指定参数,查询输出会被重置为标准输出。

如果参数以 | 开头,那么该行其余的全部内容都会被视为要执行的 command,并且在其中既不进行变量插值,也不进行反引号展开。该行的其余部分会被原样传递给 shell。

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

Tip

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

\p or \print #

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

\parse statement_name #

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

Example:

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

columns #

设置 wrapped 格式的目标宽度,同时也是判断输出是否宽到需要使用分页器,或在扩展自动模式下切换为垂直显示的宽度限制。零(默认值)会让目标宽度由环境变量 COLUMNS 控制;如果未设置 COLUMNS,则使用检测到的屏幕宽度。此外,如果 columns 为零,那么 wrapped 格式只影响屏幕输出。如果 columns 非零,那么文件和管道输出也会按该宽度折行。

csv_fieldsep #

指定 CSV 输出格式中使用的字段分隔符。如果分隔符字符出现在某个字段的值中,则按照标准的 CSV 规则,该字段将以双引号括起来的形式输出。默认值是一个逗号。

expanded (or x) #

如果指定了 value,它必须是 on 或 off(用于启用或禁用扩展模式),或者是 auto。如果省略 value,该命令会在 on 与 off 设置之间切换。启用扩展模式后,查询结果将以两列显示,左边是列名,右边是数据。如果数据在正常的“水平”模式下无法在屏幕上完整显示,这种模式就很有用。在 auto 设置下,只要查询输出多于一列并且宽于屏幕,就会使用扩展模式;否则使用常规模式。auto 设置只在 aligned 和 wrapped 格式中有效。在其他格式中,它的表现总是如同扩展模式被关闭一样。

fieldsep #

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

fieldsep_zero #

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

如果指定了 value,它必须是 on 或 off,用于启用或禁用表尾(即 (n rows) 计数)的显示。如果省略 value,该命令会切换表尾显示的开启与关闭。

format #

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

aligned 格式是标准的、人类可读的、格式良好的文本输出;这是默认格式。

unaligned 格式把一行的所有列写在一行上,以当前生效的字段分隔符分隔。这对于创建供其他程序读取的输出很有用,例如制表符分隔或逗号分隔格式。但是,如果字段分隔符字符出现在某个列的值中,它不会被特殊处理;因此 CSV 格式可能更适合这类用途。

csv 格式 写出以逗号分隔的列值,并应用 RFC 4180 中描述的加引号规则。此输出与服务器的 COPY 命令的 CSV 格式兼容。除非 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 字符在能识别它们的显示器上看起来更美观。

null #

设置用于代替空值打印的字符串。默认是什么都不打印,这很容易被误认为是空字符串。例如,可以改用 \pset null '(null)'。

numericlocale #

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

pager #

控制对查询和 psql 帮助输出使用分页器程序。当 pager 选项为 off 时,不使用分页器程序。当 pager 选项为 on 时,会在合适的时候使用分页器,也就是当输出到终端并且无法在屏幕上完整显示时。pager 选项还可以设置为 always,这会使得所有终端输出都使用分页器,而不管它是否能放进一屏。\pset pager 在不带 value 时,会切换分页器使用的开启与关闭。

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

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

pager_min_lines #

如果 pager_min_lines 被设置为一个大于页面高度的数字,那么除非要显示的输出至少有这么多的行数,否则不会调用分页器程序。默认设置为 0。

recordsep #

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

recordsep_zero #

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

tableattr (or T) #

在 HTML 格式中,此选项指定要放在 table 标签内部的属性。例如可以是 cellpadding 或 bgcolor。注意,你可能不想在这里指定 border,因为这已经由 \pset border 负责处理了。如果没有给定 value,表属性将被取消设置。

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

title (or C) #

为之后打印的所有表设置表标题。这可以用来给你的输出加上描述性的标签。如果没有给定 value,标题将被取消设置。

tuples_only (or 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 或一个 integer value。

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

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

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

integer value:指定表头行的确切最大宽度。

这些不同格式的外观示例可以在下文的 Examples 中看到。

Tip

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

\q or \quit #

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

\qecho text [ ... ] #

此命令与 \echo 相同,只是输出会被写到由 \o 设置的查询输出通道中。

\r or \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 变量的名称和值。

有效的变量名可以包含字母、数字和下划线。详情请参见下文的 Variables。变量名区分大小写。

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

Note

此命令与 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 命令,它们会发出一个 sync message,而不会结束正在进行的流水线,也不会冲刷发送缓冲区。在流水线模式中,语句被发送到服务器,而不需要等待之前语句的结果。更多细节请参见 Section 32.5。

在流水线进行期间执行的所有查询都使用扩展查询协议。以分号结尾的查询会被追加到流水线中。元命令 \bind、\bind_named、\close_prepared 或 \parse 可以在正在进行的流水线中使用。在流水线进行期间,\sendpipeline 会把当前查询缓冲区追加到流水线中。其他元命令(例如 \g、\gx 或 \gdesc)在流水线模式中是不允许使用的。

\flushrequest 会向流水线追加一个冲刷命令,使得可以用 \getresults 读取结果,而不必发出 sync 或结束流水线。\getresults 会自动把未发送的数据推送到服务器。\flush 可用于手动推送未发送的数据。

\getresults 接受一个可选的 number_results 参数。如果提供了该参数,则只会读取前 number_results 个待处理的结果。如果没有提供该参数或者它为 0,则会读取所有待处理的结果。

当流水线模式处于活动状态时,有一个专用的提示符变量可用于报告流水线状态。更多细节请参见 %P

在流水线模式中不支持 COPY。

Example:

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

\t #

切换输出列名标题和行数表尾的显示。此命令等效于 \pset tuples_only,是为了方便而提供的。

\T table_options #

指定要放在 table 标签内的属性,用于 HTML 输出格式。此命令等效于 \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 命令会被解释为把它们设置为各自的默认值。参见下文的 Variables。

\w or \write filename
\w or \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 命令把它划分成多个事务。(关于服务器如何处理多查询字符串的更多细节,请参见 Section 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* 会显示所有表名包含 bar、并且所在模式的模式名以 foo 开头的表。当没有出现点时,该匹配模式只匹配在当前模式搜索路径中可见的对象。同样,双引号内的点会失去其特殊含义,将按字面匹配。包含两个点(.)的关系匹配模式会被解释为一个数据库名后跟一个模式名匹配模式再跟一个对象名匹配模式。数据库名部分不会被当作匹配模式,它必须与当前连接的数据库的名称相匹配,否则会产生一个错误。

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

高级用户可以使用正则表达式表示法,例如字符类,比如 [0-9] 用于匹配任意数字。所有正则表达式的特殊字符都按照 Section 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 Interpolation。

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

Note

\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 或未设置时,SQL 命令在你显式发出 COMMIT 或 END 之前不会被提交。自动提交关闭模式的工作方式是:为你发出一个隐式的 BEGIN,它位于任何尚未处于事务块中、其本身也不是 BEGIN 或其他事务控制命令、也不是不能在事务块中执行的命令(例如 VACUUM)之前。

Note

在自动提交关闭模式中,你必须通过输入 ABORT 或 ROLLBACK 来显式放弃任何失败的事务。还要记住,如果你在没有提交的情况下退出会话,你的工作将会丢失。

Note

自动提交开启模式是 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。请记住,使用此功能时,查询可能在已经显示了一些行之后才失败。

Tip

虽然此功能可以使用任何输出格式,但默认的 aligned 格式往往效果不佳,因为每组 FETCH_COUNT 行都会被单独格式化,导致各行组之间的列宽不一致。其他输出格式的效果更好。

HIDE_TABLEAM #

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

HIDE_TOAST_COMPRESSION #

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

HISTCONTROL #

如果此变量被设置为 ignorespace,则以空格开头的行不会进入历史列表。如果设置为值 ignoredups,则与前一条历史记录相同的行不会进入。值 ignoreboth 结合了这两个选项。如果设置为 none(默认值),则以交互模式读取的所有行都会保存到历史列表中。

Note

此功能无耻地剽窃自 Bash。

HISTFILE #

用于存储历史列表的文件名。如果未设置,文件名取自 PSQL_HISTORY 环境变量。如果它也没有被设置,则默认为 ~/.psql_history,在 Windows 上则是 %APPDATA%\postgresql\psql_history。例如,把:

\set HISTFILE ~/.psql_history-:DBNAME

放入 ~/.psqlrc 会让 psql 为每个数据库维护单独的历史记录。

Note

此功能无耻地剽窃自 Bash。

HISTSIZE #

命令历史中存储的命令数上限(默认 500)。如果设置为负值,则不施加限制。

Note

此功能无耻地剽窃自 Bash。

HOST #

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

IGNOREEOF #

如果设置为 1 或更小,把一个 EOF 字符(通常是 Control+D)发送到 psql 的交互会话将终止该应用程序。如果设置为更大的数值,则必须连续输入那么多个 EOF 字符才能使交互会话终止。如果此变量被设置为非数值,它将被解释为 10。默认值为 0。

Note

此功能无耻地剽窃自 Bash。

LASTOID #

最后一个受影响的 OID 的值,由 INSERT 或 \lo_import 命令返回。只保证此变量在下一条 SQL 命令的结果显示之前有效。PostgreSQL 12 及以后版本的服务器不再支持 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 发出的提示符应有的外观。参见下面的 Prompting。

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。关闭时的行为是为了与旧版本的 psql 保持兼容。

SHOW_CONTEXT #

此变量可以设置为值 never、errors 或 always,以控制是否在来自服务器的消息中显示 CONTEXT 字段。默认值为 errors(表示上下文会显示在错误消息中,但不会显示在通知或警告消息中)。当 VERBOSITY 被设置为 terse 或 sqlstate 时,此设置没有效果。(另请参阅 \errverbose,当你想要刚才得到的错误的详细版本时可以使用它。)

SINGLELINE #

将此变量设置为 on 等同于命令行选项 -S。

SINGLESTEP #

将此变量设置为 on 等同于命令行选项 -s。

SQLSTATE #

与上一条 SQL 查询失败相关联的错误代码(参见 Appendix 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,因此它总是会被替换,除非冒号被反斜杠转义。

用于变量的冒号语法是标准的 SQL,ECPG 等嵌入式查询语言就使用这种语法。用于数组切片和类型转换的冒号语法是 PostgreSQL 的扩展,它们有时会与标准用法冲突。用于把变量的值转义为 SQL 字面量或标识符的冒号加引号语法是 psql 的扩展。

提示符

psql 发出的提示符可以根据你的偏好进行定制。三个变量 PROMPT1、PROMPT2 和 PROMPT3 包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 请求一条新命令时发出的普通提示符。提示符 2 是在命令输入期间预期还要更多输入时发出的,例如因为命令没有用分号终止,或者一个引号没有闭合。提示符 3 是在你正在运行 SQL COPY FROM STDIN 命令并且需要在终端上键入一个行值时发出的。

所选提示符变量的值将按原样输出,除非遇到百分号(%)。根据下一个字符的不同,某些其他的文本将被替换输出。定义的替换包括:

%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 的值。详情请参见上面的 Variables。

%`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 是 '>> '。

Note

此功能无耻地剽窃自 tcsh。

命令行编辑

psql 使用 Readline 或 libedit 库(如果可用)来实现方便的行编辑和检索。命令历史会在 psql 退出时自动保存,并在 psql 启动时重新加载。按上箭头键或 control-P 可以取回先前的行。

在许多(绝不是所有)上下文中,你还可以使用制表符补全来补全只输入了一部分的关键字和 SQL 对象名称。例如,在一条命令的开头,键入 ins 并按下 TAB 会补全为 insert into 。然后,键入表名或模式名的前几个字符并按下 TAB,会补全未完成的名称,或者当存在多个可能的补全时提供一个菜单。(根据所使用的库,你可能需要按不止一次 TAB 才能得到菜单。)

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

$if psql
set disable-completion on
$endif

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

命令行选项 -n(--no-readline)对于禁用 Readline 也很有用,例如在只是临时运行一次 psql 的时候。这会禁用制表符补全、命令行历史的使用和记录,以及多行命令的编辑。当你需要复制粘贴包含 TAB 字符的文本时,它特别有用。

环境

COLUMNS #

如果 \pset columns 为零,则控制 wrapped 格式的宽度,以及判断宽输出是需要分页器还是在扩展自动模式下应切换为垂直格式时所用的宽度。

PGDATABASE
PGHOST
PGPORT
PGUSER #

默认连接参数(参见 Section 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,但在许多开源软件发行版中都可以获得)可以显示 \watch 的输出,前提是用 --stream 选项启动它。

PSQLRC #

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

SHELL #

由 \! 命令执行的命令。

TMPDIR #

用于存储临时文件的目录。默认值为 /tmp。

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

文件

psqlrc and ~/.psqlrc #

除非传入了 -X 选项,否则 psql 会在连接到数据库之后、接受普通命令之前,尝试从系统范围的启动文件(psqlrc)以及用户的个人启动文件(~/.psqlrc)读取并执行命令。这些文件可以用来按照用户的喜好设置客户端和/或服务器,通常使用 \set 和 SET 命令。

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

用户的个人启动文件名为 .psqlrc,会在调用用户的家目录中查找。在 Windows 上,个人启动文件则名为 %APPDATA%\postgresql\psqlrc.conf。无论哪种情况,都可以通过设置 PSQLRC 环境变量来覆盖这个默认文件路径。

系统范围启动文件和用户的个人启动文件都可以被做成 psql 版本专属的,方法是在文件名后面追加一个短横线以及 PostgreSQL 的主版本或次版本标识,例如 ~/.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)