psql — PostgreSQL 交互式终端
psql
[选项
...] [数据库名
[用户名
]]
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=命令
#指定 psql 将执行给定的命令字符串 命令
。此选项可以重复并与 -f
选项以任意顺序组合。当指定了 -c
或 -f
时,psql 不会从标准输入读取命令;而是在按顺序处理完所有 -c
和 -f
选项后终止。
命令
必须是服务器完全可解析的命令字符串(即,它不包含 psql 特有的功能),或是一个单独的反斜杠命令。因此,您不能在 -c
选项中混用SQL和 psql 元命令。要实现这一点,您可以使用重复的 -c
选项或将字符串通过管道传输到 psql,例如
psql -c '\x' -c 'SELECT * FROM foo;'
或
echo '\x \\ SELECT * FROM foo;' | psql
(\\
是分隔符元命令)。
传递给 -c
的每个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=数据库名
#指定要连接的数据库名称。这等同于在命令行上将 数据库名
指定为第一个非选项参数。数据库名
可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-e
--echo-queries
#将所有发送到服务器的 SQL 命令也复制到标准输出。这等同于将变量 ECHO
设置为 queries
。
-E
--echo-hidden
#回显由 \d
和其他反斜杠命令生成的实际查询。您可以使用此功能来研究 psql 的内部操作。这等同于将变量 ECHO_HIDDEN
设置为 on
。
-f 文件名
--file=文件名
#从文件 文件名
而不是标准输入读取命令。此选项可以重复并与 -c
选项以任何顺序组合。当指定 -c
或 -f
时,psql 不会从标准输入读取命令;而是在按顺序处理完所有 -c
和 -f
选项后终止。除此之外,此选项大致等同于元命令 \i
。
如果 filename
是 -
(连字符),则读取标准输入直到 EOF 指示或 \q
元命令。这可以用于将交互式输入与文件输入交错。但是请注意,在这种情况下不使用 Readline(就像指定了 -n
一样)。
使用此选项与编写 psql <
略有不同。一般来说,两者都会产生您预期的结果,但使用 filename
-f
启用了一些很好的功能,例如带有行号的错误消息。使用此选项还可能略微减少启动开销。另一方面,使用 shell 输入重定向的变体(理论上)保证产生与您手动输入所有内容完全相同的输出。
-F 分隔符
--field-separator=分隔符
#使用 separator
作为非对齐输出的字段分隔符。这等同于 \pset fieldsep
或 \f
。
-h 主机名
--host=主机名
#指定服务器运行的机器的主机名。如果该值以斜杠开头,则将其用作 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 文件名
--output=文件名
#将所有查询输出放入文件 filename
。这等同于命令 \o
。
-p 端口
--port=端口
#指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT
环境变量的值,如果未设置,则默认为编译时指定的端口,通常为 5432。
-P 赋值
--pset=赋值
#指定打印选项,其风格类似于 \pset
。请注意,此处您必须用等号而不是空格分隔名称和值。例如,要将输出格式设置为 LaTeX,您可以写入 -P format=latex
。
-q
--quiet
#指定 psql 应该安静地工作。默认情况下,它会打印欢迎消息和各种信息输出。如果使用此选项,则不会发生这些情况。这对于 -c
选项很有用。这等同于将变量 QUIET
设置为 on
。
-R 分隔符
--record-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
的身份连接到数据库,而不是默认用户。(当然,您必须有这样做的权限。)
-v 赋值
--set=赋值
--variable=赋值
#执行变量赋值,类似于 \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[=主题
]
#显示关于 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”,它将从区域设置(Unix 系统上的 LC_CTYPE
环境变量)中检测适当的客户端编码。如果这未能按预期工作,可以使用环境变量 PGCLIENTENCODING
覆盖客户端编码。
在正常操作中,psql 会提供一个提示,其中包含 psql 当前连接的数据库名称,后跟字符串 =>
。例如
$ psql testdb
psql (18.0)
Type "help" for help.
testdb=>
在提示符处,用户可以输入SQL命令。通常,当达到命令终止分号时,输入行会发送到服务器。行尾不会终止命令。因此,命令可以为了清晰而分散在多行中。如果命令已发送并执行而没有错误,则命令的结果将显示在屏幕上。
如果未受信任的用户可以访问尚未采用安全模式使用模式的数据库,请通过从 search_path
中删除可公开写入的模式来开始您的会话。可以在连接字符串中添加 options=-csearch_path=
,或者在其他 SQL 命令之前发出 SELECT pg_catalog.set_config('search_path', '', false)
。这种考虑并非 psql 特有;它适用于执行任意 SQL 命令的每个接口。
每当执行命令时,psql 还会轮询由 LISTEN
和 NOTIFY
生成的异步通知事件。
C 风格的块注释会传递给服务器进行处理和删除,而 SQL 标准注释则由 psql 删除。
您在 psql 中输入的任何以未加引号的反斜杠开头的文本都是由 psql 本身处理的 psql 元命令。这些命令使 psql 对于管理或脚本编写更有用。元命令通常被称为斜杠或反斜杠命令。
psql 命令的格式是反斜杠,紧接着是命令动词,然后是任何参数。参数与命令动词之间以及参数之间用任意数量的空白字符分隔。
要在参数中包含空格,您可以使用单引号将其引用。要在参数中包含单引号,请在单引号文本中写入两个单引号。此外,单引号中包含的任何内容都受 C 风格替换的影响,例如 \n
(换行符)、\t
(制表符)、\b
(退格符)、\r
(回车符)、\f
(换页符)、\
数字
(八进制) 和 \x
数字
(十六进制)。在单引号文本中,反斜杠前面的任何其他字符都会引用该单个字符,无论它是什么。
如果在参数中出现未加引号的冒号(:
)后跟 psql 变量名,它将被变量的值替换,如下面SQL 插值所述。那里描述的 :'
和 变量名
':"
形式也有效。变量名
":{?
语法允许测试变量是否已定义。它被替换为 TRUE 或 FALSE。用反斜杠转义冒号可以保护它不被替换。变量名
}
在一个参数中,括在反引号(`
)中的文本被视为一条命令行,该命令行将传递给 shell。命令的输出(删除任何尾随换行符)将替换反引号中的文本。在反引号中包含的文本中,不会发生特殊的引用或其他处理,除了 :
(其中 变量名
变量名
是 psql 变量名)的出现将被变量的值替换。此外,:'
的出现将被变量的值替换,该值经过适当引用以成为单个 shell 命令参数。(后一种形式几乎总是首选,除非您非常确定变量中的内容。)由于回车符和换行符不能在所有平台上安全引用,因此当这些字符出现在值中时,变量名
':'
形式会打印错误消息,并且不替换变量值。变量名
'
有些命令接受一个SQL标识符(例如表名)作为参数。这些参数遵循SQL的语法规则:未加引号的字母强制转换为小写,而双引号("
)保护字母免于大小写转换,并允许在标识符中包含空格。在双引号内,成对的双引号在结果名称中减少为单个双引号。例如,FOO"BAR"BAZ
被解释为 fooBARbaz
,而 "A weird"" name"
变为 A weird" name
。
参数解析在行尾停止,或者当发现另一个未加引号的反斜杠时停止。未加引号的反斜杠被视为新元命令的开始。特殊序列 \\
(两个反斜杠)标记参数的结束并继续解析SQL命令(如果有的话)。这样SQL和 psql 命令可以自由地在一行中混合使用。但在任何情况下,元命令的参数都不能超出行的末尾。
许多元命令作用于当前查询缓冲区。这只是一个缓冲区,用于保存已输入但尚未发送到服务器执行的 SQL 命令文本。它将包括之前的输入行以及在同一行中出现在元命令之前的任何文本。
许多元命令还允许附加 x
作为选项。这将导致结果以扩展模式显示,就像使用了 \x
或 \pset expanded
一样。
定义了以下元命令
\a
#如果当前表输出格式未对齐,则切换为对齐。如果未对齐,则将其设置为未对齐。此命令保留是为了向后兼容。有关更通用的解决方案,请参阅 \pset
。
\bind
[ 参数
] ... #设置下一次查询执行的查询参数,并将指定的参数传递给任何参数占位符($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
传递或传递给 command
。同样,执行权限是本地用户的,而不是服务器的,并且不需要 SQL 超级用户权限。
对于 \copy ... from stdin
,数据行从发出命令的同一源读取,直到读取到只包含 \.
的行或流到达文件结束。此选项对于在 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
或默认值。还显示相关的索引、约束、规则和触发器。对于外部表,还显示相关的外部服务器。(“匹配模式”的定义见下面的 模式。)
对于某些类型的关系,\d
为每列显示额外信息:序列的列值、索引的索引表达式以及外部表的外部数据封装器选项。
命令形式 \d+
相同,但显示更多信息:显示与表列关联的任何注释,以及表中 OID 的存在,如果关系是视图,则显示视图定义,非默认的 复制身份 设置以及如果关系具有访问方法,则显示 访问方法 名称。
默认情况下,只显示用户创建的对象;提供模式或 S
修饰符以包含系统对象。
如果 \d
不带 pattern
参数使用,则等效于 \dtvmsE
,它将显示所有可见表、视图、物化视图、序列和外部表的列表。这纯粹是为了方便。
与许多其他命令一样,如果在命令名称后附加 x
,则结果以扩展模式显示,但请注意,这仅适用于 \d
不带 pattern
参数使用时,并且 x
修饰符不能紧跟在 \d
之后(因为 \dx
是一个不同的命令);x
修饰符只能出现在 S
或 +
修饰符之后。例如,\d+x
等效于 \dtvmsE+x
,并将以扩展模式显示所有关系的列表。
\da[Sx] [ pattern
]
#列出聚合函数,以及它们的返回类型和它们操作的数据类型。如果指定了 pattern
,则只显示名称匹配模式的聚合。默认情况下,只显示用户创建的对象;提供模式或 S
修饰符以包含系统对象。如果在命令名称后附加 x
,则结果以扩展模式显示。
\dA[x+] [ pattern
]
#列出访问方法。如果指定了 pattern
,则只显示名称匹配模式的访问方法。如果在命令名称后附加 x
,则结果以扩展模式显示。如果在命令名称后附加 +
,则每个访问方法都与其关联的处理函数和描述一起列出。
\dAc[x+] [access-method-pattern
[input-type-pattern
]]
#列出操作符类(参见 第 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
... ] ]
#列出函数,以及它们的返回数据类型、参数数据类型和函数类型,函数类型分类为“agg”(聚合)、“normal”(普通)、“procedure”(过程)、“trigger”(触发器)或“window”(窗口)。要只显示特定类型的函数,请向命令添加相应的字母a
、n
、p
、t
或w
。如果指定了pattern
,则只显示名称与该模式匹配的函数。任何附加参数都是类型名称模式,它们将与函数的第一个、第二个等参数的类型名称匹配。(匹配的函数可以拥有比您指定的更多参数。为了防止这种情况,请将破折号-
作为最后一个arg_pattern
写入。)默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个函数的附加信息,包括易变性、并行安全性、所有者、安全分类、是否防泄漏、访问权限、语言、内部名称(仅适用于C和内部函数)以及描述。可以使用\sf
查看特定函数的源代码。
\dF[x+] [ pattern
]
#列出文本搜索配置。如果指定了pattern
,则只显示名称与该模式匹配的配置。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个配置的完整描述,包括底层文本搜索解析器和每个解析器令牌类型的字典列表。
\dFd[x+] [ pattern
]
#列出文本搜索字典。如果指定了pattern
,则只显示名称与该模式匹配的字典。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个选定字典的附加信息,包括底层文本搜索模板和选项值。
\dFp[x+] [ pattern
]
#列出文本搜索解析器。如果指定了pattern
,则只显示名称与该模式匹配的解析器。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个解析器的完整描述,包括底层函数和识别的令牌类型列表。
\dFt[x+] [ pattern
]
#列出文本搜索模板。如果指定了pattern
,则只显示名称与该模式匹配的模板。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个模板的附加信息,包括底层函数名称。
\dg[Sx+] [ pattern
]
#列出数据库角色。(由于“用户”和“组”的概念已统一为“角色”,因此此命令现在等效于\du
。)默认情况下,只显示用户创建的角色;提供S
修饰符以包含系统角色。如果指定了pattern
,则只列出名称与该模式匹配的角色。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个角色的附加信息;目前,这会添加每个角色的注释。
\dl[x+]
#这是\lo_list
的别名,显示大型对象列表。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个大型对象都将列出其关联的权限(如果有)。
\dL[Sx+] [ pattern
]
#列出过程语言。如果指定了pattern
,则只列出名称与该模式匹配的语言。默认情况下,只显示用户创建的语言;提供S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个语言都将列出其调用处理程序、验证器、访问权限以及它是否为系统对象。
\dn[Sx+] [ pattern
]
#列出模式(命名空间)。如果指定了pattern
,则只列出名称与该模式匹配的模式。默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个对象都将列出其关联的权限和描述(如果有)。
\do[Sx+] [ pattern
[ arg_pattern
[ arg_pattern
] ] ]
#列出运算符及其操作数和结果类型。如果指定了pattern
,则只列出名称与该模式匹配的运算符。如果指定了一个arg_pattern
,则只列出右参数类型名称与该模式匹配的前缀运算符。如果指定了两个arg_pattern
,则只列出参数类型名称与这些模式匹配的二元运算符。(或者,对于一元运算符的未使用参数,写入-
。)默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个运算符的附加信息,包括底层函数的名称以及它是否防泄漏。
\dO[Sx+] [ pattern
]
#列出排序规则。如果指定了pattern
,则只列出名称与该模式匹配的排序规则。默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个排序规则都将列出其关联的描述(如果有)。请注意,只显示当前数据库编码可用的排序规则,因此在同一安装的不同数据库中,结果可能会有所不同。
\dp[Sx] [ pattern
]
#列出表、视图和序列及其关联的访问权限。如果指定了pattern
,则只列出名称与该模式匹配的表、视图和序列。默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。如果命令名称后附加了x
,则结果以扩展模式显示。
\dP[itnx+] [ pattern
]
#列出分区关系。如果指定了pattern
,则只列出名称与该模式匹配的条目。修饰符t
(表)和i
(索引)可以附加到命令后,以过滤要列出的关系类型。默认情况下,列出分区表和索引。
如果使用修饰符n
(“嵌套”),或指定了模式,则包含非根分区关系,并显示一列以显示每个分区关系的父级。
如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则还显示每个关系分区的大小总和,以及关系的描述。如果n
与+
结合使用,则显示两个大小:一个包括直接附加的叶分区的总大小,另一个显示所有分区的总大小,包括间接附加的子分区。
\drds[x] [ role-pattern
[ database-pattern
] ]
#列出已定义的配置设置。这些设置可以是角色特定的、数据库特定的,或两者兼有。role-pattern
和database-pattern
分别用于选择要列出的特定角色和数据库。如果省略,或指定*
,则列出所有设置,包括那些不是角色特定的或数据库特定的设置。如果命令名称后附加了x
,则结果以扩展模式显示。
ALTER ROLE
和ALTER DATABASE
命令用于定义每个角色和每个数据库的配置设置。
\drg[Sx] [ pattern
]
#列出有关每个已授予角色成员资格的信息,包括分配的选项(ADMIN
、INHERIT
和/或SET
)和授权者。有关角色成员资格的信息,请参阅GRANT
命令。
默认情况下,只显示授予用户创建的角色的权限;提供S
修饰符以包含系统角色。如果指定了pattern
,则只列出授予名称与该模式匹配的角色的权限。如果命令名称后附加了x
,则结果以扩展模式显示。
\dRp[x+] [ pattern
]
#列出复制发布。如果指定了pattern
,则只列出名称与该模式匹配的发布。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则还显示与每个发布关联的表和模式。
\dRs[x+] [ pattern
]
#列出复制订阅。如果指定了pattern
,则只列出名称与该模式匹配的订阅。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示订阅的附加属性。
\dT[Sx+] [ pattern
]
#列出数据类型。如果指定了pattern
,则只列出名称与该模式匹配的类型。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个类型都将列出其内部名称和大小,如果它是enum
类型,则列出其允许值,以及其关联的权限。默认情况下,只显示用户创建的对象;提供模式或S
修饰符以包含系统对象。
\du[Sx+] [ pattern
]
#列出数据库角色。(由于“用户”和“组”的概念已统一为“角色”,因此此命令现在等效于\dg
。)默认情况下,只显示用户创建的角色;提供S
修饰符以包含系统角色。如果指定了pattern
,则只列出名称与该模式匹配的角色。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则显示每个角色的附加信息;目前,这会添加每个角色的注释。
\dx[x+] [ pattern
]
#列出已安装的扩展。如果指定了pattern
,则只列出名称与该模式匹配的扩展。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则列出属于每个匹配扩展的所有对象。
\dX[x] [ pattern
]
#列出扩展统计信息。如果指定了pattern
,则只列出名称与该模式匹配的扩展统计信息。如果命令名称后附加了x
,则结果以扩展模式显示。
每种扩展统计信息的状态显示在其统计信息类型命名的列中(例如 Ndistinct)。defined
表示在创建统计信息时已请求,NULL表示未请求。如果您想知道是否已运行ANALYZE
以及统计信息是否可用于规划器,可以使用pg_stats_ext
。
\dy[x+] [ pattern
]
#列出事件触发器。如果指定了pattern
,则只列出名称与该模式匹配的事件触发器。如果命令名称后附加了x
,则结果以扩展模式显示。如果命令名称后附加了+
,则每个对象都将列出其关联的描述。
\e
或 \edit
[ filename
] [ line_number
]
#如果指定了filename
,则编辑该文件;编辑器退出后,文件内容将复制到当前查询缓冲区中。如果没有给出filename
,则当前查询缓冲区将复制到一个临时文件,然后以相同方式编辑。或者,如果当前查询缓冲区为空,则最近执行的查询将复制到一个临时文件并以相同方式编辑。
如果您编辑文件或以前的查询,并且在不修改文件的情况下退出编辑器,则查询缓冲区将被清除。否则,查询缓冲区的新内容将根据psql的正常规则重新解析,将整个缓冲区视为单行。任何完整的查询都会立即执行;也就是说,如果查询缓冲区包含或以分号结尾,则到该点为止的所有内容都将执行并从查询缓冲区中移除。查询缓冲区中剩余的任何内容都将重新显示。键入分号或\g
发送它,或\r
通过清除查询缓冲区来取消它。
将缓冲区视为单行主要影响元命令:元命令后缓冲区中的任何内容都将被视为元命令的参数,即使它跨多行。(因此,您不能以这种方式创建使用元命令的脚本。为此请使用\i
。)
如果指定了行号,psql将把光标定位在文件或查询缓冲区的指定行上。请注意,如果给出了一个全数字参数,psql假定它是一个行号,而不是文件名。
有关如何配置和自定义编辑器的信息,请参阅下面的环境。
\echo text
[ ... ]
#将评估的参数打印到标准输出,以空格分隔,后跟换行符。这对于在脚本输出中插入信息很有用。例如
=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999
如果第一个参数是未加引号的-n
,则不写入尾随换行符(也不写入第一个参数)。
如果您使用\o
命令重定向查询输出,您可能希望使用\qecho
而不是此命令。另请参见\warn
。
\ef [ function_description
[ line_number
] ]
#此命令以CREATE OR REPLACE FUNCTION
或CREATE OR REPLACE PROCEDURE
命令的形式获取并编辑命名函数的定义。编辑方式与\edit
相同。如果您在不保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,如果您为其添加了分号,则更新的命令会立即执行。否则它会重新显示;键入分号或\g
发送它,或\r
取消。
目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)
。如果存在多个同名函数,则必须给出参数类型。
如果未指定函数,则会显示一个空白的CREATE FUNCTION
模板供编辑。
如果指定了行号,psql将把光标定位在函数体的指定行上。(请注意,函数体通常不是从文件的第一行开始。)
与大多数其他元命令不同,行的其余部分始终被视为\ef
的参数,并且在参数中不执行变量插值或反引号扩展。
有关如何配置和自定义编辑器的信息,请参阅下面的环境。
\encoding [ encoding
]
#设置客户端字符集编码。如果没有参数,此命令会显示当前编码。
\errverbose
#以最大详细程度重复最近的服务器错误消息,就像VERBOSITY
设置为verbose
且SHOW_CONTEXT
设置为always
一样。
\ev [ view_name
[ line_number
] ]
#此命令以CREATE OR REPLACE VIEW
命令的形式获取并编辑命名视图的定义。编辑方式与\edit
相同。如果您在不保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,如果您为其添加了分号,则更新的命令会立即执行。否则它会重新显示;键入分号或\g
发送它,或\r
取消。
如果未指定视图,则会显示一个空白的CREATE VIEW
模板供编辑。
如果指定了行号,psql将把光标定位在视图定义的指定行上。
与大多数其他元命令不同,行的其余部分始终被视为\ev
的参数,并且在参数中不执行变量插值或反引号扩展。
\f [ string
]
#设置未对齐查询输出的字段分隔符。默认值为竖线(|
)。它等效于\pset fieldsep
。
\g [ (option
=value
[...]) ] [ filename
]
\g [ (option
=value
[...]) ] [ |command
]
#将当前查询缓冲区发送到服务器执行。
如果在\g
之后出现括号,它们会围绕一个以空格分隔的option
=
value
格式化选项子句列表,这些子句的解释方式与\pset
option
value
命令相同,但仅在此查询期间生效。在此列表中,等号=
周围不允许有空格,但选项子句之间必须有空格。如果省略=
value
,则命名option
的更改方式与\pset
option
没有明确value
时相同。
如果给出了filename
或|
command
参数,则查询的输出将写入指定文件或通过管道传输到给定shell命令,而不是像往常一样显示。只有当查询成功返回零个或多个元组时才写入文件或命令,如果查询失败或是非数据返回的SQL命令则不写入。
如果当前查询缓冲区为空,则重新执行最近发送的查询。除了此行为外,不带任何参数的\g
本质上等同于一个分号。带参数的\g
提供了\o
命令的“一次性”替代方案,并且还允许对通常由\pset
设置的输出格式选项进行一次性调整。
当最后一个参数以|
开头时,行的其余部分都被视为要执行的command
,并且不执行变量插值或反引号扩展。行的其余部分只是字面上地传递给shell。
\gdesc
#显示当前查询缓冲区的查询结果的描述(即列名和数据类型)。查询实际上并未执行;但是,如果其中包含某种语法错误,该错误将以正常方式报告。
如果当前查询缓冲区为空,则会转而描述最近发送的查询。
\getenv psql_var
env_var
#获取环境变量 env_var
的值并将其赋给 psql 变量 psql_var
。如果 env_var
在 psql 进程的环境中未定义,则 psql_var
不会更改。示例
=>\getenv home HOME
=>\echo :home
/home/postgres
\gexec
#将当前查询缓冲区发送到服务器,然后将查询输出(如果有)的每一行的每一列视为要执行的 SQL 语句。例如,要在 my_table
的每一列上创建一个索引
=>SELECT format('create index on my_table(%I)', attname)
->FROM pg_attribute
->WHERE attrelid = 'my_table'::regclass AND attnum > 0
->ORDER BY attnum
->\gexec
CREATE INDEX CREATE INDEX CREATE INDEX CREATE INDEX
生成的查询按行返回的顺序执行,如果有多列,则在每行中从左到右执行。NULL 字段将被忽略。生成的查询将按字面意思发送到服务器进行处理,因此它们不能是 psql 元命令,也不能包含 psql 变量引用。如果任何单个查询失败,除非设置了 ON_ERROR_STOP
,否则其余查询的执行将继续。每个查询的执行都受 ECHO
处理的约束。(在使用 \gexec
时,通常建议将 ECHO
设置为 all
或 queries
。)查询日志记录、单步模式、计时和其他查询执行功能也适用于每个生成的查询。
如果当前查询缓冲区为空,则会重新执行最近发送的查询。
\gset [ prefix
]
#将当前查询缓冲区发送到服务器,并将查询的输出存储到 psql 变量中(参见下面的 变量)。要执行的查询必须恰好返回一行。行的每一列都存储在一个单独的变量中,变量名与列名相同。例如
=>SELECT 'hello' AS var1, 10 AS var2
->\gset
=>\echo :var1 :var2
hello 10
如果指定 prefix
,则该字符串会添加到查询的列名前面,以创建要使用的变量名
=>SELECT 'hello' AS var1, 10 AS var2
->\gset result_
=>\echo :result_var1 :result_var2
hello 10
如果列结果为 NULL,则相应的变量将被取消设置,而不是被设置。
如果查询失败或未返回一行,则不会更改任何变量。
如果当前查询缓冲区为空,则会重新执行最近发送的查询。
\gx [ (option
=value
[...]) ] [ filename
]
\gx [ (option
=value
[...]) ] [ |command
]
#\gx
等效于 \g
,不同之处在于它强制对该查询使用扩展输出模式,就像 expanded=on
包含在 \pset
选项列表中一样。另请参见 \x
。
\h
或 \help
[ command
]
#提供有关指定SQL命令的语法帮助。如果未指定 command
,则 psql 将列出所有可用的语法帮助命令。如果 command
是星号 (*
),则显示所有SQL命令的语法帮助。
与大多数其他元命令不同,行的其余部分始终被视为 \help
的参数,并且在参数中不执行变量插值或反引号扩展。
为了简化输入,由多个单词组成的命令无需加引号。因此,输入 \help alter table
是可以的。
\H
或 \html
#打开HTML查询输出格式。如果HTML格式已打开,则会切换回默认的对齐文本格式。此命令用于兼容性和便利性,但有关设置其他输出选项的信息,请参见 \pset
。
\i
或 \include
filename
#从文件 filename
读取输入并执行它,就像它是在键盘上输入的一样。
如果 filename
是 -
(连字符),则会读取标准输入,直到遇到 EOF 指示或 \q
元命令。这可用于将交互式输入与文件输入交错。请注意,只有当 Readline 在最外层处于活动状态时,才会使用 Readline 行为。
如果您想在读取时在屏幕上看到这些行,则必须将变量 ECHO
设置为 all
。
\if
expression
\elif
expression
\else
\endif
#这组命令实现了可嵌套的条件块。条件块必须以 \if
开头,以 \endif
结尾。之间可以有任意数量的 \elif
子句,后面可以可选地跟一个 \else
子句。普通查询和其他类型的反斜杠命令可以(并且通常会)出现在构成条件块的命令之间。
\if
和 \elif
命令读取其参数并将其评估为布尔表达式。如果表达式产生 true
,则处理正常继续;否则,跳过行直到达到匹配的 \elif
、\else
或 \endif
。一旦 \if
或 \elif
测试成功,同一块中后续 \elif
命令的参数将不进行评估,并被视为 false。只有在没有先前的匹配 \if
或 \elif
成功的情况下,才处理 \else
后面的行。
\if
或 \elif
命令的 expression
参数像任何其他反斜杠命令参数一样,受变量插值和反引号扩展的影响。之后,它像开/关选项变量的值一样进行评估。因此,有效值是以下任意一个的明确不区分大小写匹配:true
、false
、1
、0
、on
、off
、yes
、no
。例如,t
、T
和 tR
都将被视为 true
。
不能正确评估为 true 或 false 的表达式将生成警告并被视为 false。
被跳过的行会正常解析以识别查询和反斜杠命令,但查询不会发送到服务器,并且条件(\if
、\elif
、\else
、\endif
)以外的反斜杠命令将被忽略。条件命令仅检查有效嵌套。跳过的行中的变量引用不会扩展,也不会执行反引号扩展。
给定条件块的所有反斜杠命令必须出现在同一源文件中。如果在所有本地 \if
块关闭之前,主输入文件或 \include
-ed 文件达到 EOF,则 psql 将引发错误。
以下是一个例子
-- check for the existence of two separate records in the database and store -- the results in separate psql variables SELECT EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer, EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee \gset \if :is_customer SELECT * FROM customer WHERE customer_id = 123; \elif :is_employee \echo 'is not a customer but is an employee' SELECT * FROM employee WHERE employee_id = 456; \else \if yes \echo 'not a customer or employee' \else \echo 'this will never print' \endif \endif
\ir
或 \include_relative
filename
#\ir
命令类似于 \i
,但以不同的方式解析相对文件名。在交互模式下执行时,这两个命令的行为相同。但是,从脚本调用时,\ir
将文件名解释为相对于脚本所在目录,而不是当前工作目录。
\l[x+]
或 \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 操作不同。此命令将发出 解析 (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
rows)value
,则命令会切换脚注显示的状态。
format
#将输出格式设置为 aligned
、asciidoc
、csv
、html
、latex
、latex-longtable
、troff-ms
、unaligned
或 wrapped
之一。允许使用唯一的缩写。
aligned
格式是标准的、人类可读的、格式精美的文本输出;这是默认设置。
unaligned
格式将一行的所有列写入一行,由当前活动的字段分隔符分隔。这对于创建可能旨在由其他程序读取的输出(例如,制表符分隔或逗号分隔格式)很有用。但是,如果字段分隔符字符出现在列的值中,则不会对其进行特殊处理;因此CSV格式可能更适合此类目的。
csv
格式 写入由逗号分隔的列值,应用 RFC 4180 中描述的引用规则。此输出与服务器 COPY
命令的 CSV 格式兼容。除非 tuples_only
参数为 on
,否则将生成带有列名的标题行。不打印标题和脚注。每行由系统相关的行尾字符终止,对于类 Unix 系统,通常是单个换行符 (\n
),对于 Microsoft Windows,则是回车符和换行符序列 (\r\n
)。除了逗号以外的字段分隔符可以通过 \pset csv_fieldsep
选择。
wrapped
格式类似于 aligned
,但会将宽数据值换行以使输出适合目标列宽。目标宽度按照 columns
选项中的描述确定。请注意,psql 不会尝试换行列标题;因此,如果列标题所需的总宽度超过目标,wrapped
格式的行为与 aligned
相同。
asciidoc
、html
、latex
、latex-longtable
和 troff-ms
格式输出的表格旨在包含在使用相应标记语言的文档中。它们不是完整的文档!这在HTML中可能不必要,但在 LaTeX 中,您必须有一个完整的文档包装器。latex
格式使用 LaTeX 的 tabular
环境。latex-longtable
格式需要 LaTeX 的 longtable
和 booktabs
软件包。
linestyle
#将边框线条绘制样式设置为 ascii
、old-ascii
或 unicode
之一。允许使用唯一的缩写。(这意味着一个字母就足够了。)默认设置为 ascii
。此选项仅影响 aligned
和 wrapped
输出格式。
ascii
样式使用普通ASCII字符。数据中的换行符在右侧边距中显示为 +
符号。当 wrapped
格式将数据从一行换到下一行而没有换行符时,第一个右侧边距中显示一个点 (.
),并且在下一行的左侧边距中再次显示一个点。
old-ascii
样式使用普通的ASCII字符,使用 PostgreSQL 8.4 及更早版本中使用的格式样式。数据中的换行符在左侧列分隔符处显示为 :
符号。当数据从一行换到下一行而没有换行符时,在左侧列分隔符处使用 ;
符号。
unicode
样式使用 Unicode 框线字符。数据中的换行符在右侧边距中显示为回车符。当数据从一行换到下一行而没有换行符时,第一个右侧边距中显示一个省略号符号,并且在下一行的左侧边距中再次显示一个省略号符号。
当 border
设置大于零时,linestyle
选项还决定绘制边框线的字符。普通的ASCII字符在任何地方都适用,但 Unicode 字符在识别它们的显示器上看起来更漂亮。
null
#设置用于打印空值的字符串。默认情况下不打印任何内容,这很容易与空字符串混淆。例如,人们可能更喜欢 \pset null '(null)'
。
numericlocale
#如果指定了 value
,它必须是 on
或 off
,这将启用或禁用显示特定于语言环境的字符以分隔小数点左侧的数字组。如果省略 value
,则命令在常规和特定于语言环境的数字输出之间切换。
pager
#控制查询和 psql 帮助输出的分页程序的使用。当 pager
选项为 off
时,不使用分页程序。当 pager
选项为 on
时,分页程序在适当时使用,即当输出到终端且无法在屏幕上显示时。 pager
选项也可以设置为 always
,这将导致分页程序用于所有终端输出,无论它是否适合屏幕。\pset pager
没有 value
会切换分页程序的使用状态。
如果设置了环境变量 PSQL_PAGER
或 PAGER
,则要分页的输出将通过管道传输到指定的程序。否则,使用平台相关的默认程序(例如 more
)。
在 Unix 系统上,当使用 \watch
命令重复执行查询时,环境变量 PSQL_WATCH_PAGER
用于查找分页程序。这是单独配置的,因为它可能会使传统的分页程序感到困惑,但可以用于将输出发送到理解 psql 输出格式的工具(例如 pspg --stream
)。
pager_min_lines
#如果 pager_min_lines
设置为大于页面高度的数字,则只有当有至少这么多行输出要显示时,才会调用分页程序。默认设置为 0。
recordsep
#指定在非对齐输出格式中使用的记录(行)分隔符。默认值是换行符。
recordsep_zero
#将非对齐输出格式中使用的记录分隔符设置为零字节。
tableattr
(或 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
或一个整数值
。
full
:扩展报头不被截断,并且与最宽的输出行一样宽。
column
:将报头行截断为第一列的宽度。
page
:将报头行截断为终端宽度。
整数值
:指定报头行的确切最大宽度。
这些不同格式的外观示例可以在下面的示例中看到。
\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 变量的名称和值。
有效的变量名可以包含字母、数字和下划线。有关详细信息,请参阅下面的变量。变量名区分大小写。
某些变量是特殊的,因为它们控制 psql 的行为或自动设置以反映连接状态。这些变量在下面的变量中进行了说明。
此命令与SQL命令 SET
无关。
\setenv name
[ value
]
#将环境变量 name
设置为 value
,如果未提供 value
,则取消设置环境变量。示例
testdb=>\setenv PAGER less
testdb=>\setenv LESS -imx4F
\sf[+] function_description
#此命令以 CREATE OR REPLACE FUNCTION
或 CREATE OR REPLACE PROCEDURE
命令的形式获取并显示命名函数或过程的定义。该定义将打印到由 \o
设置的当前查询输出通道。
目标函数可以仅通过名称指定,也可以通过名称和参数指定,例如foo(integer, text)
。如果存在多个同名函数,则必须给出参数类型。
如果命令名称后附加 +
,则输出行将编号,函数体第一行为第 1 行。
与大多数其他元命令不同,行的其余部分始终被视为 \sf
的参数,并且在参数中不执行变量插值或反引号扩展。
\sv[+] view_name
#此命令以 CREATE OR REPLACE VIEW
命令的形式获取并显示命名视图的定义。该定义将打印到由 \o
设置的当前查询输出通道。
如果命令名称后附加 +
,则输出行将从 1 开始编号。
与大多数其他元命令不同,行的其余部分始终被视为 \sv
的参数,并且在参数中不执行变量插值或反引号扩展。
\startpipeline
\sendpipeline
\syncpipeline
\endpipeline
\flushrequest
\flush
\getresults [ number_results
]
#这组命令实现了 SQL 语句的管道传输。管道必须以 \startpipeline
开始并以 \endpipeline
结束。在这之间可以有任意数量的 \syncpipeline
命令,它发送一个同步消息,而不会结束正在进行的管道并刷新发送缓冲区。在管道模式下,语句被发送到服务器,而不等待先前语句的结果。有关更多详细信息,请参阅第 32.5 节。
在管道进行期间执行的所有查询都使用扩展查询协议。当以分号结束时,查询将被附加到管道中。元命令 \bind
、\bind_named
、\close_prepared
或 \parse
可以在正在进行的管道中使用。当管道正在进行时,\sendpipeline
会将当前查询缓冲区附加到管道中。其他元命令,如 \g
、\gx
或 \gdesc
,在管道模式下不允许使用。
\flushrequest
将一个 flush 命令附加到管道中,允许使用 \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
命令被解释为将它们设置为其默认值。请参阅下面的变量。
\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;当子 shell 退出时,psql 恢复。带参数时,执行 shell 命令 command
。
与大多数其他元命令不同,行的其余部分始终被视为 \!
的参数,并且在参数中不执行变量插值或反引号扩展。行的其余部分只是字面量传递给 shell。
\? [ topic
]
#显示帮助信息。可选的 topic
参数(默认为 commands
)选择要解释的 psql 部分:commands
描述 psql 的反斜杠命令;options
描述可以传递给 psql 的命令行选项;variables
显示关于 psql 配置变量的帮助。
\;
#反斜杠分号不像前面的命令那样是元命令;相反,它只是导致一个分号被添加到查询缓冲区,而无需进一步处理。
通常,psql 会在到达命令结束分号后立即将 SQL 命令分派到服务器,即使当前行上还有更多输入。因此,例如输入
select 1; select 2; select 3;
将导致三个 SQL 命令单独发送到服务器,每个命令的结果在继续到下一个命令之前显示。但是,作为 \;
输入的分号不会触发命令处理,因此它前面的命令和它后面的命令有效地组合在一起,以一个请求发送到服务器。例如
select 1\; select 2\; select 3;
导致在到达非反斜杠分号时,将三个 SQL 命令在一个请求中发送到服务器。服务器将此类请求作为单个事务执行,除非字符串中包含显式的 BEGIN
/COMMIT
命令将其分成多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参阅第 54.2.2.1 节。)
各种 \d
命令接受 pattern
参数来指定要显示的对象名称。在最简单的情况下,模式只是对象的精确名称。模式中的字符通常会折叠为小写,就像 SQL 名称一样;例如,\dt FOO
将显示名为 foo
的表。与 SQL 名称一样,在模式周围加上双引号会阻止折叠为小写。如果您需要在模式中包含实际的双引号字符,请将其写为双引号序列中的一对双引号;这再次符合 SQL 引用标识符的规则。例如,\dt "FOO""BAR"
将显示名为 FOO"BAR
的表(不是 foo"bar
)。与 SQL 名称的通常规则不同,您可以在模式的某个部分周围加上双引号,例如 \dt FOO"FOO"BAR
将显示名为 fooFOObar
的表。
每当完全省略 pattern
参数时,\d
命令会显示当前模式搜索路径中所有可见的对象 — 这等效于将 *
用作模式。(如果一个对象所属的模式在搜索路径中,并且没有相同类型和名称的对象在搜索路径中较早出现,则该对象被称为可见。这等效于该对象可以通过名称引用而无需显式模式限定。)要查看数据库中所有对象,无论其可见性如何,请使用 *.*
作为模式。
在模式中,*
匹配任何字符序列(包括零个字符),?
匹配任何单个字符。(此表示法类似于 Unix shell 文件名模式。)例如,\dt int*
显示名称以 int
开头的表。但在双引号内,*
和 ?
失去这些特殊含义,只字面匹配。
包含点(.
)的关系模式被解释为模式名模式,后跟对象名模式。例如,\dt foo*.*bar*
显示所有表名中包含 bar
且模式名以 foo
开头的表。当没有点出现时,模式只匹配当前模式搜索路径中可见的对象。同样,双引号内的点失去其特殊含义并被字面匹配。包含两个点(.
)的关系模式被解释为数据库名,后跟模式名模式,再后跟对象名模式。数据库名部分不会被视为模式,并且必须与当前连接的数据库名匹配,否则将引发错误。
包含点(.
)的模式模式被解释为数据库名称后跟模式名称模式。例如,\dn mydb.*foo*
显示所有模式名称中包含 foo
的模式。数据库名称部分不会被视为模式,并且必须与当前连接的数据库的名称匹配,否则将引发错误。
高级用户可以使用正则表达式符号,例如 [0-9]
来匹配任何数字。所有正则表达式特殊字符都按照第 9.7.3 节中的规定工作,除了 .
被用作上述分隔符,*
被转换为正则表达式符号 .*
,?
被转换为 .
,以及 $
被字面匹配。您可以根据需要通过编写 ?
代替 .
,(
代替 R
+|)
,或 R
*(
代替 R
|)
来模拟这些模式字符。R
?$
不需要作为正则表达式字符,因为模式必须匹配整个名称,这与正则表达式的通常解释不同(换句话说,$
会自动附加到您的模式中)。如果您不希望模式被锚定,请在开头和/或结尾写入 *
。请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义并被字面匹配。此外,正则表达式特殊字符在运算符名称模式中(即,\do
的参数)中也被字面匹配。
psql 提供了类似于常见 Unix 命令 shell 的变量替换功能。变量只是名称/值对,其中值可以是任意长度的任意字符串。名称必须由字母(包括非拉丁字母)、数字和下划线组成。
要设置变量,请使用 psql 元命令 \set
。例如,
testdb=> \set foo bar
将变量 foo
设置为值 bar
。要检索变量的内容,请在名称前加上冒号,例如
testdb=> \echo :foo
bar
这在常规 SQL 命令和元命令中都有效;更多详细信息请参见下面的SQL 插值。
如果您调用不带第二个参数的 \set
,则变量被设置为空字符串值。要取消设置(即删除)变量,请使用命令 \unset
。要显示所有变量的值,请不带任何参数调用 \set
。
\set
的参数与其他命令一样受相同的替换规则约束。因此,您可以构造有趣的引用,例如 \set :foo 'something'
,并获得 Perl 或 PHP 中著名的“软链接”或“变量变量”。不幸的是(或者幸运的是?),没有办法用这些结构做任何有用的事情。另一方面,\set bar :foo
是复制变量的完全有效的方法。
psql 会特殊处理其中一些变量。它们代表可以通过更改变量的值在运行时更改的某些选项设置,或者在某些情况下代表 psql 的可变状态。根据约定,所有特殊处理的变量名都由大写 ASCII 字母(可能还有数字和下划线)组成。为确保未来最大兼容性,请避免将此类变量名用于您自己的目的。
控制 psql 行为的变量通常不能取消设置或设置为无效值。\unset
命令是允许的,但被解释为将变量设置为其默认值。不带第二个参数的 \set
命令被解释为将接受该值的控制变量设置为 on
,并拒绝其他变量。此外,接受 on
和 off
值的控制变量也将接受布尔值的其他常见拼写,例如 true
和 false
。
特殊处理的变量是
AUTOCOMMIT
#当设置为 on
(默认值)时,每个 SQL 命令在成功完成后自动提交。要在此模式下延迟提交,您必须输入 BEGIN
或 START TRANSACTION
SQL 命令。当设置为 off
或未设置时,SQL 命令在您显式发出 COMMIT
或 END
之前不会提交。自动提交关闭模式的工作方式是,在任何尚未处于事务块中且本身不是 BEGIN
或其他事务控制命令,也不是不能在事务块中执行的命令(例如 VACUUM
)的命令之前,隐式为您发出 BEGIN
。
在自动提交关闭模式下,您必须通过输入 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 的交互式会话发送一个文件结束字符(通常是 Control+D)将终止应用程序。如果设置为更大的数字值,则必须连续键入这么多文件结束字符才能终止交互式会话。如果变量设置为非数字值,则将其解释为 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 命令,处理将在当前命令处停止。
PIPELINE_COMMAND_COUNT
#正在进行的管道中排队的命令数量。
PIPELINE_RESULT_COUNT
#正在进行的管道中,后面跟着 \flushrequest
或 \syncpipeline
的命令数量,强制服务器发送结果。这些结果可以通过 \getresults
检索。
PIPELINE_SYNC_COUNT
#正在进行的管道中排队的同步消息数量。
PORT
#您当前连接到的数据库服务器端口。每次连接到数据库(包括程序启动)时都会设置此值,但可以更改或取消设置。
PROMPT1
PROMPT2
PROMPT3
#这些指定 psql 发出的提示符应该是什么样子。请参阅下面的提示符。
QUIET
#将此变量设置为 on
等同于命令行选项 -q
。在交互模式下可能不太有用。
ROW_COUNT
#上次 SQL 查询返回或影响的行数,如果查询失败或未报告行数,则为 0。
SERVER_VERSION_NAME
SERVER_VERSION_NUM
#服务器的版本号,以字符串形式,例如 9.6.2
、10.1
或 11beta1
,以及数字形式,例如 90602
或 100001
。每次连接到数据库(包括程序启动)时都会设置这些值,但可以更改或取消设置。
SERVICE
#服务名称,如果适用。
SHELL_ERROR
#如果上次 shell 命令失败,则为 true
;如果成功,则为 false
。这适用于通过 \!
、\g
、\o
、\w
和 \copy
元命令以及反引号 (`
) 扩展调用的 shell 命令。请注意,对于 \o
,此变量在下一个 \o
命令关闭输出管道时更新。另请参见 SHELL_EXIT_CODE
。
SHELL_EXIT_CODE
#上次 shell 命令返回的退出状态。0-127 表示程序退出代码,128-255 表示通过信号终止,-1 表示程序启动失败或无法收集其退出状态。这适用于通过 \!
、\g
、\o
、\w
和 \copy
元命令以及反引号 (`
) 扩展调用的 shell 命令。请注意,对于 \o
,此变量在下一个 \o
命令关闭输出管道时更新。另请参见 SHELL_ERROR
。
SHOW_ALL_RESULTS
#当此变量设置为 off
时,只显示组合查询 (\;
) 的最后一个结果,而不是所有结果。默认值为 on
。 off 行为是为了与旧版本的 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
,用于获取刚遇到的错误的详细版本。)
VERSION
VERSION_NAME
VERSION_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
包含空字节,这仍然无效。psql 不支持变量值中嵌入空字节。)
由于冒号可以在 SQL 命令中合法出现,因此除非已设置命名变量,否则不会替换明显的插值尝试(即 :name
、:'name'
或 :"name"
)。在任何情况下,您都可以用反斜杠转义冒号,以防止其被替换。
特殊语法 :{?
根据变量是否存在返回 TRUE 或 FALSE,因此总是被替换,除非冒号被反斜杠转义。name
}
变量的冒号语法是SQL嵌入式查询语言的标准语法,例如 ECPG。数组切片和类型转换的冒号语法是 PostgreSQL 扩展,有时可能与标准用法冲突。将变量值转义为 SQL 文字或标识符的冒号-引号语法是 psql 扩展。
psql 发出的提示符可以根据您的偏好进行自定义。三个变量 PROMPT1
、PROMPT2
和 PROMPT3
包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 请求新命令时发出的正常提示符。提示符 2 在命令输入期间预期有更多输入时发出,例如因为命令未以分号终止或引号未闭合。提示符 3 在您运行SQL COPY FROM STDIN
命令并且需要在终端上键入行值时发出。
所选提示变量的值按字面打印,除了遇到百分号 (%
) 的地方。根据下一个字符,会替换某些其他文本。定义的替换是:
%M
#数据库服务器的完整主机名(带域名),如果连接是通过 Unix 域套接字,则为 [local]
;如果 Unix 域套接字不在编译时默认位置,则为 [local:
。/dir/name
]
%m
#数据库服务器的主机名,在第一个点处截断,如果连接是通过 Unix 域套接字,则为 [local]
。
%>
#数据库服务器正在监听的端口号。
%n
#数据库会话用户名。(此值的扩展可能会在数据库会话期间因 SET SESSION AUTHORIZATION
命令而改变。)
%s
#服务名称。
%/
#当前数据库的名称。
%~
#类似于 %/
,但如果数据库是您的默认数据库,则输出为 ~
(波浪号)。
%#
#如果会话用户是数据库超级用户,则为 #
,否则为 >
。(此值的扩展可能会在数据库会话期间因 SET SESSION AUTHORIZATION
命令而改变。)
%p
#当前连接的后端进程 ID。
%P
#管道状态:不在管道中时为 off
,正在进行的管道中为 on
,或已中止的管道中为 abort
。
%R
#在提示符 1 中,通常为 =
,但如果会话处于条件块的非活动分支中,则为 @
;如果在单行模式下,则为 ^
;如果会话与数据库断开连接(如果 \connect
失败可能会发生),则为 !
。在提示符 2 中,%R
被一个字符替换,该字符取决于 psql 为什么需要更多输入:如果命令尚未终止,则为 -
;但如果存在未完成的 /* ... */
注释,则为单引号;如果存在未完成的带引号字符串,则为单引号;如果存在未完成的带引号标识符,则为双引号;如果存在未完成的美元引号字符串,则为美元符号;如果存在不匹配的左括号,则为 (
。在提示符 3 中,%R
不产生任何内容。
%x
#事务状态:如果不在事务块中则为空字符串,如果处于事务块中则为 *
,如果处于失败事务块中则为 !
,或者如果事务状态不确定(例如,因为没有连接)则为 ?
。
%l
#当前语句中的行号,从 1
开始。
%
digits
#替换为指示的八进制代码的字符。
%:
name
:
#psql 变量 name
的值。有关详细信息,请参阅上面的变量。
%`
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 如果可用,使用 Readline 或 libedit 库,方便地进行行编辑和检索。命令历史记录在 psql 退出时自动保存,并在 psql 启动时重新加载。按向上箭头或 Control-P 检索上一行。
您还可以使用 Tab 补全在许多(绝非所有)上下文中填写部分输入的关键字和 SQL 对象名称。例如,在命令开始时,键入 ins
并按 TAB 键将填写 insert into
。然后,键入表或模式名称的几个字符并按 TAB
键将填写未完成的名称,或者在有多个可能补全时提供一个菜单。(根据所使用的库,您可能需要多次按 TAB
键才能获得菜单。)
SQL 对象名称的 Tab 补全需要向服务器发送查询以查找可能的匹配项。在某些上下文中,这可能会干扰其他操作。例如,在 BEGIN
之后,如果在中间发出了 Tab 补全查询,则发出 SET TRANSACTION ISOLATION LEVEL
将为时已晚。如果您根本不希望进行 Tab 补全,可以通过在主目录中名为 .inputrc
的文件中添加以下内容来永久关闭它:
$if psql set disable-completion on $endif
(这不是 psql 功能,而是 Readline 功能。有关更多详细信息,请阅读其文档。)
-n
(--no-readline
) 命令行选项也可以用于在单次运行 psql 时禁用 Readline 的使用。这会阻止 Tab 补全、命令行历史记录的使用或记录以及多行命令的编辑。当您需要复制粘贴包含 TAB
字符的文本时,它特别有用。
COLUMNS
#如果 \pset columns
为零,则控制 wrapped
格式的宽度,以及确定宽输出是否需要分页器或在扩展自动模式下是否应切换到垂直格式的宽度。
PGDATABASE
PGHOST
PGPORT
PGUSER
#默认连接参数(参见第 32.15 节)。
PG_COLOR
#指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
PSQL_EDITOR
EDITOR
VISUAL
#\e
、\ef
和 \ev
命令使用的编辑器。这些变量按列出的顺序检查;使用第一个设置的变量。如果它们都没有设置,默认是在 Unix 系统上使用 vi
,在 Windows 系统上使用 notepad.exe
。
PSQL_EDITOR_LINENUMBER_ARG
#当 \e
、\ef
或 \ev
与行号参数一起使用时,此变量指定用于将起始行号传递给用户编辑器的命令行参数。对于像 Emacs 或 vi 这样的编辑器,这是一个加号。如果选项名称和行号之间需要空格,请在变量值中包含一个尾随空格。示例:
PSQL_EDITOR_LINENUMBER_ARG='+' PSQL_EDITOR_LINENUMBER_ARG='--line '
默认值在 Unix 系统上是 +
(对应于默认编辑器 vi
,并且对许多其他常用编辑器也很有用);但在 Windows 系统上没有默认值。
PSQL_HISTORY
#命令历史文件的备用位置。执行波浪号 (~
) 扩展。
PSQL_PAGER
PAGER
#如果查询结果不适合屏幕,则通过此命令进行管道传输。典型值为 more
或 less
。可以通过将 PSQL_PAGER
或 PAGER
设置为空字符串,或者通过调整 \pset
命令的分页器相关选项来禁用分页器的使用。这些变量按列出的顺序检查;使用第一个设置的变量。如果两者都没有设置,默认是在大多数平台上使用 more
,但在 Cygwin 上使用 less
。
PSQL_WATCH_PAGER
#当使用 \watch
命令重复执行查询时,默认不使用分页器。在 Unix 系统上,可以通过将 PSQL_WATCH_PAGER
设置为分页器命令来更改此行为。pspg
分页器(不属于 PostgreSQL,但在许多开源软件发行版中可用)如果使用选项 --stream
启动,可以显示 \watch
的输出。
PSQLRC
#用户 .psqlrc
文件的备用位置。执行波浪号 (~
) 扩展。
SHELL
#由 \!
命令执行的命令。
TMPDIR
#存储临时文件的目录。默认值为 /tmp
。
此实用程序以及大多数其他 PostgreSQL 实用程序也使用 libpq 支持的环境变量(请参阅 第 32.15 节)。
psqlrc
和 ~/.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.0
。最具体的版本匹配文件将优先于非版本特定文件读取。这些版本后缀在确定文件路径(如上所述)之后添加。
.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
Table "public.my_table"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
first | integer | | not null | 0
second | text | | |
现在我们将提示符改为更有趣的东西:
testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>
假设您已经用数据填充了表格并想查看它:
peter@localhost testdb=> SELECT * FROM my_table; first | second -------+-------- 1 | one 2 | two 3 | three 4 | four (4 rows)
您可以使用 \pset
命令以不同的方式显示表格
peter@localhost testdb=>\pset border 2
Border style is 2. peter@localhost testdb=>SELECT * FROM my_table;
+-------+--------+ | first | second | +-------+--------+ | 1 | one | | 2 | two | | 3 | three | | 4 | four | +-------+--------+ (4 rows) peter@localhost testdb=>\pset border 0
Border style is 0. peter@localhost testdb=>SELECT * FROM my_table;
first second ----- ------ 1 one 2 two 3 three 4 four (4 rows) peter@localhost testdb=>\pset border 1
Border style is 1. peter@localhost testdb=>\pset format csv
Output format is csv. peter@localhost testdb=>\pset tuples_only
Tuples only is on. peter@localhost testdb=>SELECT second, first FROM my_table;
one,1 two,2 three,3 four,4 peter@localhost testdb=>\pset format unaligned
Output format is unaligned. peter@localhost testdb=>\pset fieldsep '\t'
Field separator is " ". peter@localhost testdb=>SELECT second, first FROM my_table;
one 1 two 2 three 3 four 4
或者,使用短命令:
peter@localhost testdb=>\a \t \x
Output format is aligned. Tuples only is off. Expanded display is on. peter@localhost testdb=>SELECT * FROM my_table;
-[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
此外,这些输出格式选项可以使用 \g
为单个查询设置
peter@localhost testdb=>SELECT * FROM my_table
peter@localhost testdb->\g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
下面是一个使用 \df
命令查找仅名称匹配 int*pl
且第二个参数类型为 bigint
的函数的示例:
testdb=> \df int*pl * bigint
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
pg_catalog | int28pl | bigint | smallint, bigint | func
pg_catalog | int48pl | bigint | integer, bigint | func
pg_catalog | int8pl | bigint | bigint, bigint | func
(3 rows)
这里,+
选项用于显示其中一个函数的附加信息,x
用于以扩展模式显示结果
testdb=> \df+x int*pl integer bigint
List of functions
-[ RECORD 1 ]-------+-----------------------------
Schema | pg_catalog
Name | int48pl
Result data type | bigint
Argument data types | integer, bigint
Type | func
Volatility | immutable
Parallel | safe
Owner | postgres
Security | invoker
Leakproof? | no
Access privileges |
Language | internal
Internal name | int48pl
Description | implementation of + operator
如果合适,查询结果可以用 \crosstabview
命令以交叉表表示形式显示
testdb=>SELECT first, second, first > 2 AS gt2 FROM my_table;
first | second | gt2 -------+--------+----- 1 | one | f 2 | two | f 3 | three | t 4 | four | t (4 rows) testdb=>\crosstabview first second
first | one | two | three | four -------+-----+-----+-------+------ 1 | f | | | 2 | | f | | 3 | | | t | 4 | | | | t (4 rows)
这第二个示例展示了一个乘法表,其中行按反向数字顺序排序,列按独立的升序数字顺序排序。
testdb=>SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
testdb->row_number() over(order by t2.first) AS ord
testdb->FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb->\crosstabview "A" "B" "AxB" ord
A | 101 | 102 | 103 | 104 ---+-----+-----+-----+----- 4 | 404 | 408 | 412 | 416 3 | 303 | 306 | 309 | 312 2 | 202 | 204 | 206 | 208 1 | 101 | 102 | 103 | 104 (4 rows)
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。