9.3 9.4 9.5 9.6 10 11 12 13 14 15
阿里云PostgreSQL 问题报告 纠错本页面

psql

psqlPostgreSQL的交互式终端

大纲

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选项中混合SQLpsql元命令。要那样做,可以使用多个-c选项或者把字符串用管道输送到psql中,例如:

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

或者

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

\\是分隔符元命令)。

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

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

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

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

-d dbname
--dbname=dbname

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

-e
--echo-queries

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

-E
--echo-hidden

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

-f filename
--file=filename

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

如果filename-(连字符),那么会读取标准输入直到遇见一个 EOF 指示或者\q元命令。这种方式可以用把自多个文件的输入组合成一种交互式输入。不过注意在这种情况下不会使用 Readline(很像指定了-n的情况)。

使用这个选项与psql < filename有细微的不同。通常,两种形式都可以做到我们所期望的,但是使用-f启用了一些好的特性,例如带有行号的错误消息。使用这个选项还有一丝机会可以降低启动开销。在另一方面,使用 shell输入重定向的变体(理论上)保证会得到与手工输入时相同的输出。

-F separator
--field-separator=separator

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

-h hostname
--host=hostname

指定运行服务器的机器的主机名。如果这个值由一个斜线开始,它会被用作 Unix 域套接字的目录。

-H
--html

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

-l
--list

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

在使用这个选项时,psql将连接到数据库postgres,除非在命令行上提及一个不同的数据(选项-d或非选项参数,可能是通过一个服务项,但不能通过一个环境变量)。

-L filename
--log-file=filename

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

-n
--no-readline

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

-o filename
--output=filename

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

-p port
--port=port

指定服务器用于监听连接的 TCP 端口或者本地 Unix 域套接字文件扩展。默认是PGPORT环境变量的值,如果没有设置,则默认为编译时指定的端口号(通常是5432)。

-P assignment
--pset=assignment

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

-q
--quiet

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

-R separator
--record-separator=separator

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

-s
--single-step

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

-S
--single-line

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

注意

这种模式被提供给那些坚持使用它的用户,但是并不一定要使用它。特别地,如果在一行中混合了SQL和元命令,那对于没有经的用户来说,它们的执行顺序可能不总是那么清晰。

-t
--tuples-only

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

-T table_options
--table-attr=table_options

指定要替换HTML table标签的选项。详见\pset tableattr

-U username
--username=username

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

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

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

-V
--version

打印psql版本并且退出。

-w
--no-password

从不发出一个口令提示。如果服务器要求口令认证并且口令不能从其他来源(例如一个.pgpass文件)获得,那儿连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。

注意这个选项将对整个会话保持设置,并且因此它会影响元命令\connect的使用,就像初始的连接尝试那样。

-W
--password

强制psql在连接到一个数据库之前提示要求一个口令,即使口令不会被使用。

如果服务器需要口令认证并且口令不能从其他来源获得,例如 .pgpass 文件,psql 在任何情况下都会提示输入口令。 然而,psql 将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下值得用-W来避免额外的连接尝试。

注意这个选项将对整个会话保持设置,并且因此它会影响元命令\connect的使用,就像初始的连接尝试那样。

-x
--expanded

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

-X
--no-psqlrc

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

-z
--field-separator-zero

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

-0
--record-separator-zero

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

-1
--single-transaction

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

如果命令本身包含BEGINCOMMIT或者ROLLBACK,这个选项将不会得到想要的效果。还有,如果当个命令不能在一个事务块中执行,指定这个选项将导致整个事务失败。

-?
--help[=topic]

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

退出状态

如果psql正常完成,它会向 shell 返回 0。如果它自身发生一个致命错误(例如内存用完、找不到文件),它会返回 1。如果到服务器的连接出问题并且事务不是交互式的,它会返回 2。如果在脚本中发生错误,它会返回 3 并且变量ON_ERROR_STOP会被设置。

用法

连接到数据库

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

当默认值不是很符合实际时,可以把环境变量PGDATABASEPGHOSTPGPORT以及PGUSER设置为适当的值,这样也能节省一些敲打键盘的工作(额外的环境变量可见第 34.15 节)。用一个~/.pgpass文件来避免定期输入密码也很方便。详见第 34.16 节

另一种指定连接参数的方法是用一个conninfo字符串或者一个URI,它可以被用来替代数据库名。这种机制可以让我们对连接具有很广的控制权。例如:

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

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

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

