psql — PostgreSQL交互式终端
psql [option...] [dbname
[username]]
psql是一个PostgreSQL的基于终端的前端。它让你可以交互式地键入查询,把它们发送给PostgreSQL,并查看查询结果。或者,输入可以来自于一个文件或命令行参数。此外,psql还提供一些元命令和多种类似 shell 的特性来为编写脚本和自动化多种任务提供便利。
-a--echo-all #
把所有非空输入行按照它们被读入的形式打印到标准输出(这不适用于交互式行读取)。这等效于把变量ECHO设置为all。
-A--no-align #
切换到非对齐输出模式(默认输出模式是aligned)。这等效于\pset format unaligned。
-b--echo-errors #
把失败的 SQL 命令打印到标准错误输出。这等效于把变量ECHO设置为errors。
-c command--command=command #
指定psql执行一个给定的命令字符串command。这个选项可以重复多次并且以任何顺序与-f选项组合在一起。当-c或者-f被指定时,psql不会从标准输入读取命令;而是在处理完序列中所有的-c和-f选项之后终止。
command必须是一个服务器完全可解析的命令字符串(即不包含psql相关的特性)或者单个反斜线命令。因此不能在一个-c选项中混合SQL和psql元命令。要那样做,可以使用多个-c选项或者把字符串用管道输送到psql中,例如:
psql -c '\x' -c 'SELECT * FROM foo;'
或者
echo '\x \\ SELECT * FROM foo;' | psql
(\\是分隔符元命令。)
每个SQL命令字符串传递给-c都作为一个单独的请求发送到服务器。
因此,即使字符串包含多个SQL命令,服务器也会将其作为单个事务执行,
除非字符串中包含明确的BEGIN/COMMIT命令将其分成多个事务。
(有关服务器如何处理多查询字符串的更多详细信息,请参见第 54.2.2.1 节。)
如果不希望在一个事务中执行多个命令,可以使用重复的-c命令,
或将多个命令输入到psql的标准输入,
可以像上面示例中使用echo,也可以通过shell的here-document,例如:
psql <<EOF \x SELECT * FROM foo; EOF
--csv #
切换到CSV(逗号分隔值)输出模式。 这相当于\pset format csv。
-d dbname--dbname=dbname #
指定要连接的数据库的名称。这等效于指定dbname为命令行上的第一个非选项参数。dbname 可以是 连接字符串。 如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-e--echo-queries #
也把发送到服务器的所有 SQL 命令复制到标准输出。这等效于把变量ECHO设置为queries。
-E--echo-hidden #
回显\d以及其他反斜线命令生成的实际查询。可以用它来学习psql的内部操作。这等效于把变量ECHO_HIDDEN设置为on。
-f filename--file=filename #
从文件filename而不是标准输入中读取命令。这个选项可以被重复多次,也可以以任意顺序与-c选项组合。当-c或者-f被指定时,psql不会从标准输入读取命令;相反,它在处理完序列中所有的-c和-f选项后终止。除此以外,这个选项很大程度上等价于元命令\i。
如果filename是-(连字符),那么会读取标准输入直到遇见一个EOF指示或者\q元命令。这种方式可以用把多个文件的输入组合成一种交互式输入。不过注意在这种情况下不会使用Readline(很像指定了-n的情况)。
使用这个选项与psql < 有细微的不同。通常,两种形式都可以做到我们所期望的,但是使用filename-f启用了一些好的特性,例如带有行号的错误消息。使用这个选项还有一丝机会可以降低启动开销。另一方面,使用shell输入重定向的变体(理论上)保证会得到与手工输入时相同的输出。
-F separator--field-separator=separator #
使用separator作为非对齐输出的字段分隔符。这等效于\pset fieldsep或者\f。
-h hostname--host=hostname #指定运行服务器的机器的主机名。如果这个值以斜线开始,它会被用作Unix域套接字的目录。
-H--html #
切换到HTML输出模式。这等效于\pset format html或者\H命令。
-l--list #
列出所有可用的数据库,然后退出。其他非连接选项会被忽略。这与元命令\list类似。
在使用这个选项时,psql将连接到数据库postgres,除非在命令行上提及一个不同的数据库(选项-d或非选项参数,可能是通过一个服务项,但不能通过一个环境变量)。
-L filename--log-file=filename #
除了把所有查询输出写到普通输出目标之外,还写到文件filename中。
-n--no-readline #不要使用Readline进行行编辑,也不要使用命令历史记录(请参见下面的“命令行编辑”一节)。
-o filename--output=filename #
把所有查询输出放到文件filename中。这等效于命令\o。
-p port--port=port #
指定服务器用于监听连接的 TCP 端口或者本地 Unix 域套接字文件扩展。默认是PGPORT环境变量的值,如果没有设置,则默认为编译时指定的端口号(通常是5432)。
-P assignment--pset=assignment #
以\pset的形式指定打印选项。注意,这里你必须用一个等号而不是空格来分隔名称和值。例如,要设置输出格式为LaTeX,应该写成-P format=latex。
-q--quiet #
指定psql应该安静地工作。默认情况下,它会打印出欢迎消息以及多种输出。如果使用了这个选项,以上那些就都不会输出。在使用-c选项时,配合这个选项很有用。这等效于设置变量QUIET为on。
-R separator--record-separator=separator #
把separator用作非对齐输出的记录分隔符。这等效于\pset recordsep命令。
-s--single-step #运行在单步模式中。这意味着在每个命令被发送给服务器之前都会提示用户一个可以取消执行的选项。使用这个选项可以调试脚本。
-S--single-line #运行在单行模式中,其中新行会终止一个 SQL 命令,就像分号的作用一样。
这种模式被提供给那些坚持使用它的用户,但是并不一定要使用它。特别地,如果在一行中混合了SQL和元命令,那对于没有经验的用户来说,它们的执行顺序可能不总是那么清晰。
-t--tuples-only #
关闭打印列名和结果行计数页脚等。这等效于\t或者\pset tuples_only。
-T table_options--table-attr=table_options #
指定要放置在HTML table标签中的选项。详见\pset tableattr。
-U username--username=username #
作为用户username而不是默认用户连接到数据库(当然,你必须具有这样做的权限)。
-v assignment--set=assignment--variable=assignment #
执行一次变量赋值,和\set元命令相似。注意你必须在命令行上用等号分隔名字和值(如果有)。要重置一个变量,去掉等号。要把一个变量置为空值,使用等号但是去掉值。这些赋值在命令行处理期间被完成,因此反映连接状态的变量将在稍后被覆盖。
-V--version #打印psql版本并且退出。
-w--no-password #
从不发出一个口令提示。如果服务器要求口令认证并且口令不能从其他来源(例如一个.pgpass文件)获得,那么连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有用户来输入口令。
注意这个选项将对整个会话保持设置,并且因此它会影响元命令\connect的使用,以及初始的连接尝试。
-W--password #强制psql在连接到一个数据库之前提示要求一个密码,即使密码不会被使用。
如果服务器需要密码认证并且密码不能从其他来源获得,例如 .pgpass 文件,psql 在任何情况下都会提示输入密码。然而,psql 将浪费一次连接尝试来发现服务器想要一个密码。在某些情况下值得用-W来避免额外的连接尝试。
注意这个选项将对整个会话保持设置,并且因此它会影响元命令\connect的使用,以及初始的连接尝试。
-x--expanded #
打开扩展表格式模式。这等效于\x或\pset expanded。
-X--no-psqlrc #
不读取启动文件(既不读取系统范围的psqlrc文件,也不读取用户的~/.psqlrc文件)。
-z--field-separator-zero #
设置非对齐输出的字段分隔符为零字节。这等效于\pset fieldsep_zero。
-0--record-separator-zero #
设置非对齐输出的记录分隔符为零字节。例如,这对与xargs -0配合使用很有帮助。这等效于\pset recordsep_zero。
-1--single-transaction #
这个选项只能与一个或多个-c和/或-f选项结合使用。
它会导致psql在第一个这样的选项之前发出一个BEGIN命令,
并在最后一个选项之后发出一个COMMIT命令,从而将所有命令包装成一个单独的事务。
如果任何命令失败且变量ON_ERROR_STOP被设置,那么会发送一个ROLLBACK命令。
这确保要么所有命令都成功完成,要么不应用任何更改。
如果命令本身包含BEGIN、COMMIT或ROLLBACK,这个选项将不会得到想要的效果。还有,如果单个命令不能在一个事务块中执行,指定这个选项将导致整个事务失败。
-?--help[=topic] #
显示有关psql的帮助并且退出。可选的topic参数(默认为options)选择要解释哪一部分的psql:commands描述psql的反斜线命令;options描述可以被传递给psql的命令行选项;而variables则显示有关psql配置变量的帮助。
psql正常完成时向 shell 返回 0,如果它自身发生一个致命错误(例如内存用完、找不到文件),则返回 1;如果到服务器的连接出问题并且会话不是交互式的,则返回 2;如果在脚本中发生错误并且变量ON_ERROR_STOP被设置,则返回 3。
psql 是一个常规的
PostgreSQL 客户端应用程序。为了
连接到数据库,您需要知道目标数据库的名称、服务器的主机名和端口号,
以及您希望以哪个数据库用户名进行连接。psql
可以通过命令行选项告知这些参数,分别是
-d、-h、-p 和
-U。如果发现某个参数不属于任何选项,它将被解释为
数据库名称(或者如果已经给出了数据库名称,则解释为数据库用户名)。
并非所有这些选项都是必需的;有一些有用的默认值。如果您省略主机名,
psql 将通过 Unix 域套接字连接到本地主机上的
服务器,或者在 Windows 上通过 TCP/IP 连接到 localhost。
默认的端口号是在编译时确定的。
由于数据库服务器使用相同的默认值,大多数情况下您无需指定端口。
默认的数据库用户名是您的操作系统用户名。一旦确定了数据库用户名,
它将被用作默认的数据库名称。
请注意,您不能随意以任何数据库用户名连接到任何数据库。您的数据库
管理员应该已经告知您有关访问权限的信息。
当默认值不是很符合实际时,可以把环境变量PGDATABASE、PGHOST、PGPORT以及PGUSER设置为适当的值,这样也能节省一些敲打键盘的工作(额外的环境变量可见第 32.15 节)。用一个~/.pgpass文件来避免定期输入密码也很方便。详见第 32.16 节。
另一种指定连接参数的方法是用一个conninfo字符串或者一个URI,它可以被用来替代数据库名。这种机制可以让我们对连接具有很广的控制权。例如:
$psql "service=myservice sslmode=require"$psql postgresql://dbmaster:5433/mydb?sslmode=require
用这种方式,你也可以把LDAP用于第 32.18 节中描述的连接参数查找。可用连接选项的更多信息请见第 32.1.2 节。
如果由于任何原因(例如权限不足、服务器没有在目标主机上运行等)导致连接无法建立,psql将返回一个错误并且终止。
如果标准输入和标准输出都是一个终端,那么psql会把客户端编码设置成“auto”,这会使psql从区域设置(Unix 系统上的LC_CTYPE环境变量)中检测合适的客户端编码。如果这样不起作用,可以使用环境变量PGCLIENTENCODING覆盖客户端编码。
在正常操作时,psql会提供一个提示符,该提示符是psql当前连接到的数据库名称后面跟上字符串=>。例如:
$ psql testdb
psql (18.3)
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 风格的注释块会被传给服务器处理并移除,psql会自己移除掉 SQL 标准的注释。
你输入到psql中的任何以未加引用的反斜线开始的内容都是一个psql元命令,它由psql自行处理。这些命令使psql在管理或编写脚本时更有用。元命令常常被称作斜线或反斜线命令。
psql命令的格式是用反斜线后面直接跟上一个命令动词,然后是一些参数。参数与命令动词和其他参数之间用任意多个空白字符分隔开。
要在一个参数中包括空白,可以将其用单引号括起来。要在一个参数中包括一个单引号,则需要在文本中写上两个单引号。任何包含在单引号中的内容都服从与 C 语言中\n(新行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(八进制)以及\xdigits(十六进制)类似的替换规则。单引号内文本中的其他任何字符(不管它是什么)前面的反斜线都会将该字符引号化。
如果在一个参数中出现一个未加引号的冒号(:)后面跟着一个psql变量名,它会被该变量的值替换,如下面的SQL Interpolation所述。在其中描述的形式:'和variable_name':"也有同样的效果。variable_name":{?语法允许测试一个变量是否被定义。它会被TRUE或FALSE替换。用一个反斜线转义该冒号可以防止它被替换。
variable_name}
在一个参数中,封闭在反引号(`)中的文本会被当做一个传递给shell的命令行。该命令的输出(移除任何拖尾的新行)会替换反引号文本。在封闭在反引号的文本中,不会有特别的引号或者其他处理发生,:的出现除外,其中variable_namevariable_name是一个会被其值替换的psql变量名。此外,:'的出现会被替换为该变量的值,而值会被适当地加以引用以变成一个单一shell命令参数(后一种形式几乎总是优先,除非你非常确定变量中有什么)。因为回车和换行字符在所有的平台上都不能被安全地引用,variable_name':'形式会打印一个错误消息,并且在这类字符出现在值中时不替换该变量值。
variable_name'
有些命令把SQL标识符(例如一个表名)当作参数。这些参数遵循SQL的语法规则:无引号的字母被强制变为小写,而双引号(")可以保护字母避免大小写转换并且允许在标识符中包含空白。 在双引号内,成对的双引号会被缩减为结果名称中的单个双引号。例如,FOO"BAR"BAZ会被解释成fooBARbaz,而"A weird"" name"会变成A weird" name。
对参数的解析会在行尾或者碰到另一个未加引号的反斜线时停止。一个未加引号的反斜线被当做新元命令的开始。特殊的序列\\(两个反斜线)表示参数结束并且应继续解析SQL命令(如果还有)。使用这种方法,SQL命令和psql命令可以被自由地混合在一行中。但是无论在何种情况中,元命令的参数都无法跨越一行。
很多元命令作用在当前查询缓冲区上。这就是一个缓冲区而已,它保存任何已经被键入但是还没有发送到服务器执行的SQL命令文本。这将包括之前输入的行以及在该元命令同一行上出现在前面的任何文本。
许多元命令还允许将 x 作为选项附加。
这将导致结果以扩展模式显示,就像使用了 \x
或 \pset expanded 一样。
定义了以下元命令:
\a #
如果当前表格输出格式为不对齐,则切换为对齐。如果它不是不对齐,则设置为不对齐。此命令保留用于向后兼容性。参见\pset以获取更通用的解决方案。
\bind [ parameter ] ... #
为下一次查询执行设置查询参数,使用指定的参数传递给任何参数占位符
($1 等)。
示例:
INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g
这同样适用于除了\g之外的查询执行命令,例如
\gx和\gset。
此命令会使用扩展查询协议(参见 第 54.1.2 节),与正常的 psql 操作不同,后者使用简单 查询协议。因此,此命令可以用于测试来自 psql 的扩展查询协议。 (即使查询没有参数,此命令也会指定零个参数,仍会使用扩展查询协议。) 此命令仅影响下一个执行的查询;所有后续查询将默认使用简单查询协议。
\bind_named statement_name [ parameter ] ... #
\bind_named 等同于 \bind,
不同之处在于它将现有准备语句的名称作为第一个参数。
空字符串表示未命名的准备语句。
示例:
INSERT INTO tbls1 VALUES ($1, $2) \parse stmt1 \bind_named stmt1 'first value' 'second value' \g
此命令会使用扩展查询协议(参见 第 54.1.2 节),与正常的 psql 操作不同,后者使用简单 查询协议。因此,此命令可以用于测试来自 psql 的扩展查询协议。
\c 或 \connect [ -reuse-previous=on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ] #
建立到PostgreSQL服务器的新连接。可以使用位置语法(数据库名称、用户、主机和端口中的一个或多个)指定要使用的连接参数,也可以使用详细说明在第 32.1.1 节中的conninfo连接字符串。如果没有给出参数,则使用与之前相同的参数建立新连接。
指定任何dbname、
username、
host或
port为
-等同于省略该参数。
新连接可以重用前一个连接的连接参数;不仅包括数据库名称、用户、主机和端口,还包括其他设置,如sslmode。
默认情况下,参数在位置语法中被重用,但在给定conninfo字符串时不会被重用。
传递-reuse-previous=on或-reuse-previous=off作为第一个参数将覆盖该默认设置。
如果参数被重用,则任何未明确指定为位置参数或在conninfo字符串中的参数将从现有连接的参数中获取。
一个例外是,如果使用位置语法将host设置更改为其先前值,则现有连接参数中存在的任何hostaddr设置将被删除。
此外,仅当用户、主机和端口设置未更改时,才会重用现有连接使用的任何密码。
当命令既不指定也不重用特定参数时,将使用libpq的默认值。
如果新连接成功建立,则关闭先前的连接。
如果连接尝试失败(用户名错误,访问被拒绝等),且psql处于交互模式,则保留先前的连接。
但在执行非交互脚本时,旧连接将被关闭并报告错误。
这可能会或可能不会终止脚本;如果没有终止,直到成功执行另一个\connect命令之前,所有访问数据库的命令都将失败。
选择这种区别是为了用户方便避免打字错误,同时也是脚本不会意外操作错误数据库的安全机制。
请注意,每当\connect命令尝试重新使用参数时,重新使用的值是最后一个成功连接的值,而不是随后的任何失败尝试的值。
但是,在非交互\connect失败的情况下,不允许稍后重新使用参数,因为脚本可能期望从失败的\connect中重新使用值。
示例:
=> \c mydb myuser host.dom 6432 => \c service=foo => \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable" => \c -reuse-previous=on sslmode=require -- changes only sslmode => \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title ] #
设置作为查询结果打印的任何表格的标题,或取消任何这样的标题。此命令等效于
\pset title 。(此命令的名称源自“caption”,
因为它以前仅用于设置HTML表格中的标题。)
title
\cd [ directory ] #
将当前工作目录更改为
directory。如果没有参数,则更改为
当前用户的主目录。有关如何查找主目录的详细信息,请参见
第 32.16 节。
要打印当前工作目录,请使用\! pwd。
\close_prepared prepared_statement_name #关闭指定的准备语句。空字符串表示未命名的准备语句。 如果没有具有此名称的准备语句,则该操作无效。
示例:
SELECT $1 \parse stmt1 \close_prepared stmt1
此命令会使用扩展查询协议, 与正常的 psql 操作不同, 后者使用简单查询协议。因此,此命令可以用于测试来自 psql 的扩展查询协议。
\conninfo #输出有关当前数据库连接的信息, 包括如果使用 SSL 则相关的 SSL 信息。
请注意,Client User 字段显示
连接时的用户,而 Superuser 字段指示
当前用户(在当前执行上下文中)是否具有超级用户权限。
这些用户通常是相同的,但它们可能不同,例如,如果当前用户
是通过 SET ROLE 命令更改的。
\copy { table [ ( column_list ) ] }
from
{ 'filename' | program 'command' | stdin | pstdin }
[ [ with ] ( option [, ...] ) ]
[ where condition ]\copy { table [ ( column_list ) ] | ( query ) }
to
{ 'filename' | program 'command' | stdout | pstdout }
[ [ with ] ( option [, ...] ) ] #
执行前端(客户端)复制。这是一个操作,运行一个SQL
COPY命令,
但是服务器不读取或写入指定的文件,
psql读取或写入文件,
并在服务器和本地文件系统之间路由数据。
这意味着文件的可访问性和权限属于本地用户,而不是服务器,
也不需要SQL超级用户权限。
当指定program时,由psql执行command,
并在服务器和客户端之间传递从command传递的数据。
再次强调,执行权限是本地用户的权限,而不是服务器的权限,不需要SQL超级用户权限。
对于 \copy ... from stdin,数据行从发出命令的同一
源读取,直到读取到仅包含 \.
的行或流达到 EOF。此选项对于在 SQL 脚本文件中
内联填充表非常有用。
对于 \copy ... to stdout,输出发送到与
psql 命令输出相同的位置,并且
COPY 命令状态不会被打印
(因为它可能与数据行混淆)。
要读取/写入 psql 的标准输入或
输出,而不管当前命令源或 count\o
选项,写入 from pstdin 或 to pstdout。
该命令的语法与 SQL COPY 命令类似。
除了数据源/目的地之外的所有选项都与 COPY 指定的一样。
因此,特殊的解析规则适用于 \copy 元命令。
与大多数其他元命令不同,整个剩余行始终被视为 \copy 的参数,
参数中不执行变量插值或反引号扩展。
另一种获得与 \copy ... to 相同结果的方法是使用 SQL
COPY ... TO STDOUT 命令,并以 \g
或 filename\g | 结束。
与 program\copy 不同,这种方法允许命令跨越多行;此外,可以使用变量插值和反引号扩展。
这些操作的效率不如使用文件或程序数据源或
目标的 SQL
COPY 命令,因为所有数据必须通过客户端/服务器
连接传递。对于大量数据,SQL
命令可能更可取。
\copyright #显示 PostgreSQL 的版权和分发条款。
\crosstabview [
colV
[ colH
[ colD
[ sortcolH
] ] ] ] #
执行当前查询缓冲区(类似于 \g)并在交叉表格中显示结果。
查询必须返回至少三列。
由 colV 标识的输出列成为垂直标题,
由 colH 标识的输出列成为水平标题。
colD 标识要在网格中显示的输出列。
sortcolH 标识水平标题的可选排序列。
每个列规范可以是列号(从 1 开始)或列名。列名遵循通常的 SQL 大小写折叠和引用规则。如果省略,
colV 被视为第 1 列,
colH 被视为第 2 列。
colH 必须与
colV 不同。
如果未指定 colD,则查询结果中必须恰好有三列,
并且既不是 colV 也不是
colH 的列被视为
colD。
垂直标题显示为最左侧的列,包含在列 colV 中找到的值,
与查询结果中的顺序相同,但删除了重复项。
水平标题作为第一行显示,包含在列colH中找到的值,去除重复项。
默认情况下,这些值按照查询结果中的顺序显示。但是,如果给定可选的sortcolH参数,
它标识一个列,其值必须是整数,colH中的值将按照相应的
sortcolH值排序后显示在水平标题中。
在交叉表格中,对于每个colH列的不同值x,
和每个colV列的不同值y,
位于交点(x,y)的单元格包含查询结果行中colD列的值,
其中colH列的值为x,
colV列的值为y。
如果没有这样的行,则单元格为空。如果有多个这样的行,则报告错误。
\d[Sx+] [ pattern ] #
对于每个与pattern匹配的关系(表、视图、物化视图、索引、序列或外部表)或复合类型,
显示所有列、它们的类型、表空间(如果不是默认的)以及任何特殊属性,如NOT NULL或默认值。
还显示相关的索引、约束、规则和触发器。对于外部表,还显示关联的外部服务器。
(“匹配模式”的定义在下面的Patterns中。)
对于某些类型的关系,\d显示每列的附加信息:序列的列值,索引的索引表达式,
外部表的外部数据包装器选项。
命令形式\d+与相同,只是显示更多信息:显示与表列相关的任何注释,
表中的OID的存在,如果关系是视图,则显示视图定义,非默认的
复制标识设置以及
如果关系具有访问方法,则显示
访问方法名称。
默认情况下,只显示用户创建的对象;提供一个模式或S修饰符以包括系统对象。
如果使用\d而没有pattern参数,
它等同于\dtvmsE,它将显示所有可见的表、视图、物化视图、序列和外部表的列表。
这纯粹是一种便利措施。
与许多其他命令一样,如果在
命令名称后附加 x,结果将以扩展模式显示,但请注意
这仅适用于在没有 pattern 参数的情况下使用
\d,并且 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]]
#
列出运算符类
(见 第 36.16.1 节)。
如果指定了 access-method-pattern
,则仅列出与名称匹配该模式的访问方法相关的运算符类。
如果指定了 input-type-pattern
,则仅列出与名称匹配该模式的输入类型相关的运算符类。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个运算符
类将与其关联的运算符族和拥有者一起列出。
\dAf[x+]
[access-method-pattern
[input-type-pattern]]
#
列出运算符族
(见 第 36.16.5 节)。
如果指定了 access-method-pattern
,则仅列出与名称匹配该模式的访问方法相关的运算符族。
如果指定了 input-type-pattern
,则仅列出与名称匹配该模式的输入类型相关的运算符族。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个运算符
家将与其拥有者一起列出。
\dAo[x+]
[access-method-pattern
[operator-family-pattern]]
#
列出与运算符族相关的运算符
(见 第 36.16.2 节)。
如果指定了 access-method-pattern
,则仅列出与名称匹配该模式的访问方法相关的运算符族成员。
如果指定了 operator-family-pattern
,则仅列出与名称匹配该模式的运算符族成员。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个运算符
将与其排序运算符族(如果它是排序运算符)以及其底层函数是否是防泄漏的标志一起列出。
\dAp[x+]
[access-method-pattern
[operator-family-pattern]]
#
列出与运算符族相关的支持函数
(见 第 36.16.3 节)。
如果指定了 access-method-pattern
,则仅列出与名称匹配该模式的访问方法相关的运算符族的函数。
如果指定了 operator-family-pattern
,则仅列出与名称匹配该模式的运算符族的函数。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则函数将以详细方式显示,包含其实际参数列表。
\db[x+] [ pattern ] #
列出表空间。如果指定了 pattern,则仅显示名称与模式匹配的表空间。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个表空间
将与其关联的选项、磁盘大小、权限和描述一起列出。
\dc[Sx+] [ pattern ] #
列出字符集编码之间的转换。
如果指定了 pattern
,则仅列出名称与模式匹配的转换。
默认情况下,仅显示用户创建的对象;提供一个
模式或 S 修饰符以包含系统
对象。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个对象
将与其关联的描述一起列出。
\dconfig[x+] [ pattern ] #
列出服务器配置参数及其值。
如果指定了 pattern,
则仅列出名称与模式匹配的参数。没有
pattern 时,仅列出设置为非默认值的参数。
(使用 \dconfig * 查看所有参数。)
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,则每个
参数将与其数据类型、可以设置参数的上下文和访问权限(如果已授予非默认访问
权限)一起列出。
\dC[x+] [ pattern ] #
列出类型转换。
如果指定了 pattern
,则仅列出源类型或目标类型与模式匹配的转换。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则显示每个转换的附加信息,
包括其底层函数是否是防泄漏的,以及转换的描述。
\dd[Sx] [ pattern ] #
显示 constraint、operator class、
operator family、rule 和
trigger 类型对象的描述。所有其他注释可以通过相应的反斜杠命令查看这些对象类型。
\dd 显示与
pattern 匹配的对象描述,
或者在未给出参数的情况下显示适当类型的可见对象。
但在任何情况下,仅列出具有描述的对象。
默认情况下,仅显示用户创建的对象;提供一个
模式或 S 修饰符以包含系统对象。
如果在命令名称后附加 x,则结果
以扩展模式显示。
可以使用 COMMENT SQL 命令创建对象的描述。
\dD[Sx+] [ pattern ] #
列出域。如果 pattern
被指定,则仅显示名称与模式匹配的域。
默认情况下,仅显示用户创建的对象;提供一个
模式或 S 修饰符以包含系统对象。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则每个对象
以其相关权限和描述列出。
\ddp[x] [ pattern ] #
列出默认访问权限设置。每个角色(如果适用,还包括模式)
的条目会显示出默认权限设置已从内置默认值更改的情况。
如果 pattern 被
指定,则仅列出角色名称或模式名称与模式匹配的条目。
如果在命令名称后附加 x,则结果
以扩展模式显示。
ALTER DEFAULT
PRIVILEGES 命令用于设置默认访问权限。权限显示的含义在 第 5.8 节 中有解释。
\dE[Sx+] [ pattern ]\di[Sx+] [ pattern ]\dm[Sx+] [ pattern ]\ds[Sx+] [ pattern ]\dt[Sx+] [ pattern ]\dv[Sx+] [ pattern ] #
在这一组命令中,字母 E、
i、m、s、
t 和 v
分别代表外部表、索引、物化视图、
序列、表和视图。
您可以以任何顺序指定这些字母中的任何一个或全部,
以获取这些类型对象的列表。例如,\dti 列出
表和索引。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,
则每个对象会列出其持久性状态(永久、临时或未记录),
磁盘上的物理大小,以及相关描述(如果有)。
如果 pattern 被
指定,则仅列出名称与模式匹配的对象。
默认情况下,仅显示用户创建的对象;提供一个
模式或 S 修饰符以包含系统对象。
\des[x+] [ pattern ] #
列出外部服务器(助记符: “外部
服务器”)。
如果 pattern 被
指定,则仅列出名称与模式匹配的服务器。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则显示每个服务器的完整描述,
包括服务器的访问权限、类型、版本、选项和描述。
\det[x+] [ pattern ] #
列出外部表(助记符: “外部表”)。
如果 pattern 被
指定,则仅列出表名称或模式名称与模式匹配的条目。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,
则还会显示通用选项和外部表描述。
\deu[x+] [ pattern ] #
列出用户映射(助记符: “外部
用户”)。
如果 pattern 被
指定,则仅列出名称与模式匹配的映射。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则显示每个映射的附加信息。
\deu+可能还会显示远程用户的用户名和
密码,因此应注意不要泄露它们。
\dew[x+] [ pattern ] #
列出外部数据包装器(助记符: “外部
包装器”)。
如果 pattern 被
指定,则仅列出名称与模式匹配的外部数据包装器。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则还会显示外部数据包装器的
访问权限、选项和描述。
\df[anptwSx+] [ pattern [ arg_pattern ... ] ] #
列出函数,以及它们的结果数据类型、参数数据
类型和函数类型,这些类型被分类为 “聚合”
(aggregate)、“普通”、“过程”、“触发器” 或 “窗口”。
要仅显示特定类型的函数,请将相应的字母 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,结果
将以扩展模式显示。
\dP[itnx+] [ pattern ] #
列出分区关系。
如果 pattern 被指定,
则只列出名称与模式匹配的条目。
修饰符 t(表)和 i(索引)
可以附加到命令,过滤要列出的关系类型。默认情况下,列出分区表和索引。
如果使用修饰符 n(“nested”),
或指定了模式,则将包括非根分区关系,并显示一列,显示每个
分区关系的父级。
如果在命令名称后附加 x,结果
将以扩展模式显示。
如果在命令名称后附加 +,将显示
每个关系的分区大小总和,以及
关系的描述。
如果将 n 与 + 结合使用,将显示两个
大小:一个包括直接附加的
叶分区的总大小,另一个显示所有分区的总大小,
包括间接附加的子分区。
\drds[x] [ role-pattern [ database-pattern ] ] #
列出已定义的配置设置。这些设置可以是
特定于角色、特定于数据库,或两者皆是。
role-pattern 和
database-pattern 用于选择
要列出的特定角色和数据库。如果省略,或者如果
指定了 *,将列出所有设置,包括那些
不特定于角色或数据库的设置。
如果在命令名称后附加 x,结果
将以扩展模式显示。
ALTER ROLE和
ALTER DATABASE
命令用于定义每个角色和每个数据库的配置设置。
\drg[Sx] [ pattern ] #
列出每个已授予角色成员资格的信息,包括分配的选项
(ADMIN、INHERIT和/或SET)以及授予者。
请参阅GRANT
命令以获取有关角色成员资格的信息。
默认情况下,仅显示对用户创建角色的授权;提供
S 修饰符以包括系统角色。
如果指定了 pattern,
仅列出对名称匹配该模式的角色的授权。
如果在命令名称后附加 x,结果
将以扩展模式显示。
\dRp[x+] [ pattern ] #
列出复制发布。
如果指定了 pattern,
则仅列出名称匹配该模式的发布。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则还会显示与每个发布相关的表和模式。
\dRs[x+] [ pattern ] #
列出复制订阅。
如果指定了 pattern,
则仅列出名称匹配该模式的订阅。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则显示订阅的附加属性。
\dT[Sx+] [ pattern ] #
列出数据类型。
如果指定了 pattern,
则仅列出名称匹配该模式的类型。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则每个类型将
以其内部名称和大小列出,如果它是 enum 类型,则列出其允许值,
以及其相关权限。
默认情况下,仅显示用户创建的对象;提供一个
模式或 S 修饰符以包括系统
对象。
\du[Sx+] [ pattern ] #
列出数据库角色。
(由于 “用户” 和 “组” 的概念已统一为
“角色”,因此此命令现在等同于
\dg。)
默认情况下,仅显示用户创建的角色;提供
S 修饰符以包括系统角色。
如果指定了 pattern,
则仅列出名称匹配该模式的角色。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则显示每个角色的附加信息;
当前这会为每个角色添加注释。
\dx[x+] [ pattern ] #
列出已安装的扩展。
如果指定了 pattern,
则仅列出名称匹配该模式的扩展。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则列出所有属于
每个匹配扩展的对象。
\dX[x] [ pattern ] #
列出扩展统计信息。
如果指定了 pattern,
则仅列出名称匹配该模式的扩展统计信息。
如果在命令名称后附加 x,则结果
以扩展模式显示。
每种扩展统计信息的状态显示在以其统计类型命名的列中(例如Ndistinct)。
defined表示在创建统计信息时请求了该信息,NULL表示未请求。
如果您想知道是否运行了ANALYZE并且统计信息对规划器可用,可以使用pg_stats_ext。
\dy[x+] [ pattern ] #
列出事件触发器。
如果指定了 pattern,
则仅列出名称匹配该模式的事件触发器。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,则每个对象
将与其相关描述一起列出。
\e 或 \edit [ filename ] [ line_number ] #
如果指定了filename,则编辑该文件;编辑器退出后,文件内容将被复制到当前查询缓冲区。
如果没有给出filename,则将当前查询缓冲区复制到临时文件中,然后以相同方式进行编辑。
或者,如果当前查询缓冲区为空,则将最近执行的查询复制到临时文件中,并以相同方式进行编辑。
如果您编辑文件或上一个查询,并在不修改文件的情况下退出编辑器,则查询缓冲区将被清除。
否则,查询缓冲区的新内容将根据psql的正常规则重新解析,
将整个缓冲区视为单行。任何完整的查询将立即执行;也就是说,如果查询缓冲区包含或以分号结尾,
则执行并从查询缓冲区中删除到该点的所有内容。查询缓冲区中剩余的内容将重新显示。
输入分号或\g发送它,或输入\r通过清除查询缓冲区来取消。
将缓冲区视为单行主要影响元命令:在元命令后的缓冲区将被视为元命令的参数,
即使它跨越多行。(因此,您不能以这种方式创建使用元命令的脚本。请使用\i。)
如果指定了行号,psql将光标定位在文件或查询缓冲区的指定行上。 请注意,如果给出一个全是数字的参数, psql会假定它是一个行号,而不是文件名。
查看下面的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 FUNCTION或
CREATE OR REPLACE PROCEDURE命令。
编辑方式与\edit相同。
如果您在不保存的情况下退出编辑器,则该语句将被丢弃。
如果您保存并退出编辑器,则如果添加了分号,则更新的命令将立即执行。
否则它将重新显示;键入分号或\g发送它,或\r取消。
目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。
如果有多个同名函数,则必须给出参数类型。
如果未指定函数,则会呈现一个空的CREATE FUNCTION模板供编辑。
如果指定了行号,psql将光标定位在函数体的指定行上。 (请注意,函数体通常不会从文件的第一行开始。)
与大多数其他元命令不同,整个行的剩余部分始终被视为\ef的参数,
参数中不进行变量插值或反引号扩展。
查看下面的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格式选项子句的列表,这些选项子句的解释方式与\psetoptionvalue命令相同,但仅在此查询的持续时间内生效。在此列表中,不允许在=符号周围有空格,但在选项子句之间需要空格。
如果省略了=value,则命名的option将以与\psetoption没有显式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->\gexecCREATE INDEX CREATE INDEX CREATE INDEX CREATE INDEX
生成的查询按照返回的行的顺序执行,并在每行内从左到右执行,如果有多个列。NULL字段将被忽略。生成的查询文字
直接发送到服务器进行处理,因此它们不能是psql元命令,也不能包含psql
变量引用。如果任何单个查询失败,剩余查询的执行将继续,除非设置了ON_ERROR_STOP。每个查询的执行
都受ECHO处理的影响。(通常在使用\gexec时,将ECHO设置为
all或queries是明智的。)查询记录、单步模式、计时和其他查询执行功能也适用于每个生成的查询。
如果当前查询缓冲区为空,则重新执行最近发送的查询。
\gset [ prefix ] #将当前查询缓冲区发送到服务器,并将查询的输出存储到psql变量中 (参见下面的Variables)。 要执行的查询必须返回一行。该行的每一列都存储在一个单独的变量中,变量名与列名相同。例如:
=>SELECT 'hello' AS var1, 10 AS var2->\gset=>\echo :var1 :var2hello 10
如果您指定一个prefix,
该字符串将被添加到查询的列名前,以创建要使用的变量名:
=>SELECT 'hello' AS var1, 10 AS var2->\gset result_=>\echo :result_var1 :result_var2hello 10
如果列的结果为NULL,则相应的变量将被取消设置,而不是被设置。
如果查询失败或者没有返回一行结果, 则不会改变任何变量。
如果当前查询缓冲区为空,则重新执行最近发送的查询。
\gx [ (option=value [...]) ] [ filename ]\gx [ (option=value [...]) ] [ |command ] #
\gx 等同于 \g,不同之处在于它强制为此查询启用扩展输出模式,
就好像在\pset选项列表中包含了expanded=on一样。另请参见\x。
\h 或 \help [ command ] #
给出指定SQL命令的语法帮助。如果未指定command,
则psql将列出所有可用语法帮助的命令。如果command是星号
(*),则显示所有SQL命令的语法帮助。
与大多数其他元命令不同,整个行的剩余部分始终被视为\help的参数,
参数中不进行变量插值或反引号扩展。
为了简化输入,由多个单词组成的命令不需要加引号。因此,可以直接输入\help alter table。
\H 或 \html #
打开HTML查询输出格式。如果HTML格式已经打开,
则切换回默认的对齐文本格式。此命令用于兼容性和便利性,但请参阅\pset
有关设置其他输出选项。
\i 或 \include filename #
从文件filename中读取输入,并将其执行为
好像它是在键盘上键入的一样。
如果filename是-
(连字符),那么标准输入将被读取,直到EOF指示或\q元命令。
这可用于将交互式输入与文件输入交错使用。请注意,仅当在最外层级别处于活动状态时,Readline行为才会被使用。
如果您想在屏幕上看到读取的行,请将变量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。
不正确评估为真或假的表达式将生成警告,并被视为false。
被跳过的行会被正常解析以识别查询和反斜杠命令,但查询不会发送到服务器,
而且除了条件命令(\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 or \include_relative filename #
\ir命令类似于\i,但是解析
相对文件名的方式不同。在交互模式下执行时,这两个命令的行为是相同的。
然而,在脚本中调用时,\ir会将文件名解释为相对于
脚本所在目录,而不是当前工作目录。
\l[x+] or \list[x+] [ pattern ] #
列出服务器中的数据库,并显示它们的名称、拥有者、
字符集编码和访问权限。如果指定了 pattern,
则仅列出名称匹配该模式的数据库。如果在命令名称后附加 x,
则结果以扩展模式显示。如果在命令名称后附加 +,
则还会显示数据库大小、默认表空间和描述。
(大小信息仅适用于当前用户可以连接的数据库。)
\lo_export loid filename #
从数据库中读取具有OID loid的大对象,并将其写入filename。请注意,这与服务器函数
lo_export略有不同,后者使用数据库服务器运行的用户权限,
并在服务器的文件系统上操作。
使用\lo_list来查找大对象的OID。
\lo_import filename [ comment ] #将文件存储到一个PostgreSQL大对象中。可选地,它将给定的注释与对象关联起来。例如:
foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
响应表明大对象收到了对象ID 152801,这个ID可以用来在将来访问新创建的大对象。为了可读性起见,建议始终将一个可读的注释与每个对象关联起来。OID和注释都可以用\lo_list命令查看。
请注意,此命令与服务器端的lo_import略有不同,因为它作为本地用户在本地文件系统上操作,而不是服务器的用户和文件系统。
\lo_list[x+] #
显示当前存储在数据库中的所有 PostgreSQL
大对象的列表,以及为它们提供的任何注释。
如果在命令名称后附加 x,则结果
以扩展模式显示。
如果在命令名称后附加 +,
则每个大对象将与其相关权限一起列出,
如果有的话。
\lo_unlink loid #
从数据库中删除具有OID为loid的大对象。
使用\lo_list命令来查找大对象的OID。
\o 或 \out [ filename ]\o 或 \out [ |command ] #
安排将未来的查询结果保存到文件filename,
或将未来的结果传输到shell命令command。
如果未指定参数,则查询输出重置为标准输出。
如果参数以|开头,则整个剩余部分的行被视为要执行的command,
在其中不进行变量插值或反引号扩展。其余部分的行会被直接传递给
shell。
“查询结果”包括从数据库服务器获取的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令的输出(例如\d);但不包括错误消息。
要在查询结果之间插入文本输出,使用\qecho。
\p或\print #将当前查询缓冲区打印到标准输出。 如果当前查询缓冲区为空,则打印最近执行的查询。
\parse statement_name #从当前查询缓冲区创建一个预处理语句,基于 目标预处理语句对象的名称。空字符串 表示未命名的预处理语句。
示例:
SELECT $1 \parse stmt1
此命令会使用扩展查询协议,与正常的 psql操作不同,后者使用简单查询协议。 此命令将发出一个 Parse (F) 消息,因此可以用于测试来自 psql的扩展查询协议。此命令仅影响下一个 执行的查询;所有后续查询将默认使用简单查询协议。
\password [ username ] #
更改指定用户(默认为当前用户)的密码。此命令提示输入新密码,对其进行加密,
并将其作为ALTER ROLE命令发送到服务器。这样可以确保新密码
不会以明文形式出现在命令历史记录、服务器日志或其他地方。
\prompt [ text ] name #
提示用户提供文本,将其赋值给变量name。
可以指定一个可选的提示字符串text。
(对于多个单词的提示,用单引号括起文本。)
默认情况下,\prompt使用终端进行输入和输出。然而,如果使用了
-f命令行开关,\prompt将使用标准输入和标准输出。
\pset [ option [ value ] ] #
这个命令设置影响查询结果表输出的选项。
option
指示要设置哪个选项。根据所选选项,value的语义会有所不同。
对于某些选项,省略value会导致该选项被切换或取消设置,具体描述在特定选项下。
如果没有提到这样的行为,那么省略value只会显示当前设置。
\pset不带任何参数时,显示所有打印选项的当前状态。
可调整的打印选项包括:
border #
value必须是一个数字。一般来说,数字越高,表格的边框和线条就越多,
但具体细节取决于特定格式。在HTML格式中,这将直接转换为border=...属性。
在大多数其他格式中,只有值0(无边框)、1(内部分隔线)和2(表框)有意义,值大于2将被视为border = 2。
latex和latex-longtable格式还允许值为3,以在数据行之间添加分隔线。
columns #
设置wrapped格式的目标宽度,同时也是确定输出是否足够宽以
需要分页器或在扩展自动模式下切换到垂直显示的宽度限制。
零(默认值)会导致目标宽度由环境变量COLUMNS控制,或者如果未设置
COLUMNS则由检测到的屏幕宽度控制。
另外,如果columns为零,则wrapped格式仅影响屏幕输出。
如果columns为非零,则文件和管道输出也会被包装到该宽度。
csv_fieldsep #指定在CSV输出格式中使用的字段分隔符。如果分隔符字符出现在字段的值中, 则该字段将根据标准CSV规则在双引号内输出。 默认值是逗号。
expanded(或x) #
如果指定了value,它必须是on或off,
这将启用或禁用扩展模式,或者是auto。
如果省略了value,则命令在开启和关闭设置之间切换。
启用扩展模式时,查询结果以两列显示,左侧是列名,右侧是数据。
如果数据在正常的“水平”模式下无法完全显示在屏幕上,则此模式很有用。
在自动设置中,当查询输出具有多列且宽度超过屏幕时,将使用扩展模式;否则,将使用常规模式。
自动设置仅在对齐和换行格式中有效。在其他格式中,它始终表现为扩展模式已关闭。
fieldsep #
指定在未对齐的输出格式中使用的字段分隔符。这样,可以创建例如制表符分隔的输出,
其他程序可能更喜欢。要将制表符设置为字段分隔符,请键入
\pset fieldsep '\t'。默认字段分隔符是
'|'(一根竖线)。
fieldsep_zero #将未对齐输出格式中使用的字段分隔符设置为零字节。
footer #
如果指定了value,
它必须是on或off,
这将启用或禁用表格页脚的显示
((计数)。
如果省略了n 行)value,
命令将切换页脚的显示或隐藏。
format #
设置输出格式为aligned、asciidoc、
csv、html、latex、
latex-longtable、troff-ms、
unaligned或wrapped。
允许使用唯一缩写。
aligned格式是标准的、人类可读的、格式良好的文本输出;这是默认设置。
unaligned格式将一行中的所有列写在一行上,由当前活动的字段分隔符分隔。这对于创建可能被其他程序读取的输出很有用,例如,制表符分隔或逗号分隔格式。然而,如果字段分隔符字符出现在列的值中,则不会被特殊处理;因此,CSV格式可能更适合这些目的。
csv格式
通过逗号分隔的列值,应用在
RFC 4180
中描述的引用规则。
此输出与服务器的CSV格式的
COPY命令兼容。
生成包含列名的标题行,除非
tuples_only参数设置为
on。不打印标题和页脚。
每行以系统相关的行结束字符结束,
对于类Unix系统通常是单个换行符(\n),
对于Microsoft Windows则是回车和换行序列
(\r\n)。
可以使用除逗号以外的字段分隔符字符来选择
\pset csv_fieldsep。
wrapped格式类似于aligned,但会将宽数据值跨行包装,以使输出适合目标列宽。
目标宽度由columns选项下描述的方式确定。请注意,psql不会尝试包装列标题;
因此,如果列标题所需的总宽度超过目标宽度,则wrapped格式的行为与aligned相同。
asciidoc,html,
latex,latex-longtable,和
troff-ms格式生成的表格旨在包含在使用相应标记语言的文档中。
它们不是完整的文档!这在HTML中可能不是必需的,但在
LaTeX中,您必须有一个完整的文档包装器。
latex格式使用LaTeX的tabular
环境。
latex-longtable格式需要LaTeX
的longtable和booktabs包。
linestyle #
设置边框线绘制样式为ascii、old-ascii或unicode之一。
允许使用唯一缩写。(这意味着一个字母就足够了。)
默认设置为ascii。
此选项仅影响aligned和wrapped输出格式。
ascii样式使用普通的ASCII字符。数据中的换行使用右边边缘的+符号显示。
当wrapped格式将数据从一行换到下一行而没有换行符时,在第一行的右边缘显示一个点(.),并在下一行的左边缘再次显示。
old-ascii样式使用普通的ASCII字符,使用在PostgreSQL 8.4及更早版本中使用的格式样式。
数据中的换行符使用:符号代替左侧列分隔符显示。
当数据从一行换行到下一行而没有换行符时,使用;符号代替左侧列分隔符。
unicode样式使用Unicode绘图字符。数据中的换行使用右边距中的回车符号显示。
当数据从一行换行到下一行而没有换行符时,第一行的右边距显示省略号符号,
接着在下一行的左边距再次显示省略号符号。
当border设置大于零时,linestyle选项还确定了用哪些字符绘制边框线。
普通的ASCII字符在任何地方都有效,但在识别Unicode字符的显示器上看起来更好。
null #
设置要打印在空值位置的字符串。默认情况下是不打印任何内容,这很容易被误解为空字符串。
例如,一个人可能更喜欢\pset null '(null)'。
numericlocale #
如果指定了value,
它必须是on或off,
这将启用或禁用显示一个特定于区域设置的字符,
用于将小数点左侧的数字分组。如果省略了
value,
命令在常规和特定于区域设置的数字输出之间切换。
pager #
控制查询和psql帮助输出时使用分页程序的方式。
当pager选项为off时,不使用分页程序。
当pager选项为on时,在适当的情况下使用分页程序,即当输出到终端且不适合在屏幕上显示时。
pager选项也可以设置为always,这会导致分页程序用于所有终端输出,无论是否适合在屏幕上显示。
\pset pager没有value时,切换分页使用状态。
如果环境变量PSQL_PAGER或PAGER被设置,
输出将被分页传输到指定的程序。否则,将使用一个平台相关的默认程序
(例如more)。
当使用\watch命令重复执行查询时,在Unix系统上会使用环境变量PSQL_WATCH_PAGER来查找分页程序。
这是单独配置的,因为它可能会混淆传统的分页程序,但可以用于将输出发送到理解psql输出格式的工具(例如pspg --stream)。
pager_min_lines #
如果pager_min_lines设置为大于页面高度的数字,
则除非至少有这么多行的输出要显示,否则不会调用分页程序。默认设置为0。
recordsep #指定在未对齐的输出格式中使用的记录(行)分隔符。默认为换行符。
recordsep_zero #设置未对齐输出格式中使用的记录分隔符为零字节。
tableattr(或T) #
在HTML格式中,这指定要放置在table标签内的属性。
这可能是cellpadding或bgcolor等。
请注意,您可能不希望在这里指定border,因为这已经由\pset border处理。
如果没有给出value,则取消表格属性。
在latex-longtable格式中,这控制了包含左对齐数据类型的每列的比例宽度。
它被指定为一个以空格分隔的值列表,例如,'0.2 0.2 0.6'。
未指定输出列使用最后指定的值。
title(或C) #
设置任何随后打印的表的表标题。这可以用来为您的输出提供描述性标签。
如果没有给出value,则标题将被取消设置。
tuples_only(或t) #
如果指定了value,它必须是on或off,
这将启用或禁用仅元组模式。如果省略了value,
命令将在常规输出和仅元组输出之间切换。常规输出包括额外信息,如列标题、标题和各种页脚。
在仅元组模式下,只显示实际的表数据。
unicode_border_linestyle #
设置unicode线条样式的边框绘制样式为single或double之一。
unicode_column_linestyle #
设置unicode线条样式的列绘制样式为single或double之一。
unicode_header_linestyle #
设置unicode线条样式的标题绘制样式为single或double之一。
xheader_width #
设置扩展输出的标题最大宽度为以下之一:
full(默认值),
column,page,或一个
integer value。
full:扩展的标题不会被截断,
并且将与最宽的输出行一样宽。
column:将标题行截断为第一列的宽度。
page:将标题行截断到终端宽度。
integer value:指定标题行的确切最大宽度。
这些不同格式的示例可以在下面的Examples中看到。
有各种快捷命令用于\pset。请参见\a、
\C、\f、\H、
\t、\T和\x。
\q或\quit #退出psql程序。 在脚本文件中,只有该脚本的执行被终止。
\qecho text [ ... ] #
这个命令与\echo命令相同,只是输出将被写入查询输出通道,由\o设置。
\r或\reset #重置(清除)查询缓冲区。
\restrict restrict_key #
使用提供的密钥进入“受限”模式。在此模式下,唯一允许的元命令是
\unrestrict,用于退出受限模式。密钥只能包含字母数字字符。
此命令主要用于由 pg_dump、 pg_dumpall 和 pg_restore 生成的纯文本转储,但在其他地方也可能有用。
\s [ filename ] #
打印psql的命令行历史记录到filename。
如果省略filename,历史记录将被写入标准输出(如果适用,将使用分页器)。
此命令在psql未启用Readline支持时不可用。
\set [ name [ value [ ... ] ] ] #
设置psql变量name为value,如果给出多个值,则设置为所有值的连接。
如果只给出一个参数,则将变量设置为空字符串值。要取消变量设置,请使用\unset命令。
\set没有任何参数时,显示当前设置的所有psql变量的名称和值。
有效的变量名可以包含字母、数字和下划线。有关详细信息,请参见下面的Variables。 变量名区分大小写。
某些变量是特殊的,它们控制psql的行为或者自动设置以反映连接状态。 这些变量在下面的Variables中有文档记录。
这个命令与SQL命令SET无关。
\setenv name [ value ] #
设置环境变量name为value,或者如果未提供value,
则取消设置环境变量。示例:
testdb=>\setenv PAGER lesstestdb=>\setenv LESS -imx4F
\sf[+] function_description #
这个命令获取并显示指定函数或过程的定义,以CREATE OR REPLACE FUNCTION或
CREATE OR REPLACE PROCEDURE命令的形式呈现。
定义将打印到当前查询输出通道,由\o设置。
目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)。
如果有多个同名函数,则必须给出参数类型。
如果在命令名称后添加+,则输出的行将被编号,函数体的第一行将被标记为第1行。
与大多数其他元命令不同,整个行的剩余部分始终被视为\sf的参数,
参数中不进行变量插值或反引号扩展。
\sv[+] view_name #
这个命令获取并显示指定视图的定义,以CREATE OR REPLACE VIEW命令的形式。
定义将打印到当前查询输出通道,由\o设置。
如果在命令名称后添加+,那么输出行将从1开始编号。
与大多数其他元命令不同,整个行的剩余部分始终被视为\sv的参数,
参数中不进行变量插值或反引号扩展。
\startpipeline\sendpipeline\syncpipeline\endpipeline\flushrequest\flush\getresults [ number_results ] #
这一组命令实现了 SQL 语句的管道化。
管道必须以 \startpipeline 开始,并以
\endpipeline 结束。在这之间可以有任意数量的
\syncpipeline 命令,它会发送一个
同步消息
而不结束正在进行的管道并刷新发送缓冲区。
在管道模式下,语句会在不等待前一个语句结果的情况下发送到服务器。
有关更多详细信息,请参见 第 32.5 节。
在管道进行时执行的所有查询都使用扩展查询协议。
当以分号结束时,查询会附加到管道中。
在进行中的管道中,可以使用元命令 \bind、
\bind_named、\close_prepared 或
\parse。在管道进行时,\sendpipeline 将
当前查询缓冲区附加到管道中。其他元命令如
\g、\gx 或
\gdesc 在管道模式下是不允许的。
\flushrequest 将一个刷新命令附加到管道,
允许使用 \getresults 读取结果,而无需发出同步或结束管道。
\getresults 将自动将未发送的数据推送到服务器。
\flush 可用于手动推送未发送的数据。
\getresults 接受一个可选的
number_results 参数。
如果提供,则仅读取前
number_results 个待处理结果。
如果未提供或 0,则读取所有待处理结果。
当管道模式处于活动状态时,提供一个专用的提示变量以报告管道状态。
有关更多详细信息,请参见 %P。
在管道模式下不支持 COPY。
示例:
\startpipeline SELECT * FROM pg_class; SELECT 1 \bind \sendpipeline \flushrequest \getresults \endpipeline
\t #
切换显示输出列名标题和行数页脚。此命令等效于 \pset
tuples_only,仅为方便起见提供。
\T table_options #
指定在 table 标签中放置的属性,在 HTML 输出格式中。
该命令等效于 \pset tableattr 。
table_options
\timing [ on | off ] #使用参数,打开或关闭显示每个SQL语句执行时间的功能。没有参数时,切换显示开关。 显示的时间单位为毫秒;超过1秒的时间间隔也以分钟:秒的格式显示,如有必要还会显示小时和天。
\unrestrict restrict_key #
退出“受限”模式(即,所有其他元命令被阻止的模式),
前提是指定的密钥与进入受限模式时提供给
\restrict 的密钥匹配。
此命令主要用于由 pg_dump、 pg_dumpall 和 pg_restore 生成的纯文本转储,但在其他地方也可能有用。
\unset name #
取消设置(删除)psql变量name。
大多数控制psql行为的变量不能被取消设置;相反,\unset命令被解释为将它们设置为默认值。
请参见下面的Variables。
\w 或 \write filename\w 或 \write |command #
将当前查询缓冲区写入文件filename或将其传输到shell命令command。
如果当前查询缓冲区为空,则写入最近执行的查询。
如果参数以|开头,则整个剩余部分的行被视为要执行的command,
在其中不进行变量插值或反引号扩展。其余部分的行会被直接传递给shell。
\warn text [ ... ] #
这个命令与\echo命令相同,只是输出将被写入psql的标准错误通道,而不是标准输出。
\watch [ i[nterval]=seconds ] [ c[ount]=times ] [ m[in_rows]=rows ] [ seconds ] #
重复执行当前查询缓冲区(如 \g 所做的那样),
直到被中断、查询失败、达到执行计数限制(如果给定),
或查询不再返回最小行数。每次执行之间等待指定的秒数(默认 2 秒)。
默认等待时间可以通过变量
WATCH_INTERVAL 更改。
为了向后兼容,
seconds 可以在有或没有
interval= 前缀的情况下指定。
每个查询结果都将显示一个包含 \pset title
字符串(如果有)、查询开始时的时间和延迟间隔的标题。
如果当前查询缓冲区为空,则重新执行最近发送的查询。
\x [ on | off | auto ] #
设置或切换扩展表格格式模式。因此,它等同于\pset expanded。
\z[Sx] [ pattern ] #
列出表、视图和序列及其相关的访问权限。
如果指定了一个 pattern,
则仅列出名称匹配该模式的表、视图和序列。默认情况下,仅显示用户创建的对象;
提供一个模式或 S 修饰符以包含系统对象。
如果在命令名称后附加 x,则结果将以扩展模式显示。
这是\dp的别名(“显示权限”)。
\! [ command ] #
不带参数时,转义到一个子shell;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命令将其分成多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参见第 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命令会显示在当前 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(对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值on和off的控制变量也能接受其他常见的布尔值拼写方式,例如true和false。
被特殊对待的变量是:
AUTOCOMMIT
#
在被设置为on(默认)时,每一个 SQL 命令在成功完成时会被自动提交。在这种模式中要推迟提交,必须输入一个BEGIN或者START TRANSACTION SQL 命令。当被设置为off或者被重置时,在显式发出COMMIT或者END之前,SQL 命令不会被提交。自动提交关闭模式会为你发出一个隐式的BEGIN,这会发生在任何不在一个事务块中且本身即不是BEGIN及其他事务控制命令且不是无法在事务块中执行的命令(例如VACUUM)之前。
在自动提交关闭模式中,必须通过ABORT或者ROLLBACK显式地放弃任何失败的事务。还要记住,如果退出会话时没有提交,则所有的工作都会丢失。
自动提交打开模式是PostgreSQL的传统行为,但是自动提交关闭模式更接近于 SQL 的规范。如果更喜欢自动提交关闭模式,可以在系统级的psqlrc文件或者个人的~/.psqlrc文件中设置它。
COMP_KEYWORD_CASE #
确定在补全一个 SQL 关键字时要使用的大小写形式。如果被设置为lower或者upper,补全后的词将分别是小写或者大写形式。如果被设置为preserve-lower或者preserve-upper(默认),补全后的词将会保持该词已输入部分的大小写形式,但是如果被补全的词还没有被输入,则它会被分别补全成小写或者大写形式。
DBNAME #当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或重置。
ECHO #
如果被设置为all,所有非空输入行会被按照读入它们的样子打印到标准输出(不适用于交互式读取的行)。要在程序开始时选择这种行为,可以使用开关-a。如果被设置为queries,psql会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e。如果被设置为errors,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b。如果被设置为none(默认值),则不会显示任何查询。
ECHO_HIDDEN #
当这个变量被设置为on且一个反斜线命令查询数据库时,相应的查询会被先显示。这种特性可以帮助我们学习PostgreSQL的内部并且在自己的程序中提供类似的功能(要在程序开始时选择这种行为,可以使用开关-E)。如果把这个变量设置为值noexec,则对应的查询只会被显示而并不真正被发送给服务器执行。默认值是off。
ENCODING #
当前的客户端字符集编码。每一次你连接到一个数据库(包括程序启动)时以及当你用\encoding更改编码时,这个变量都会被设置,但它可以被更改或重置。
ERROR #
如果上一个SQL查询失败则为true,如果成功则是false。另见SQLSTATE。
FETCH_COUNT #
如果这个变量被设置为一个大于零的整数值,SELECT查询的结果会以一组一组的方式取出并且显示(而不是像默认的那样把整个结果集拿到以后再显示),每一组就会包括这么多个行。因此,这种方式只会使用有限的内存量,而不管整个结果集的大小。在启用这个特性时,通常会使用 100 到 1000 的设置。记住在使用这种特性时,一个查询可能会在已经显示了一些行之后失败。
尽管可以把这种特性用于任何输出格式,但是默认的aligned格式看起来会比较糟糕,因为每一组的FETCH_COUNT行将被单独格式化,这就会导致不同的行组的列宽不同。其他输出格式会更好。
HIDE_TABLEAM #
如果此变量设置为true,则不显示表的访问方法的详细信息。这主要用于回归测试。
HIDE_TOAST_COMPRESSION #
如果此变量设置为true,则不显示列压缩方法的详细信息。这主要用于回归测试。
HISTCONTROL #
如果此变量设置为ignorespace,以空格开始的行不会被放入历史列表中。如果设置为ignoredups,则匹配之前历史行的行不会被放入。值ignoreboth组合了这两种选项。如果设置为none(默认值),所有在交互模式中读取的行都会保存在历史列表中。
这个特性是可耻地从Bash抄袭过来的。
HISTFILE #
该文件名将被用于存储历史列表。如果未设置,文件名将从PSQL_HISTORY环境变量中取得。如果该环境变量也没有被设置,则默认值是~/.psql_history,在Windows上是%APPDATA%\postgresql\psql_history。例如,
\set HISTFILE ~/.psql_history-:DBNAME
放在~/.psqlrc中将导致psql为每个数据库维护一个单独的历史。
这个特性是可耻地从Bash抄袭过来的。
HISTSIZE #存储在命令历史中的最大命令数(默认值500)。如果设置为负值,则不应用限制。
这个特性是无耻地从Bash抄袭过来的。
HOST #当前连接到的数据库服务器主机。每次连接到一个数据库时都会设置该变量(包括程序 启动时),但是可以被更改或者重置。
IGNOREEOF #如果被设置为1或更小,向一个psql的交互式会话发送一个EOF字符(通常是Control+D)将会终止应用。如果设置为一个较大的数字值,则必须键入多个连续的EOF字符才能让交互式会话终止。如果该变量被设置为一个非数字值,则它会被解释为10。默认值为0。
这个特性是无耻地从Bash抄袭过来的。
LASTOID #
最后被影响的 OID 的值,这可能会由INSERT或者\lo_import命令返回。这个变量只保证在下一个SQL命令被显示完之前有效。
PostgreSQL 服务器从12版开始不再支持 OID 系统列,因此,在面向此类服务器时,跟随在INSERT后面的 LASTOID 将始终为0。
LAST_ERROR_MESSAGELAST_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 #当前连接到的数据库服务器端口。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以更改或重置。
PROMPT1PROMPT2PROMPT3 #这些变量指定psql发出的提示符的模样。见下文的Prompting。
QUIET #
把这个变量设置为on等效于命令行选项-q。在交互模式下可能用处不大。
ROW_COUNT #上一个SQL查询返回的行数或者受影响的行数,如果该查询失败或者没有报告行计数则为0。
SERVER_VERSION_NAMESERVER_VERSION_NUM #
字符串形式的服务器版本号,例如9.6.2、10.1或11beta1,以及数字形式的服务器版本号,例如90602或100001。每次你连接到一个数据库(包括程序启动)时,这些都会被设置,但可以被改变或重设。
SERVICE #服务名称(如果适用)。
SHELL_ERROR #
true 如果上一个 shell 命令失败,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查询的失败相关的错误代码(见附录 A),如果上一个查询成功则为00000。
USER #当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序 启动时),但是可以被更改或重置。
VERBOSITY #
这个变量可以被设置为值default、verbose、terse或者sqlstate来控制错误报告的详细程度(另见\errverbose,在想要得到之前的错误的详细版本时使用)。
VERSIONVERSION_NAMEVERSION_NUM #
这些变量在程序启动时被设置以反映psql的版本,分别是一个详细的字符串、一个短字符串(例如9.6.2、10.1或者11beta1)以及一个数字(例如90602或者100001)。它们可以被更改或重设。
WATCH_INTERVAL #
此变量设置 \watch 执行查询之间等待的默认间隔(以秒为单位)。
默认值为 2 秒。在命令中指定的间隔将覆盖此变量。
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")不会被替换,除非所提及的变量就是当前被设置的。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。
:{?特殊语法根据该变量存在与否返回TRUE或者FALSE,并且因此总是会被替换,除非冒号被反斜线转义。
name}
变量的冒号语法对嵌入式查询语言(例如ECPG)来说是标准的SQL。用于数组切片和类型转换的冒号语法是PostgreSQL扩展,它有时可能会与标准用法冲突。把一个变量值转义成 SQL 文本或者标识符的冒号引用语法是一种psql扩展。
psql发出的提示符可以根据用户的喜好自定义。PROMPT1、PROMPT2和PROMPT3这三个变量包含了描述提示符外观的字符串和特殊转义序列。Prompt 1 是当psql等待新命令时发出的常规提示符。Prompt 2 是在命令输入时需要更多输入时发出的提示符,例如因为当命令没有被分号终止或者引用没有被关闭时就会发出这个提示符。在运行一个SQL COPY FROM STDIN命令并且需要在终端上输入一个行值时,会发出 Prompt 3。
所选提示变量的值将按字面意义打印,除非遇到百分号
(%)。根据下一个字符,某些其他文本将被替换。
定义的替换内容如下:
%M #
数据库服务器的完整主机名(带域名),或者
[local],如果连接是通过Unix域套接字,
或者[local:,
如果Unix域套接字不在编译时的默认位置。
/dir/name]
%m #
数据库服务器的主机名,在第一个点处截断,或者
[local],如果连接是通过Unix域套接字。
%> #数据库服务器正在监听的端口号。
%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设置,以便多行语句与第一行对齐,但没有可见的
次级提示符。
要在提示符中插入百分号,请写
%%。默认的提示符是
'%/%R%x%# '(用于提示符1和2),以及
'>> '(用于提示符3)。
这个特性是可耻地从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格式的宽度以及用来确定是否宽输出需要用到分页器或者切换到扩展自动模式中的垂直格式的宽度。
PGDATABASEPGHOSTPGPORTPGUSER #默认连接参数(见第 32.15 节)。
PG_COLOR #
规定在诊断消息中是否使用颜色。可能的值为always、auto和never。
PSQL_EDITOREDITORVISUAL #
\e、\ef以及\ev命令所使用的编辑器。会按照列出的顺序检查这些变量,第一个被设置的将被使用。如果都没有被设置,默认是使用vi在Unix系统上或者notepad.exe在Windows系统上。
PSQL_EDITOR_LINENUMBER_ARG #
当\e、\ef或者\ev带有一个行号参数时,这个变量指定用于传递起始行号给用户编辑器的命令行参数。对于Emacs或者vi之类的编辑器,这个变量是一个加号。如果需要在选项名称和行号之间有空格,可以在该变量的值中包括一个结尾的空格。例如:
PSQL_EDITOR_LINENUMBER_ARG='+' PSQL_EDITOR_LINENUMBER_ARG='--line '
在Unix系统上默认是+(对应于默认编辑器vi,且对很多其他常见编辑器可用);但在Windows系统上没有默认值。
PSQL_HISTORY #
命令历史文件的替代位置。波浪线(~)扩展会被执行。
PSQL_PAGERPAGER #
如果查询结果无法在屏幕上显示完整,它们将通过此命令进行传输。典型的值是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所支持的环境变量(见第 32.15 节)。
psqlrc and ~/.psqlrc #
如果没有-X选项,在连接到数据库后但在接收正常的命令之前,psql会尝试依次从系统级的启动文件(psqlrc)和用户的个人启动文件(~/.psqlrc)中读取并执行命令。这些文件可以用来设置客户端和/或服务器,通常是一些\set和SET命令。
系统范围的启动文件名为psqlrc。默认情况下,它会在安装的“系统配置”目录中寻找,最可靠的方法是运行pg_config --sysconfdir。通常这个目录会相对于包含PostgreSQL可执行文件的目录,例如../etc/。可以通过PGSYSCONFDIR环境变量来显式设置要查找的目录。
用户的个人启动文件名为.psqlrc,并且在调用用户的主目录中寻找。在Windows上,个人启动文件的名称改为%APPDATA%\postgresql\psqlrc.conf。在任何情况下,可以通过设置PSQLRC环境变量来覆盖此默认文件路径。
系统范围的启动文件和用户个人的启动文件都可以通过在文件名后附加破折号和PostgreSQL的主要或次要版本标识符来使其与psql版本相关,例如~/.psqlrc-18或~/.psqlrc-18.3。最具体版本匹配的文件将优先读取,而不是非特定版本的文件。这些版本后缀是在确定文件路径后添加的,如上所述。
.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允许一个单字母反斜杠命令的第一个参数直接写在该命令后面,中间不需要空格。现在则要求一些空格。
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_tablepeter@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
函数列表
-[ RECORD 1 ]-------+-----------------------------
模式 | pg_catalog
名称 | int48pl
结果数据类型 | bigint
参数数据类型 | integer, bigint
类型 | func
波动性 | immutable
并行 | safe
拥有者 | postgres
安全性 | invoker
防泄漏? | no
访问权限 |
语言 | internal
内部名称 | int48pl
描述 | + 运算符的实现
在合适的情况下,查询结果可以使用 \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 secondfirst | 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 ordtestdb->FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESCtestdb->\crosstabview "A" "B" "AxB" ordA | 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)