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

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 9.6 已结束支持。 2021-11-11. 请参阅 当前版本手册.

psql

psql — PostgreSQL的交互式终端

大纲

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

描述

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

选项

-a
--echo-all

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

-A
--no-align

切换到非对齐输出模式(默认输出模式是对齐的)。

-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类似。

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

-T table_options
--table-attr=table_options

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

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

-X,
--no-psqlrc

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

-z
--field-separator-zero

设置非对齐输出的字段分隔符为零字节。

-0
--record-separator-zero

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

-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设置为适当的值来少敲一些键盘(额外的环境变量见第 32.14 节)。另外,准备一个~/.pgpass文件也很方便,这样就不必经常手工输入密码。详见第 32.15 节。

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

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

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

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

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

输入 SQL 命令

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

$ psql testdb
psql (9.6.24)
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(十六进制)。在单引号文本内,反斜线出现在任何其他字符前面时,只是对该单个字符进行转义,不论它是什么字符。

在参数中,用反引号(`)包围的文本会被视为传给 shell 的命令行。该命令的输出(去掉末尾的换行符)会替换反引号中的文本。

如果在参数中出现一个未加引号的冒号(:),后面紧跟一个psql变量名,它就会被该变量的值替换,如下面SQL 插值所述。

有些命令把SQL标识符(例如表名)作为参数。这些参数遵循SQL的语法规则:未加引号的字母会被强制转换为小写,而双引号(")可以保护字母不发生大小写转换,并允许在标识符中包含空白。在双引号内,成对的双引号会在结果名称中折叠成一个双引号。例如,FOO"BAR"BAZ会被解释为fooBARbaz,而"A weird"" name"会变成A weird" name。

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

定义了以下元命令:

\a

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

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

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

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

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

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

例如:

=> \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命令。特别是,psql的变量替换规则和反斜线转义在这里不适用。

提示

另一种获得与\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命令为对象创建描述。

\ddp [ pattern ]

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

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

\dD[S+] [ pattern ]

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

\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命令用于定义角色专属和数据库专属的配置设置。

\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的正常规则重新解析新的查询缓冲区,其中整个缓冲区被视为一行。(因此,不能用这种方式编写脚本。应使用\i来处理这类脚本。)这意味着,如果查询以分号结束(或包含分号),它会立即执行;否则它只会在查询缓冲区中等待;键入分号或\g发送它,或键入\r取消。

如果指定了行号,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会将光标定位到函数体中的指定行。(请注意,函数体通常并不从文件的第一行开始。)

提示

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

\encoding [ encoding ]

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

\errverbose

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

\ev [ view_name [ line_number ] ]

这个命令获取并编辑指定视图的定义,形式为CREATE OR REPLACE VIEW命令。编辑方式与\edit相同。编辑器退出后,更新后的命令会在查询缓冲区中等待;输入分号或\g发送它,或用\r取消。

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

如果指定了行号,psql会将光标定位到视图定义中的指定行。

\f [ string ]

设置非对齐查询输出的字段分隔符。默认值是竖线(|)。另请参见 \pset,那里介绍了设置输出选项的通用方法。

\g [ filename ]
\g [ |command ]

将当前查询输入缓冲区发送给服务器,并且可以选择将查询输出存储到filename,或通过管道把输出传给 shell 命令command。只有查询成功返回零个或更多元组时,才会向文件或命令写入内容;如果查询失败或 SQL 命令不返回数据,则不会写入。

单独的\g基本上等同于一个分号。带有参数的\g提供了一个“一次性”替代\o命令的选择。

\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,则取消设置对应的变量,而不是设置它。

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

\h 或 \help [ command ]

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

注意

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

\H 或 \html

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

\i 或 \include filename

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

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

注意

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

\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。如果没有指定参数,查询输出将恢复为标准输出。

“查询结果”包括从数据库服务器获取的所有表格、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\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。

\sv[+] view_name

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

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

\t

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

\T table_options

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

\timing [ on | off ]

不带参数时,切换以毫秒为单位显示每条 SQL 语句执行耗时的开关状态。带参数时,设置为相同的值。

\unset name

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

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

将当前查询缓冲区输出到文件filename,或通过管道传递给 shell 命令command。

\watch [ seconds ]

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

\x [ on | off | auto ]

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

\z [ pattern ]

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

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

\! [ command ]

进入一个单独的 shell,或执行 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 字母(还有可能是数字和下划线)组成。为了确保未来最大的兼容性,最好避免把这类变量名用于自己的目的。

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,则对应的查询只会被显示而并不真正被发送给服务器执行。

ENCODING

当前的客户端字符集编码。

FETCH_COUNT

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

提示

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

HISTCONTROL

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

注意

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

HISTFILE

用于存储历史记录列表的文件名。默认值是~/.psql_history。例如,将以下内容:

\set HISTFILE ~/.psql_history- :DBNAME

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

注意

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

HISTSIZE

存储在命令历史中的命令数量。默认值是 500。

注意

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

HOST

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

IGNOREEOF

如果未设置,向一个psql的交互式会话发送一个EOF字符(通常是Control+D)将会终止应用。如果设置为一个数字值,则会有该数量的EOF字符被忽略,然后应用才会终止。如果该变量被设置但没有数字值,则默认为 10。

注意

这个特性是可耻地从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。在交互模式下可能用处不大。

SHOW_CONTEXT

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

SINGLELINE

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

SINGLESTEP

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

USER

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

VERBOSITY

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

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

默认连接参数(见第 32.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所支持的环境变量(见第 32.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中。

历史文件的位置可以通过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 "my_table"
 Attribute |  Type   |      Modifier
-----------+---------+--------------------
 first     | integer | not null default 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)

报告文档问题

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