如果标准输入和标准输出都是一个终端,那么psql会把客户端编码设置成auto,这会使psql从区域设置(Unix 系统上的LC_CTYPE环境变量)中检测合适的客户端编码。如果这样不起作用,可以使用环境变量PGCLIENTENCODING覆盖客户端编码。

输入 SQL 命令

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

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

testdb=>

在提示符下,用户可以键入SQL命令。正常情况下,当碰到一个表示命令终结的分号时,输入的行会被发送给服务器。一行的结束并不表示命令的完结。因此,为了清晰,可以把命令散布在多个行上。如果命令被发送并且执行而不产生错误,该命令的结果将会显示在屏幕上。

如果不可信用户对还没有采用安全方案使用模式的一个而数据库拥有访问,通过从search_path移除公共可写的方案来开始你的会话。人们可以在连接字符串中加入options=-csearch_path=或者在其他SQL命令之前发出SELECT pg_catalog.set_config('search_path', '', false)。这种考虑并非专门针对psql,它适用于每一种执行任意SQL命令的接口。

只要执行命令,psql还会测试LISTENNOTIFY产生的异步通知。

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

元命令

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

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

要在一个参数中包括空白,可以将它加上单引号。要在一个参数中包括一个单引号,则需要在文本中写上两个单引号。任何包含在单引号中的东西都服从与 C 语言中\n(新行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(10 进制)以及\xdigits(16 进制)类似的替换规则。单引号内文本中的其他任何字符(不管它是什么)前面的反斜线都没有实际意义(会被忽略)。

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

在一个参数中,封闭在反引号(`)中的文本会被当做一个传递给shell的命令行。该命令的输出(移除任何拖尾的新行)会替换反引号文本。在封闭在反引号的文本中,不会有特别的引号或者其他处理发生,:variable_name的出现除外,其中variable_name是一个会被其值替换的psql变量名。此外,Also, appearances of :'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服务器的新连接。可以使用位置语法(数据库名称、用户、主机和端口中的一个或多个)指定要使用的连接参数,也可以使用详细说明在第 34.1.1 节中的conninfo连接字符串。如果没有给出参数,则使用与之前相同的参数建立新连接。

指定任何dbnameusernamehostport-等同于省略该参数。

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

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

例子:

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

设置作为查询结果打印的任何表格的标题,或取消任何这样的标题。此命令等效于 \pset title title。(此命令的名称源自caption, 因为它以前仅用于设置HTML表格中的标题。)

\cd [ directory ]

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

提示

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

\conninfo

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

\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时,由psql执行command, 并在服务器和客户端之间传递从command传递的数据。 再次强调,执行权限是本地用户的权限,而不是服务器的权限,不需要SQL超级用户权限。

对于\copy ... from stdin,数据行从发出命令的相同源读取, 直到读取\.或流达到EOF为止。此选项对于在 SQL脚本文件中内联填充表格很有用。 对于\copy ... to stdout,输出被发送到与psql 命令输出相同的位置,并且COPY count命令状态 不会被打印(因为它可能会与数据行混淆)。 要读取/写入psql的标准输入或输出,无论当前命令源或\o 选项如何,都可以写from pstdinto pstdout

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

提示

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

提示

这些操作不如SQLCOPY命令与文件或程序数据源或目的地一样高效,因为所有数据必须通过客户端/服务器连接传递。 对于大量数据,SQL命令可能更可取。 另外,由于这种透传方法,在CSV模式下,\copy ... from会错误地将单独一行的\.数据值视为输入结束标记。

\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列的值为xcolV列的值为y。 如果没有这样的行,则单元格为空。如果有多个这样的行,则报告错误。

\d[S+] [ pattern ]

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

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

命令形式\d+与相同,只是显示更多信息:显示与表列相关的任何注释, 表中的OID的存在,如果关系是视图,则显示视图定义,非默认的 复制标识设置以及 如果关系具有访问方法,则显示 访问方法名称。

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

注意

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

\da[S] [ pattern ]

列出聚合函数,以及它们的返回类型和它们操作的数据类型。如果指定pattern, 则只显示名称与模式匹配的聚合函数。默认情况下,只显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。

\dA[+] [ pattern ]

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

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

列出操作符类别 (参见第 38.16.1 节)。 如果指定了access-method-pattern, 则仅列出与名称匹配该模式的访问方法关联的操作符类别。 如果指定了input-type-pattern, 则仅列出与名称匹配该模式的输入类型关联的操作符类别。 如果在命令名称后附加+,则每个操作符类别都将列出其关联的操作符族和所有者。

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

列出操作符族(参见第 38.16.5 节)。 如果指定了access-method-pattern, 则仅列出与名称匹配该模式的访问方法关联的操作符族。 如果指定了input-type-pattern, 则仅列出与名称匹配该模式的输入类型关联的操作符族。 如果在命令名称后附加+,则每个操作符族都将与其所有者一起列出。

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

列出与操作符系列相关联的操作符(参见第 38.16.2 节)。 如果指定了access-method-pattern, 则仅列出与名称匹配该模式的访问方法相关联的操作符系列成员。 如果指定了operator-family-pattern, 则仅列出与名称匹配该模式的操作符系列成员。 如果在命令名称后附加+,则每个操作符将与其排序操作符系列一起列出(如果它是排序操作符)。

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

列表支持与运算符族相关的函数(参见第 38.16.3 节)。 如果指定了access-method-pattern, 则仅列出与名称匹配该模式的访问方法关联的运算符族的函数。 如果指定了operator-family-pattern, 则仅列出与名称匹配该模式的运算符族的函数。 如果在命令名称后附加+,则以其实际参数列表详细显示函数。

\db[+] [ pattern ]

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

\dc[S+] [ pattern ]

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

\dconfig[+] [ pattern ]

列出服务器配置参数及其值。 如果指定了pattern, 则只列出名称与该模式匹配的参数。没有指定pattern, 则只列出设置为非默认值的参数。 (使用\dconfig *查看所有参数。) 如果在命令名称后附加+,则每个参数都会列出其数据类型, 可设置参数的上下文以及访问权限(如果已授予非默认访问权限)。

\dC[+] [ pattern ]

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

\dd[S] [ pattern ]

显示constraintoperator classoperator familyruletrigger类型对象的描述。所有其他注释可以通过相应的反斜杠命令查看这些对象类型。

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

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

\dD[S+] [ pattern ]

列出域。如果指定了pattern, 则仅显示名称与该模式匹配的域。默认情况下,仅显示用户创建的对象; 提供一个模式或S修饰符以包括系统对象。 如果在命令名称后附加+,则每个对象将显示其关联的权限和描述。

\ddp [ pattern ]

列出默认访问权限设置。每个角色(如果适用,还包括模式)的默认权限设置已从内置默认值更改的条目都会显示。 如果指定了pattern,则仅列出角色名称或模式名称与该模式匹配的条目。

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

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

在这组命令中,字母Eimstv 分别代表外部表、索引、物化视图、序列、表和视图。 您可以指定任意或所有这些字母,以任意顺序,以获取这些类型的对象列表。 例如,\dti列出表和索引。 如果在命令名称后附加+,则每个对象都将列出其持久性状态(永久、临时或未记录)、磁盘上的物理大小以及关联的描述(如果有)。 如果指定了pattern,则只列出名称与模式匹配的对象。 默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。

\des[+] [ pattern ]

列出外部服务器(助记符:外部服务器)。 如果指定了pattern,则只列出名称与模式匹配的服务器。 如果使用形式\des+,则会显示每个服务器的完整描述,包括服务器的访问权限、类型、版本、选项和描述。

\det[+] [ pattern ]

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

\deu[+] [ pattern ]

列出用户映射(助记符:外部用户)。 如果指定了pattern,则只列出用户名与模式匹配的映射。 如果使用形式\deu+,则会显示有关每个映射的附加信息。

小心

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

\dew[+] [ pattern ]

列出外部数据包装器(助记符:外部包装器)。 如果指定了模式,则只列出名称与模式匹配的外部数据包装器。 如果使用形式\dew+,还会显示外部数据包装器的访问权限、选项和描述。

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

列出函数及其结果数据类型、参数数据类型和函数类型,这些函数被分类为agg(聚合)、normalproceduretriggerwindow。 要仅显示特定类型的函数,将相应的字母anptw添加到命令中。 如果指定了pattern,则仅显示名称与该模式匹配的函数。 任何额外的参数都是类型名称模式,这些模式与函数的第一个、第二个等参数的类型名称匹配。(匹配的函数可能具有比您指定的更多的参数。为了防止这种情况,将破折号-写为最后一个arg_pattern。) 默认情况下,仅显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。 如果使用形式\df+,将显示有关每个函数的其他信息,包括不稳定性、并行安全性、所有者、安全分类、访问权限、语言、源代码和描述。

\dF[+] [ pattern ]

列出文本搜索配置。 如果指定了pattern, 则只显示名称与该模式匹配的配置。 如果使用形式\dF+,则显示每个配置的完整描述, 包括底层文本搜索解析器和每个解析器标记类型的字典列表。

\dFd[+] [ pattern ]

列出文本搜索字典。 如果指定了pattern, 则只显示名称与该模式匹配的字典。 如果使用形式\dFd+,则会显示有关每个选定字典的 附加信息,包括基础文本搜索模板和选项值。

\dFp[+] [ pattern ]

列出文本搜索解析器。 如果指定了pattern, 则只显示名称与该模式匹配的解析器。 如果使用形式\dFp+,则会显示每个解析器的完整描述, 包括底层函数和识别的标记类型列表。

\dFt[+] [ pattern ]

列出文本搜索模板。 如果指定了pattern, 则只显示名称与该模式匹配的模板。 如果使用形式\dFt+,则会显示有关每个模板的额外信息, 包括底层函数名称。

\dg[S+] [ pattern ]

列出数据库角色。 (由于用户的概念已经统一为角色,因此此命令现在等效于\du。) 默认情况下,只显示用户创建的角色;提供S修饰符以包括系统角色。 如果指定了模式,则只列出名称与模式匹配的角色。 如果使用形式\dg+,则会显示有关每个角色的其他信息;目前这会为每个角色添加注释。

\dl[+]

这是\lo_list的别名,用于显示大对象的列表。 如果在命令名称后添加+, 则每个大对象将显示其关联的权限(如果有)。

\dL[S+] [ pattern ]

列出过程语言。如果指定了pattern, 则仅列出名称与该模式匹配的语言。默认情况下,仅显示用户创建的语言; 添加S修饰符以包括系统对象。如果在命令名称后添加+, 则每种语言都将列出其调用处理程序、验证器、访问权限以及是否为系统对象。

\dn[S+] [ pattern ]

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

\do[S+] [ pattern [ arg_pattern [ arg_pattern ] ] ]

列出了操作符及其操作数和结果类型。 如果指定了pattern,则只列出名称与该模式匹配的操作符。 如果指定了一个arg_pattern,则只列出右操作数类型与该模式匹配的前缀操作符。 如果指定了两个arg_pattern,则只列出参数类型与这些模式匹配的二元操作符。 (或者,对于一元操作符的未使用参数,写-。) 默认情况下,仅显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。 如果在命令名称后附加+,则会显示有关每个操作符的其他信息,目前仅显示基础函数的名称。

\dO[S+] [ pattern ]

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

\dp [ pattern ]

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

GRANTREVOKE 命令用于设置访问权限。权限显示的含义在 第 5.7 节中有解释。

\dP[itn+] [ pattern ]

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

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

如果在命令名称后添加+,则还会显示每个关系分区大小的总和,以及关系的描述。 如果将n+组合在一起,则会显示两个大小:一个包括直接附加的叶分区的总大小,另一个显示所有分区的总大小,包括间接附加的子分区。

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

列出定义的配置设置。这些设置可以是特定于角色、特定于数据库,也可以是两者兼有的。 role-patterndatabase-pattern用于分别选择要列出的特定角色和数据库。 如果省略,或者指定了*,则列出所有设置,包括那些不特定于角色或数据库的设置。

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

\dRp[+] [ pattern ]

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

\dRs[+] [ pattern ]

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

\dT[S+] [ pattern ]

列出数据类型。 如果pattern被指定,只有名称与模式匹配的类型会被列出。 如果在命令名称后添加+,每种类型将被列出其内部名称和大小,如果是enum类型,则列出其允许的值,以及其关联的权限。 默认情况下,只显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。

\du[S+] [ pattern ]

列出数据库角色。 (由于用户的概念已经统一为角色,因此此命令现在等效于\dg。) 默认情况下,只显示用户创建的角色;提供S修饰符以包括系统角色。 如果指定了模式,则仅列出名称与模式匹配的角色。 如果使用形式\du+,则会显示有关每个角色的其他信息;目前这会为每个角色添加注释。

\dx[+] [ pattern ]

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

\dX [ pattern ]

列出扩展统计信息。 如果指定了pattern, 则只列出名称与该模式匹配的扩展统计信息。

每种扩展统计信息的状态显示在以其统计类型命名的列中(例如Ndistinct)。 defined表示在创建统计信息时请求了该信息,NULL表示未请求。 如果您想知道是否运行了ANALYZE并且统计信息对规划器可用,可以使用pg_stats_ext

\dy[+] [ pattern ]

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

\e\edit [ 文件名 ] [ 行号 ]

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

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

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

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

提示

查看下面的Environment,了解如何配置和自定义您的编辑器。

\echo text [ ... ]

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

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

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

提示

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

\ef [ function_description [ line_number ] ]

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

目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。 如果有多个同名函数,则必须给出参数类型。

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

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

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

提示

查看下面的Environment,了解如何配置和自定义您的编辑器。

\encoding [ encoding ]

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

\errverbose

以最大的详细程度重复最近的服务器错误消息,就好像VERBOSITY被设置为verboseSHOW_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格式选项子句的列表,这些选项子句的解释方式与\psetoptionvalue命令相同,但仅在此查询的持续时间内生效。在此列表中,不允许在=符号周围有空格,但在选项子句之间需要空格。 如果省略了=value,则命名的option将以与\psetoption没有显式value时相同的方式更改。

如果提供了一个filename|command参数, 查询的输出将被写入到指定的文件或通过给定的shell命令进行传输,而不是像通常那样显示出来。只有在查询成功返回零个或多个元组时,文件或命令才会被写入,而不是在查询失败或是非数据返回的SQL命令时。

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

当最后一个参数以|开头时,整行剩余部分被视为要执行的命令, 在其中不进行变量插值或反引号扩展。其余部分将被直接传递给shell。

\gdesc

显示当前查询缓冲区结果的描述(即列名和数据类型)。 查询不会实际执行;但是,如果包含某种语法错误,该错误将以正常方式报告。

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

\getenv psql_var env_var

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

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

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

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

生成的查询按照返回的行的顺序执行,并在每行内从左到右执行,如果有多个列。NULL字段将被忽略。生成的查询文字 直接发送到服务器进行处理,因此它们不能是psql元命令,也不能包含psql 变量引用。如果任何单个查询失败,剩余查询的执行将继续,除非设置了ON_ERROR_STOP。每个查询的执行 都受ECHO处理的影响。(通常在使用\gexec时,将ECHO设置为 allqueries是明智的。)查询记录、单步模式、计时和其他查询执行功能也适用于每个生成的查询。

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

\gset [ prefix ]

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

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

如果您指定一个前缀, 该字符串将被添加到查询的列名前,以创建要使用的变量名:

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

如果列的结果为NULL,则相应的变量将被取消设置,而不是被设置。

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

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

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

\gx 等同于 \g,不同之处在于它强制为此查询启用扩展输出模式, 就好像在\pset选项列表中包含了expanded=on一样。另请参见\x

\h\help [ 命令 ]

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

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

注意

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

\H\html

打开HTML查询输出格式。如果HTML格式已经打开, 则切换回默认的对齐文本格式。此命令用于兼容性和便利性,但请参阅\pset 有关设置其他输出选项。

\i\include 文件名

从文件filename中读取输入,并将其执行为 好像它是在键盘上键入的一样。

如果filename- (连字符),那么标准输入将被读取,直到EOF指示或\q元命令。 这可用于将交互式输入与文件输入交错使用。请注意,仅当在最外层级别处于活动状态时,Readline行为才会被使用。

注意

如果您想在屏幕上看到读取的行,请将变量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, TtR 都将被视为true

不正确评估为真或假的表达式将生成警告,并被视为假。

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

所有给定条件块的反斜杠命令必须出现在同一个源文件中。如果在主输入文件或一个 \include的文件上达到文件结束之前,所有本地 \if块都没有关闭, 那么psql将会引发错误。

这里是一个例子:

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

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

\l[+]\list[+] [ 模式 ]

列出服务器中的数据库,并显示它们的名称、所有者、字符集编码和访问权限。 如果指定了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 [ 文件名 ]
\o\out [ |命令 ]

安排将未来的查询结果保存到文件文件名, 或将未来的结果传输到shell命令命令。 如果未指定参数,则查询输出重置为标准输出。

如果参数以|开头,则整个剩余部分的行被视为要执行的命令, 在其中不进行变量插值或反引号扩展。其余部分的行会被直接传递给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 = 2latexlatex-longtable格式还允许值为3,以在数据行之间添加分隔线。

columns

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

csv_fieldsep

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

expanded(或x

如果指定了value,它必须是onoff, 这将启用或禁用扩展模式,或者是auto。 如果省略了value,则命令在开启和关闭设置之间切换。 启用扩展模式时,查询结果以两列显示,左侧是列名,右侧是数据。 如果数据在正常的水平模式下无法完全显示在屏幕上,则此模式很有用。 在自动设置中,当查询输出具有多列且宽度超过屏幕时,将使用扩展模式;否则,将使用常规模式。 自动设置仅在对齐和换行格式中有效。在其他格式中,它始终表现为扩展模式已关闭。

fieldsep

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

fieldsep_zero

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

footer

如果指定了value, 它必须是onoff, 这将启用或禁用表格页脚的显示 ((n 行)计数)。 如果省略了value, 命令将切换页脚的显示或隐藏。

format

设置输出格式为alignedasciidoccsvhtmllatexlatex-longtabletroff-msunalignedwrapped。 允许使用唯一缩写。

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

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

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

wrapped格式类似于aligned,但会将宽数据值跨行包装,以使输出适合目标列宽。 目标宽度由columns选项下描述的方式确定。请注意,psql不会尝试包装列标题; 因此,如果列标题所需的总宽度超过目标宽度,则wrapped格式的行为与aligned相同。

asciidochtmllatexlatex-longtable,和 troff-ms格式生成的表格旨在包含在使用相应标记语言的文档中。 它们不是完整的文档!这在HTML中可能不是必需的,但在 LaTeX中,您必须有一个完整的文档包装器。 latex格式使用LaTeXtabular 环境。 latex-longtable格式需要LaTeXlongtablebooktabs包。

linestyle

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

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

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

unicode样式使用Unicode绘图字符。数据中的换行使用右边距中的回车符号显示。 当数据从一行换行到下一行而没有换行符时,第一行的右边距显示省略号符号, 接着在下一行的左边距再次显示省略号符号。

border设置大于零时,linestyle选项还确定了用哪些字符绘制边框线。 普通的ASCII字符在任何地方都有效,但在识别Unicode字符的显示器上看起来更好。

null

设置要打印在空值位置的字符串。默认情况下是不打印任何内容,这很容易被误解为空字符串。 例如,一个人可能更喜欢\pset null '(null)'

numericlocale

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

pager

控制查询和psql帮助输出时使用分页程序的方式。 当pager选项为off时,不使用分页程序。 当pager选项为on时,在适当的情况下使用分页程序,即当输出到终端且不适合在屏幕上显示时。 pager选项也可以设置为always,这会导致分页程序用于所有终端输出,无论是否适合在屏幕上显示。 \pset pager没有value时,切换分页使用状态。

如果环境变量PSQL_PAGERPAGER被设置, 输出将被分页传输到指定的程序。否则,将使用一个平台相关的默认程序 (例如more)。

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

pager_min_lines

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

recordsep

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

recordsep_zero

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

tableattr(或T

HTML格式中,这指定要放置在table标签内的属性。 这可能是cellpaddingbgcolor等。 请注意,您可能不希望在这里指定border,因为这已经由\pset border处理。 如果没有给出value,则取消表格属性。

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

标题(或者C

设置任何随后打印的表的表标题。这可以用来为您的输出提供描述性标签。 如果没有给出value,则标题将被取消设置。

tuples_only(或t

如果指定了value,它必须是onoff, 这将启用或禁用仅元组模式。如果省略了value, 命令将在常规输出和仅元组输出之间切换。常规输出包括额外信息,如列标题、标题和各种页脚。 在仅元组模式下,只显示实际的表数据。

unicode_border_linestyle

设置unicode线条样式的边框绘制样式为singledouble之一。

unicode_column_linestyle

设置unicode线条样式的列绘制样式为singledouble之一。

unicode_header_linestyle

设置unicode线条样式的标题绘制样式为singledouble之一。

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

提示

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

\q\quit

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

\qecho text [ ... ]

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

\r\reset

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

\s [ filename ]

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

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

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

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

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

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

注意

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

\setenv name [ value ]

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

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

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

目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。 如果有多个同名函数,则必须给出参数类型。

如果在命令名称后添加+,则输出的行将被编号,函数体的第一行将被标记为第1行。

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

\sv[+] view_name

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

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

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

\t

切换显示输出列名标题和行数页脚。此命令等效于\pset tuples_only, 仅为方便起见提供。

\T table_options

指定在table标签中放置的属性,在HTML输出格式中。 该命令等效于\pset tableattr table_options

\timing [ on | off ]

使用参数,打开或关闭显示每个SQL语句执行时间的功能。没有参数时,切换显示开关。 显示的时间单位为毫秒;超过1秒的时间间隔也以分钟:秒的格式显示,如有必要还会显示小时和天。

\unset name

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

大多数控制psql行为的变量不能被取消设置;相反,\unset命令被解释为将它们设置为默认值。 请参见下面的Variables

\w\write文件名
\w\write|命令

将当前查询缓冲区写入文件文件名或将其传输到shell命令命令。 如果当前查询缓冲区为空,则写入最近执行的查询。

如果参数以|开头,则整个剩余部分的行被视为要执行的命令, 在其中不进行变量插值或反引号扩展。其余部分的行会被直接传递给shell。

\warn text [ ... ]

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

\watch [ seconds ]

重复执行当前查询缓冲区(就像\g一样)直到被中断或查询失败。 在执行之间等待指定的秒数(默认为2秒)。每个查询结果都会显示一个标题, 包括\pset title字符串(如果有的话),查询开始时的时间和延迟间隔。

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

\x [ on | off | auto ]

设置或切换扩展表格格式模式。因此,它等同于\pset expanded

\z [ pattern ]

列出具有其关联访问权限的列表、表和序列。 如果指定了模式,则仅列出名称与模式匹配的表、视图和序列。

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

\! [ command ]

不带参数时,转义到一个子shell;psql在子shell退出时恢复。 带参数时,执行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命令将其分成多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参见第 55.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命令会显示在当前 schema 搜索路径中可见的全部对象 — 这等价于用*作为模式(如果一个对象所在的 schema 位于搜索路径中并且没有同类且同名的对象出现在搜索路径中该 schema 之前的 schema 中,则说该对象是可见的。这表示可以直接用名称引用该对象,而不需要用 schema 来进行限定)。要查看数据库中所有的对象而不管它们的可见性,可以把*.*用作模式。

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

包含点(.)的关系模式被解释为模式名称后跟对象名称模式。例如, \dt foo*.*bar*显示所有表,其表名包含bar且位于模式中 模式名称以foo开头。当没有出现点时,模式仅匹配当前模式搜索路径中可见的对象。 再次,双引号内的点失去其特殊含义,被视为字面匹配。包含两个点(.)的关系模式 被解释为数据库名称后跟模式名称后跟对象名称模式。数据库名称部分不会被视为模式,必须匹配当前连接的数据库名称, 否则将引发错误。

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

高级用户可以使用字符类等正则表达式记法,如[0-9]可以匹配任意数字。所有的正则表达式特殊字符都按照第 9.7.3 节所说的工作,以下字符除外:.会按照上面所说的作为一种分隔符,*会被翻译成正则表达式记号.*?会被翻译成.,而$则按字面意思匹配。根据需要,可以通过书写?(R+|)(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时不带任何参数即可。

注意

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

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

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

被特殊对待的变量是:

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。如果被设置为queriespsql会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e。如果被设置为errors,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b。如果被重置或者设置为none(默认值)则不会显示任何查询。

ECHO_HIDDEN

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

ENCODING

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

ERROR

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

FETCH_COUNT

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

提示

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

HIDE_TABLEAM

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

HIDE_TOAST_COMPRESSION

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

HISTCONTROL

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

注意

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

HISTFILE

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

\set HISTFILE ~/.psql_history-:DBNAME

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

注意

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

HISTSIZE

存储在命令历史中的最大命令数(默认值是500)。如果被设置为一个负值,则不会应用限制。

注意

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

HOST

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

IGNOREEOF

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

注意

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

LASTOID

最后被影响的 OID 的值,这可能会由INSERT或者\lo_import命令返回。这个变量只保证在下一个SQL命令被显示完之前有效。 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 命令,将在当前命令处停止处理。

PORT

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

PROMPT1
PROMPT2
PROMPT3

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

QUIET

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

ROW_COUNT

上一个SQL查询返回的行数或者受影响的行数,如果该查询失败或者没有报告行计数则为0。

SERVER_VERSION_NAME
SERVER_VERSION_NUM

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

SHOW_ALL_RESULTS

当这个变量设置为off时,只显示组合查询(\;)的最后一个结果,而不是所有结果。 默认值为on。关闭行为是为了与旧版本的psql兼容。

SHOW_CONTEXT

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

SINGLELINE

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

SINGLESTEP

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

SQLSTATE

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

USER

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

VERBOSITY

这个变量可以被设置为值defaultverboseterse或者sqlstate来控制错误报告的详细程度(另见\errverbose,在想得到之前的错误的详细版本时使用)。

VERSION
VERSION_NAME
VERSION_NUM

这些变量在程序启动时被设置以反映psql的版本,分别是一个详细的字符串、一个短字符串(例如9.6.210.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")不会被替换,除非所提及的变量就是当前被设置的。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。

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

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

提示符

psql发出的提示符可以根据用户的喜好自定义。PROMPT1PROMPT2PROMPT3这三个变量包含了描述提示符外观的字符串和特殊转义序列。Prompt 1 是当psql等待新命令时发出的常规提示符。Prompt 2 是在命令输入时需要更多输入时发出的提示符,例如因为当命令没有被分号终止或者引用没有被关闭时就会发出这个提示符。在运行一个SQL COPY FROM STDIN命令并且需要在终端上输入一个行值时,会发出 Prompt 3。

被选中的提示符变量会被原样打印,除非碰到一个百分号(%)。百分号的下一个字符会被特定的其他文本替换。预定义好的替换有:

%M

数据库服务器的完整主机名(带有域名),或者当该连接是建立在一个 Unix 域套接字上时则是[local],或者当 Unix 域套接字不在编译在系统内的默认位置上时则是[local:/dir/name]

%m

数据库服务器的主机名称(在第一个点处截断),或者当连接建立在一个 Unix 域套接字上时是[local]

%>

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

%n

数据库会话的用户名(在数据库会话期间,这个值可能会因为命令SET SESSION AUTHORIZATION的结果而改变)。

%/

当前数据库的名称。

%~

%/类似,但是如果数据库是默认数据库时输出是~(波浪线)。

%#

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

%p

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

%R

在提示符1下通常是=,但如果会话位于一个条件块的一个非活动分支中则是@,如果会话处于单行模式中则是^,如果会话从数据库断开连接(\connect失败时会发生这种情况)则是!。在提示符 2 中,根据为什么psql期待更多的输入,%R会被一个相应的字符替换:如果命令还没有被终止是-,如果有一个未完的/* ... */注释则是*,如果有一个未完的被引用字符串则是一个单引号,如果有一个未完的被引用标识符则是一个双引号,如果有一个未完的美元引用字符串则是一个美元符号,如果有一个还没有被配对的左圆括号则是(。在提示符 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 的提示是'>> '

注意

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

命令行编辑

psql 使用Readlinelibedit库(如果可用)进行方便的行编辑和检索。当psql退出时,命令历史记录会自动保存,并在psql启动时重新加载。键入上箭头或控制-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)命令行选项也可以用于禁用Readlinepsql的单次运行中使用。这可以防止制表完成,使用或记录命令行历史, 以及编辑多行命令。当您需要复制粘贴包含TAB字符的文本时,这特别有用。

环境

COLUMNS

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

PGDATABASE
PGHOST
PGPORT
PGUSER

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

PG_COLOR

规定在诊断消息中是否使用颜色。可能的值为alwaysautonever

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

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

PSQL_WATCH_PAGER

当使用\watch命令重复执行查询时,默认情况下不使用分页器。 可以通过在Unix系统上设置PSQL_WATCH_PAGER为分页器命令来更改此行为。 pspg分页器(不是PostgreSQL的一部分, 但在许多开源软件发行版中可用)可以显示\watch的输出, 如果使用选项--stream启动。

PSQLRC

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

SHELL

\!命令执行的命令。

TMPDIR

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

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

文件

psqlrc and ~/.psqlrc

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

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

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

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

.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
              表 "public.my_table"
 列    |  类型  | 校对   | 可空   | 默认值
--------+---------+-----------+----------+---------
 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
边框样式为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
边框样式为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
边框样式为1。
peter@localhost testdb=> \pset format csv
输出格式为csv。
peter@localhost testdb=> \pset tuples_only
仅元组。
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
输出格式为不对齐。
peter@localhost testdb=> \pset fieldsep '\t'
字段分隔符为"    "。
peter@localhost testdb=> SELECT second, first FROM my_table;
one     1
two     2
three   3
four    4

或者,使用简短命令:

peter@localhost testdb=> \a \t \x
输出格式为对齐。
仅元组已关闭。
扩展显示已打开。
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)

当适当时,可以使用\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 行)

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

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

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 行)