Postgresql 中文操作指南

psql

psql — PostgreSQL 交互式终端

Synopsis

psql [ option …​] [ dbname [ username ]]

Description

psql 是用于 PostgreSQL 的基于终端的前端。它使你能够以交互方式输入查询,将它们提供给 PostgreSQL,并查看查询结果。此外,输入可以从文件或从命令行参数中获取。此外,psql 还提供许多元命令和各种类似于外壳的功能,以促进编写脚本和自动化各种任务。

Options

  • -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;'
  • or

echo '\x \\ SELECT * FROM foo;' | psql
  • ( \\ 是分隔符元命令。)

  • 传递给 -c 的每个 SQL 命令字符串作为单个请求发送到服务器。因此,即使字符串包含多个 SQL 命令,服务器也会将它作为单个事务执行,但除非字符串中包含用于将它分割成多个事务的显式 BEGIN / COMMIT 命令。(有关服务器如何处理多查询字符串的更多详情,请参阅 Section 55.2.2.1 。)

  • 如果不希望在一个事务中执行多个命令,请使用重复的 -c 命令或将多个命令馈送到 psql 的标准输入中,这可以通过使用回显(如上面说明所示)或通过外壳文档,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF
  • —​csv #

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

  • -d _dbname—​dbname=_dbname #

    • 指定所要连接的数据库的名称。相当于在命令行中将 dbname 指定为第一个非选项参数。 dbname 可以是 connection string 。如果是这样,连接字符串参数将覆盖任何有冲突的命令行选项。

  • -e_—​echo-queries_ #

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

  • -E_—​echo-hidden_ #

    • 回显由 \d 和其他反斜线命令生成的实际查询。您可以使用此功能来研究 psl 的内部操作。这等同于将变量 ECHO_HIDDEN 设置为 on

  • -f _filename—​file=_filename #

    • 从文件 filename 中读取命令,而不是标准输入。此选项可以重复,并可以与 -c 选项按任意顺序组合。当指定 -c-f 时,psql 不会从标准输入读取命令;而是按顺序处理完所有 -c-f 选项后终止。除了这一点,此选项很大程度上等同于元命令 \i

    • 如果 filename- (连字符),则直到遇到 EOF 指示或 \q 元命令为止读取标准输入。这可以用于插入交互式输入到来自文件中的输入。但请注意,在这种情况下未使用 Readline(就像指定了 -n 一样)。

    • 使用此选项和编写 psql &lt; _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_ #

  • -o _filename—​output=_filename #

    • 将所有查询输出放进文件 filename 中。这与命令 \o 等效。

  • -p _port—​port=_port #

    • 指定 TCP 端口或服务器正在监听连接的本地 Unix-domain 套接字文件扩展名。默认为 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 命令,就像分号一样。

  • -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 命令。这可确保所有命令都成功完成,或不应用任何更改。

    • 如果命令本身包含 BEGINCOMMITROLLBACK ,则此选项不会产生预期效果。此外,如果无法在事务块中执行单个命令,则指定此选项会导致整个事务失败。

  • -?—​help[=topic_]_ #

    • 显示关于 psql 的帮助并退出。可选的 topic 参数(默认为 options )选择解释 psql 的哪一部分: commands 描述 psql 的反斜杠命令; options 描述可以传递给 psql 的命令行选项; variables 显示关于 psql 配置变量的帮助。

Note

此模式是为那些坚持使用它的人提供的,但并不一定鼓励你使用它。特别是,如果你将 SQL 和元命令混合在一行上,那么执行顺序对于没有经验的用户可能并不总是很清楚。

Exit Status

如果 psql 正常完成,则返回 0 给 shell,如果发生其自身的致命错误(例如,内存不足、找不到文件),则返回 1,如果与服务器的连接出问题且会话不是交互式的,则返回 2,如果脚本中发生错误且变量 ON_ERROR_STOP 已设置,则返回 3。

Usage

Connecting to a Database

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

当默认值不太正确时,你可以通过将环境变量 PGDATABASEPGHOSTPGPORT 和/或 PGUSER 设置为适当的值来节省一些输入。 (有关附加的环境变量,请参见 Section 34.15 。)拥有一个 ~/.pgpass 文件也很方便,以避免经常输入密码。有关详细信息,请参见 Section 34.16

指定连接参数的另一种方法是在 conninfo 字符串或 URI 中,它用于代替数据库名称。此机制使你可以广泛控制连接。例如:

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

这样,你还可以使用 LDAP 进行连接参数查找,如 Section 34.18 中所述。有关所有可用连接选项的详细信息,请参见 Section 34.1.2

如果由于任何原因无法进行连接(例如,权限不足、服务器未在目标主机上运行等),则 psql 将返回错误并终止。

如果标准输入和标准输出都是终端,则 psql 将客户端编码设置为“auto”,它将从区域设置(Unix 系统上的 LC_CTYPE 环境变量)中检测适当的客户端编码。如果这不起作用,可以使用环境变量 PGCLIENTENCODING 覆盖客户端编码。

Entering SQL Commands

在正常操作中,psql 提供一个提示,其中显示当前 psql 连接到的数据库的名称,后跟字符串 。例如:

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

testdb=>

在提示符下,用户可以输入 SQL 命令。通常,当达到命令终止分号时,输入行会发送到服务器。行尾不会终止命令。因此,可以将命令跨越多行以提高清晰度。如果命令已发送并执行且没有错误,则命令的结果将显示在屏幕上。

如果不受信任的用户有权访问尚未采用 secure schema usage pattern 的数据库,请从 search_path 中删除公有可写模式来开始你的会话。可以在连接字符串中添加 options=-csearch_path= ,或在其他 SQL 命令之前发出 SELECT pg_catalog.set_config('search_path', '', false) 。此注意事项不适用于 psql;它适用于执行任意 SQL 命令的每个接口。

每当执行命令时,psql 还会轮询由 LISTENNOTIFY 生成的异步通知事件。

虽然 C 风格的块注释会传递给服务器进行处理和删除,但 psql 会删除 SQL 标准注释。

Meta-Commands

你在 psql 中输入的任何以未加引号的反斜杠开头的都是 psql 元命令,由 psql 自身处理。这些命令使 psql 在管理或脚本中更有用。元命令通常称为斜杠或反斜杠命令。

psql 命令的格式反斜杠,紧跟命令谓词,然后任何参数。参数由任意数量的空白字符与命令谓词和彼此分隔。

若要将空格放入参数中,您可以用单引号引用它。若要在参数中放入单引号,请在单引号引用的文本中写两个单引号。此外,包含在单引号中的任何内容还可以遵循类似 C 的替换方式,即 \n (换行符)、 \t (制表符)、 \b (退格键)、 \r (回车符)、 \f (换页符)、 digits (八进制)和 \xdigits (十六进制)。单引号引用的文本中任何其他字符前若有反斜杠前缀,则表示引用该单个字符,无论该字符为何。

如果一个未加引号的冒号 ( : ) 后跟一个 psql 变量名出现在参数中,则它将被改成变量的值,如以下 SQL Interpolation 所述。这里描述的 :'_variable_name '_ 和 :"_variable_name "_ 表单也适用。 :{?_variable_name }_ 语法允许测试变量是否已定义。它将被替换为 TRUE 或 FALSE。使用反斜杠转义冒号可保护它不被替换。

在参数中,括在反引号 ( ` ) 中的文本被视为传至 shell 的命令行。命令的输出(已删除任何尾随换行符)将替换反引号引用的文本。反引号引用的文本中不会执行任何特殊引用或其他处理,除了 :_variable_name_ 出现时(其中 variable_name 是 psql 变量名),它将被替换为变量的值。此外, :'_variable_name '_ 出现的次数将被替换为已适当地引用以成为单个 shell 命令参数的变量值。(后者形式几乎总是可取的,除非您非常确定变量中是什么。)由于在所有平台上都无法安全地引用回车符和换行符,因此当这些字符出现在值中时, :'_variable_name '_ 表单将打印一条错误消息,并且不会替换变量值。

某些命令将 SQL 标识符(例如表名)作为参数。这些参数遵循 SQL 的语法规则:未加引号的字母强制转换为小写,而双引号 ( " ) 保护字母不进行大小写转换,并允许将空格合并到标识符中。在双引号中,成对的双引号在结果名称中简化为单个双引号。例如, FOO"BAR"BAZ 被解释为 fooBARbaz ,而 "A weird"" name" 变成 A weird" name

对参数的解析在行尾或发现另一个未加引号的反斜杠时停止。未加引号的反斜杠被视为一条新元命令的开头。特殊序列 \\ (两个反斜杠)标记着参数的结尾,并且在有的话会继续解析 SQL 命令。通过这种方式,SQL 和 psql 命令可以在一行中自由混合。但在任何情况下,元命令的参数都不能延续到行尾之后。

很多元命令都作用于 current query buffer 。它仅仅是一个缓冲区,存放已键入但尚未发送到服务器执行的任何 SQL 命令文本。这将包括之前的输入行以及元命令所在行中出现的任何文本。

定义了以下元命令:

  • \a #

    • 如果当前表输出格式未对齐,则将其切换为已对齐。如果它未未对齐,则将其设置为未对齐。保留此命令是为了向后兼容。有关更通用的解决方案,请参见 \pset

  • \bind [ parameter ] …​ #

    • 设置针对下次查询执行的查询参数,为任何参数占位符( $1 等)传递指定的参数。

    • Example:

INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g
  • 它也适用于除 \g 之外的查询执行命令,例如 \gx\gset

  • 此命令将导致使用扩展查询协议(请参见 Section 55.1.2 ),这与使用简单查询协议的普通 psql 操作不同。因此,此命令可用于从 psql 测试扩展查询协议。(即使查询没有参数,此命令指定了零个参数,也会使用扩展查询协议。)此命令只影响执行的下一个查询;所有后续查询都将默认使用简单查询协议。

    • \c\connect [ -reuse-previous=_on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ]_ #

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

  • dbnameusernamehostport 中的任何一个指定为 - 等效于省略该参数。

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

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

  • Examples:

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

    • 设置任何表显示为查询结果的标题,或取消此类任何标题。此命令等于 \pset title _title_ 。(此命令的名称源于“标题”,因为它之前仅用于设置 HTML 表中的标题。)

  • \cd [ _directory ]_ #

    • 将当前的工作目录更改为 directory 。无参数时,更改为当前用户的 home 目录。

  • \conninfo #

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

  • \copy { _table [ ( column_list ) ] } from { 'filename' | 程序 'command' | stdin | pstdin } [ [ 使用 ] ( option [, …​] ) ] \copy { _table [ ( column_list ) ] | ( query ) } to { 'filename' | 程序 'command' | stdout | pstdout } [ [ 使用 ] ( option_ [, …​] ) ]_ #

    • 执行前端(客户端)复制。运行 SQL COPY 命令的操作,但不同于服务器读取或写入指定文件,psql 读取或写入该文件,并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和特权属于本地用户,而不是服务器,并且不需要 SQL 超用户特权。

    • 当指定 program 时, command 由 psql 执行,并从或写入 command 传递的数据在服务器和客户端之间路由。同样,执行特权属于本地用户,而不是服务器,并且不需要 SQL 超用户特权。

    • 对于 \copy &#8230;&#8203; from stdin ,数据行从发出命令的同一来源读取,一直持续到读取 \. 或流到达 EOF。该选项对于在 SQL 脚本文件中内联填充表格非常有用。对于 \copy &#8230;&#8203; to stdout ,输出发送到与 psql 命令输出相同的位置,并且不会打印 COPY _count_ 命令状态(因为它可能与数据行混淆)。要读取/写入 psql 的标准输入或输出,而不考虑当前的命令源或 \o 选项,请写入 from pstdinto pstdout

    • 此命令的语法与 SQL COPY 命令的语法相似。除了数据源/目标之外,所有其他选项均如 COPY 所指定。因此,特殊解析规则适用于 \copy 元命令。与大多数其他元命令不同,该行中的其余部分始终被当作 \copy 的参数,并且在参数中既不执行变量插值也不执行反引号扩展。

  • \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 的每个不同值 xcolV 的每个不同值 y ,位于交点 (x,y) 的单元格包含查询结果行中 colD 列的值,其中 colH 的值为 xcolV 的值为 y 。如果不存在这样的行,则该单元格为空。如果有多个这样的行,则会报告一个错误。

  • \d[S+] [ _pattern ]_ #

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

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

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

    • 默认情况下,仅显示用户创建的对象;提供某个图案或 ` S ` 修饰符以包含系统对象。

  • \da[S] [ _pattern ]_ #

    • 列出聚合函数,并列出其返回类型与它们所操作的数据类型。如果指定 ` pattern `, 则仅显示名称与图案匹配的聚合。默认情况下,仅显示用户创建的对象;提供某个图案或 ` S ` 修饰符以包含系统对象。

  • \dA[+] [ _pattern ]_ #

    • 列出访问方法。如果指定 ` pattern `, 则仅显示名称与图案匹配的访问方法。如果在命令名称后面追加 ` + `, 则每个访问方法都与它的关联处理函数和说明一起列出。

  • \dAc[+] [_access-method-pattern [input-type-pattern]]_ #

    • 列出运算符类(参见 ` Section 38.16.1 `)。如果指定 ` access-method-pattern `, 则仅列出与名称匹配该图案的访问方法关联的运算符类。如果指定 ` input-type-pattern `, 则仅列出与名称匹配该图案的输入类型关联的运算符类。如果在命令名称后面追加 ` + `, 则每个运算符类都与它的关联运算符族和所有者一起列出。

  • \dAf[+] [_access-method-pattern [input-type-pattern]]_ #

    • 列出运算符族(参见 ` Section 38.16.5 `)。如果指定 ` access-method-pattern `, 则仅列出与名称匹配该图案的访问方法关联的运算符族。如果指定 ` input-type-pattern `, 则仅列出与名称匹配该图案的输入类型关联的运算符族。如果在命令名称后面追加 ` + `, 则每个运算符族都与它的所有者一起列出。

  • \dAo[+] [_access-method-pattern [operator-family-pattern]]_ #

    • 列出与运算符族关联的运算符(参见 ` Section 38.16.2 `)。如果指定 ` access-method-pattern `, 则仅列出与名称匹配该图案的访问方法关联的运算符族的成员。如果指定 ` operator-family-pattern `, 则仅列出名称匹配该图案的运算符族的成员。如果在命令名称后面追加 ` + `, 则每个运算符都与它的排序运算符族(如果是排序运算符)一起列出。

  • \dAp[+] [_access-method-pattern [operator-family-pattern]]_ #

    • 列出与运算符族关联的支持函数(参见 ` Section 38.16.3 `)。如果指定 ` access-method-pattern `, 则仅列出与名称匹配该图案的访问方法关联的运算符族的函数。如果指定 ` operator-family-pattern `, 则仅列出名称匹配该图案的运算符族的函数。如果在命令名称后面追加 ` + `, 则函数连同它们的实际参数列表一起详细显示出来。

  • \db[+] [ _pattern ]_ #

    • 列出表空间。如果指定 ` pattern `, 则仅显示名称与图案匹配的表空间。如果在命令名称后面追加 ` + `, 则每个表空间都与它的关联选项、磁盘大小、权限和说明一起列出。

  • \dc[S+] [ _pattern ]_ #

    • 列出字符集编码之间的转换。如果指定 ` pattern `, 则仅列出名称与图案匹配的转换。默认情况下,仅显示用户创建的对象;提供某个图案或 ` S ` 修饰符以包含系统对象。如果在命令名称后面追加 ` + `, 则每个对象都连同其关联说明一起列出。

  • \dconfig[+] [ _pattern ]_ #

    • 列出服务器配置参数及其值。如果指定 ` pattern `, 则仅列出名称与图案匹配的参数。如果没有 ` pattern `, 则仅列出被设置为非默认值的那些参数。(使用 ` \dconfig * ` 查看所有参数。)如果在命令名称后面追加 ` + `, 则每个参数都与它的数据类型、参数可以被设置的上下文和访问特权(如果已授予非默认访问特权)一起列出。

  • \dC[+] [ _pattern ]_ #

    • 列出类型转换。如果指定 ` pattern `, 则仅列出源类型或目标类型与图案匹配的转换。如果在命令名称后面追加 ` + `, 则每个对象都连同其关联说明一起列出。

  • \dd[S] [ _pattern ]_ #

    • 显示类型为 ` constraint `, ` operator class `, ` operator family `, ` rule `, 和 ` trigger ` 的对象的说明。所有其他注释都可以通过这些对象类型的各个反斜杠命令来查看。

    • \dd 显示匹配 pattern 的对象或者适当类型的可见对象(如果未给出任何参数)的描述。但是在任何情况下,仅列出具有描述的对象。默认情况下,仅显示用户创建的对象;提供一个模式或 S 修改器以包含系统对象。

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

  • {s5}] ]_ #

    • 列出域。如果指定 pattern ,则只显示名称与模式匹配的域。默认情况下,仅显示用户创建的对象;提供一个模式或 S 修改器以包含系统对象。如果将 + 附加到命令名称,每个对象都及其关联的权限和描述一起列出。

  • \ddp [ _pattern ]_ #

    • 列出默认访问权限设置。为每个角色(如果适用,以及模式)显示一个条目,其中默认权限设置已从内置默认设置更改。如果指定 pattern ,则只列出角色名称或模式名称匹配该模式的条目。

    • ALTER DEFAULT PRIVILEGES 命令用于设置默认访问权限。权限显示的含义在 Section 5.7 中进行了解释。

  • \dE[S+] [ _pattern ] \di[S+] [ _pattern ] \dm[S+] [ _pattern ] \ds[S+] [ _pattern ] \dt[S+] [ _pattern ] \dv[S+] [ _pattern_ ]_ #

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

  • \des[+] [ _pattern ]_ #

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

  • \det[+] [ _pattern ]_ #

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

  • \deu[+] [ _pattern ]_ #

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

  • \dew[+] [ _pattern ]_ #

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

  • \df[anptwS+] [ _pattern [ arg_pattern …​ ] ]_ #

    • 列出函数及其返回数据类型、参数数据类型和函数类型,这些类型分为“agg”(聚合)、“normal”(普通)、“procedure”(程序)、“trigger”(触发器)或“window”(窗口)。要仅显示特定类型的函数,请将相应的字母 anptw 添加到命令中。如果指定 pattern ,则只显示名称与模式匹配的函数。任何附加参数都是类型名称模式,它们与函数的第一个、第二个等参数的类型名称匹配。(匹配的函数可以有比您指定更多的参数。为防止出现这种情况,请写一个短划线 - 作为最后一个 arg_pattern 。)默认情况下,仅显示用户创建的对象;提供一个模式或 S 修改器以包含系统对象。如果使用 \df+ 形式,还将显示每个函数的附加信息,包括可变性、并行安全性、所有者、安全分类、访问权限、语言、内部名称(仅适用于 C 和内部函数)和描述。可以使用 \sf 查看特定函数的源代码。

  • \dF[+] [ _pattern ]_ #

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

  • \dFd[+] [ _pattern ]_ #

    • 列出文本搜索字典。如果指定了 pattern ,只显示名称与该模式匹配的字典。如果使用了 \dFd+ 形式,将会显示每个选定字典的其他信息,包括底层文本搜索模板和选项值。

  • \dFp[+] [ _pattern ]_ #

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

  • \dFt[+] [ _pattern ]_ #

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

  • \dg[S+] [ _pattern ]_ #

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

  • \dl[+] #

    • 这是 \lo_list 的别名,它显示大对象列表。如果 + 附加到命令名称,每个大对象都会同其关联的权限(如果存在)一起列出。

  • \dL[S+] [ _pattern ]_ #

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

  • \dn[S+] [ _pattern ]_ #

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

  • \do[S+] [ _pattern [ arg_pattern [ arg_pattern ] ] ]_ #

    • 列出运算符及其操作数和结果类型。如果指定了 pattern ,只列出名称与该模式匹配的运算符。如果指定了一个 arg_pattern ,只列出其右操作数的类型名称与该模式匹配的前缀运算符。如果指定了两个 arg_pattern_s are specified, only binary operators whose argument type names match those patterns are listed. (Alternatively, write _- ,则用于一元运算符的未使用操作数。)默认情况下,只显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果 + 附加到命令名称,将会显示每个运算符的其他信息,目前只显示底层函数的名称。

  • \dO[S+] [ _pattern ]_ #

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

  • \dp[S] [ _pattern ]_ #

    • 列出带有关联访问权限的表、视图和序列。如果指定了 pattern ,则仅列出名称与该模式匹配的表、视图和序列。默认情况下,仅显示用户创建的对象;提供一个模式或 S 修饰符来包含系统对象。

    • GRANTREVOKE 命令用于设置访问权限。权限显示的含义在 Section 5.7 中进行了说明。

  • \dP[itn+] [ _pattern ]_ #

    • 列出分区关系。如果指定了 pattern ,则仅列出名称与该模式匹配的条目。修饰符 t (表明)和 i (索引)可以追加到该命令,以筛选要列出的关系的种类。默认情况下,列出的内容是分区表和索引。

    • 如果使用了修饰符 n (“嵌套”)或指定了一个模式,则会包含非根分区关系,并且会显示一栏内容,该内容显示每个分区关系的父级。

    • 如果将 + 追加到命令名称,则也会显示每个关系的分区的总大小,以及该关系的说明。如果将 n+ 结合使用,则会显示两个大小:一个包括直接附加的叶分区总大小,另一个显示所有分区的总大小,包括间接附加的子分区。

  • \drds [ _role-pattern [ database-pattern ] ]_ #

    • 列出已定义的配置设置。这些设置可以针对角色、数据库或两者进行设置。 role-patterndatabase-pattern 用于分别选择要列出的特定角色和数据库。如果省略这些内容,或者指定了 * ,则会列出所有设置,包括分别不针对角色或数据库的设置。

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

  • \drg[S] [ _pattern ]_ #

    • 列出有关每个已授予的角色成员资格的信息,包括已分配的选项 ( ADMININHERIT 和/或 SET ) 和授予者。有关角色成员资格的信息,请参阅 GRANT 命令。

    • 默认情况下,仅显示针对用户创建的角色授予的权限;提供 S 修饰符来包含系统角色。如果指定了 pattern ,则仅列出名称与该模式匹配的角色授予的权限。

  • \dRp[+] [ _pattern ]_ #

    • 列出复制发布。如果指定了 pattern ,则仅列出名称与该模式匹配的发布。如果将 + 追加到命令名称,则还会显示与每个发布关联的表和架构。

  • \dRs[+] [ _pattern ]_ #

    • 列出复制订阅。如果指定了 pattern ,则仅列出名称与该模式匹配的订阅。如果将 + 追加到命令名称,则还会显示订阅的其他属性。

  • \dT[S+] [ _pattern ]_ #

    • 列出数据类型。如果指定了 pattern ,则仅列出名称与该模式匹配的类型。如果将 + 追加到命令名称,则每个类型将随其内部名称和大小、(如果该类型是 enum 类型)其允许值以及其关联的权限一同列出。默认情况下,仅显示用户创建的对象;提供一个模式或 S 修饰符来包含系统对象。

  • \du[S+] [ _pattern ]_ #

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

  • \dx[+] [ _pattern ]_ #

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

  • \dX [ _pattern ]_ #

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

    • 每种类型的扩展统计信息的状态都在以其统计信息类型(例如 Ndistinct)命名的列中显示。 defined 表示在创建统计信息时请求了它,而NULL表示没有请求它。如果你想知道 ANALYZE 是否已运行并且计划程序可以使用统计信息,则可以使用 pg_stats_ext

  • \dy[+] [ _pattern ]_ #

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

  • \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 ,则不写入尾随换行符(第一个参数也不写入)。

    • \ef [ _function_description [ line_number ] ]_ #

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

  • 目标函数可以用单独名称或者名称和参数指定,例如 foo(integer, text) 。如果同名函数有多个,则必须给定参数类型。

  • 如果没有指定函数,则会显示一个空白的 CREATE FUNCTION 模板用于编辑。

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

  • 与大多数其他元命令不同,该行剩下的全部内容始终被视为 \ef 的参数,并且不会在参数中执行变量插值或反引号展开。

    • \encoding [ _encoding ]_ #

  • 设置客户端的字符集编码。不带参数时,该命令显示当前编码。

    • \errverbose #

  • 用最大详细程度重复最近的服务器错误消息,就像 VERBOSITY 设置为 verboseSHOW_CONTEXT 设置为 always 一样。

    • \ev [ _view_name [ line_number ] ]_ #

  • 此命令以 CREATE OR REPLACE VIEW 命令的形式提取并编辑命名视图的定义。编辑方式与 \edit 相同。如果您退出编辑器而不保存,则该语句将被丢弃。如果您保存并退出编辑器,则如果您添加了分号,更新的命令将立即执行。否则会重新显示它;键入分号或 \g 以发送它,或 \r 以取消。

  • 如果没有指定视图,则会显示一个空白的 CREATE VIEW 模板用于编辑。

  • 如果指定行号,psql 将在视图定义的指定行上放置游标。

  • 与大多数其他元命令不同,该行剩下的全部内容始终被视为 \ev 的参数,并且不会在参数中执行变量插值或反引号展开。

    • \f [ _string ]_ #

  • 设置未对齐查询输出的字段分隔符。默认值为竖线 ( | )。它等效于 \pset fieldsep

    • \g [ (_option = value […​]) ] \g [ (_option = value […​]) ] [ | command_ ]_ #

  • 将当前查询缓冲区发送到服务器执行。

  • 如果 \g 后出现括号,则它们包围一个以空格分隔的 option=value 格式选项子句列表,这些列表的解释方式与 \pset option value 命令相同,但只会对该查询有效。在此列表中, = 符号周围不允许有空格,但选项子句之间需要空格。如果省略了 =__value ,则命名的 option 的更改方式与没有显式 value\pset option 相同。

  • 如果给出了 filename|__command 参数,则查询的输出将写入到命名的文件或通过管道传输到给定的 shell 命令,而不是像往常一样显示它。仅当查询成功返回一个或多个元组时才写入文件或命令,而不是在查询失败或是非数据返回 SQL 命令时。

  • 如果当前查询缓冲区为空,则会重新执行最近发送的查询。除了该行为之外,没有任何参数的 \g 本质上等效于分号。对于参数, \g 提供了对 \o 命令的“一次性”替代方案,此外还允许对通常由 \pset 设置的输出格式选项进行一次性调整。

  • 当最后一个参数以 | 开始时,行的整个余量都将被当作要执行的 command ,且其中既不执行变量插值,也不执行反引号扩展。行的余量将简单地按原样传递给 shell。

    • \gdesc #

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

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

    • \getenv _psql_var env_var_ #

  • 获取环境变量 env_var 的值,并将其分配给 psql 变量 psql_var 。如果在 psql 进程的环境中未定义 env_var ,则 psql_var 不会被更改。例如:

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

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

=> SELECT format('create index on my_table(%I)', attname)
-> FROM pg_attribute
-> WHERE attrelid = 'my_table'::regclass AND attnum > 0
-> ORDER BY attnum
-> \gexec
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
  • 生成的查询将按照行返回的顺序执行,并在每行的从左到右执行(如果有多列)。将忽略 NULL 字段。生成的查询会被按原样发送至服务器进行处理,以便它们既不能成为 psql 元命令,也不能包含 psql 变量引用。如果任何单独查询失败,将继续执行剩余查询,除非设置了 ON_ERROR_STOP 。每个查询的执行都受 ECHO 处理的约束。(使用 \gexec 时,通常建议将 ECHO 设置为 allqueries 。)查询日志记录、单步模式、定时和其他查询执行功能也适用于每条生成的查询。

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

    • \gset [ _prefix ]_ #

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

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset
=> \echo :var1 :var2
hello 10
  • 如果你指定了一个 prefix ,则该字符串将被前置到查询的列名,以创建要使用的变量名:

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset result_
=> \echo :result_var1 :result_var2
hello 10
  • 如果某列结果为 NULL,则将取消设置相应的变量,而不是设置该变量。

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

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

    • \gx [ (_option = value […​]) ] \gx [ (_option = value […​]) ] [ | command_ ]_ #

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

    • \h\help [ _command ]_ #

  • 为指定的 SQL 命令提供语法帮助。如果未指定 command ,则 psql 会列出提供语法帮助的所有命令。如果 command 为星号 ( * ),则会显示所有 SQL 命令的语法帮助。

  • 与大多数其他元命令不同,行的整个余量总是被当作 \help 的参数,且既不执行变量插值,也不执行反引号扩展。

    • \H or \html #

  • 启用 HTML 查询输出格式。如果 HTML 格式已经启用,则会切换回默认对齐文本格式。此命令用于兼容性和便利性,但请参见 \pset 以了解如何设置其他输出选项。

    • \i\include filename #

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

  • 如果 filename- (连字符),则会读取标准输入,直至出现 EOF 标识或 \q 元命令。这可用于将交互式输入与文件输入穿插在一起。请注意,只有在最外层激活了 Readline 行为时,此行为才有效。

    • \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 参数受变量插值和反引号展开的影响,正如其他任何反斜杠命令参数一样。然后,它会像 on/off 选项变量的值一样进行评估。因此,有效值是不区分大小写的以下某一值的确切匹配项: truefalse10onoffyesno 。例如, tTtR 都将被视为 true

  • 未正确评估为 true 或 false 的表达式将生成一个警告并被视为 false。

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

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

  • Here is an example:

-- 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[]\list[] [ _pattern ]_ #

    • 列出服务器中的数据库,并显示其名称、所有者、字符集编码和访问权限。如果指定了 pattern ,则只列出名称与该模式匹配的数据库。如果在命令名称后面附加 + ,还将显示数据库大小、默认表空间和描述信息。(只有当前用户可以连接的数据库才提供大小信息。)

  • \lo_export _loid filename_ #

    • 从数据库中读取具有 OID loid 的大型对象,并将其写入 filename 。请注意,这与服务器函数 lo_export 有细微差别,后者由数据库服务器运行的用户以其权限在服务器文件系统上运行。

  • \lo_import _filename [ comment ]_ #

    • 将文件存储到 PostgreSQL 大型对象中。它还可以选择与对象关联给定的注释。示例:

foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
  • 响应表明大型对象接收到了对象 ID 152801,该 ID 可用于在将来访问新创建的大型对象。为了提高可读性,建议始终将可读的注释与每个对象关联起来。可以使用 \lo_list 命令查看 OID 和注释。

  • 请注意,此命令与服务器端 lo_import 有细微差别,因为它充当本地文件系统上的本地用户,而不是服务器的用户和文件系统。

    • \lo_list[+] #

  • 显示当前存储在数据库中的所有 PostgreSQL 大型对象的列表,以及为其提供的任何注释。如果在命令名称后面附加 + ,则每个大型对象都与其关联的权限(如果有)一起列出。

    • \lo_unlink _loid_ #

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

    • \o\out [role="_filename"]_ \o_ 或 \out [ |_command_ ]_ #

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

  • 如果参数以 | 开头,则将整个行的其余部分都作为 command 来执行,并且不会在其中执行变量内插或反引号扩展。行的其余部分将直接传给 shell。

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

    • \p or \print #

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

    • \password [ _username ]_ #

  • 更改指定用户(在默认情况下为当前用户)的密码。此命令提示输入新密码,对其进行加密,并作为 ALTER ROLE 命令将其发送到服务器。这确保命令历史、服务器日志或其他地方不会以明文显示新密码。

    • \prompt [ _text ] name_ #

  • 提示用户提供文本,将其分配给变量 name 。可以指定可选提示字符串 text 。(对于多词提示,使用单引号将文字括起来。)

  • 默认情况下, \prompt 使用终端进行输入和输出。但是,如果使用了 -f 命令行开关, \prompt 将使用标准输入和标准输出。

    • \pset [ _option [ value ] ]_ #

  • 此命令设置影响查询结果表输出的选项。 option 指示要设置的选项。 value 的语义因所选选项而异。对于某些选项,省略 value 将导致切换或取消设置该选项,如特定选项的下方所述。如果未提及此类行为,则省略 value 仅导致显示当前设置。

  • \pset 不带任何参数会显示所有打印选项的当前状态。

  • Adjustable printing options are:

  • 下面 Examples 中可以查看这些不同格式的示例外观。

    • \q or \quit #

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

    • \qecho _text [ …​ ]_ #

  • 此命令与 \echo 相同,不同之处在于输出将写入查询输出通道,由 \o 设置。

    • \r or \reset #

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

    • \s [ _filename ]_ #

  • 将 psql 的命令行历史记录打印到 filename 。如果 filename 被省略,则历史记录将被写入标准输出(使用分页符,如适用)。如果在没有 Readline 支持的情况下构建了 psql,则此命令不可用。

    • \set [ _name [ value [ …​ ] ] ]_ #

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

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

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

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

    • \setenv _name [ value ]_ #

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

testdb=> \setenv PAGER less
testdb=> \setenv LESS -imx4F
  • \sf[+] _function_description_ #

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

    • 目标函数可以用单独名称或者名称和参数指定,例如 foo(integer, text) 。如果同名函数有多个,则必须给定参数类型。

    • 如果将 + 附加到命令名称,则输出行将被编号,函数体的第一行为第 1 行。

    • 与大多数其他元命令不同,该行的整个其余部分始终被视为 \sf 的参数,并且变量插值和反引号展开不在参数中执行。

  • \sv[+] _view_name_ #

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

    • 如果将 + 附加到命令名称,则输出行将从 1 开始编号。

    • 与大多数其他元命令不同,该行的整个其余部分始终被视为 \sv 的参数,并且变量插值和反引号展开不在参数中执行。

  • \t #

    • 切换显示输出列名标题和行计数页脚。此命令相当于 \pset tuples_only ,并为方便起见提供。

  • \T _table_options_ #

    • 指定要放入 HTML 输出格式中 table 标记内的属性。此命令相当于 \pset tableattr _table_options_

  • \timing [ _on | off ]_ #

    • 使用参数,启用或禁用显示每条 SQL 语句执行时间的功能。如果没有参数,则在启用和禁用之间切换显示。显示以毫秒为单位;超过 1 秒的时间间隔也将以分钟:秒格式显示,并在需要时添加小时和天字段。

  • \unset _name_ #

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

    • 控制 psql 行为的大多数变量不能取消设置;而 \unset 命令解释为设置这些变量为其默认值。请参见下面的 Variables

  • \w\write filename\w_ or \write |_command #

    • 将当前查询缓冲区写入文件 filename 或将其管道到 shell 命令 command 。如果当前查询缓冲区为空,则会写入最近执行的查询。

    • 如果参数以 | 开头,则将整个行的其余部分都作为 command 来执行,并且不会在其中执行变量内插或反引号扩展。行的其余部分将直接传给 shell。

  • \warn _text [ …​ ]_ #

    • 此命令与 \echo 相同,但输出将写入 psql 的标准错误通道,而不是标准输出。

  • \watch [ i[nterval]=_seconds ] [ c[ount]= times ] [ seconds ]_ #

    • 重复执行当前查询缓冲区(如 \g 所做),直到中断或查询失败,或者达到执行计数限制(如果给出)。在执行之间等待指定秒数(默认 2)。向后兼容,可以随或不随 interval= 前缀指定 seconds 。每个查询结果都显示在包含 \pset title 字符串(如果任何)、查询开始时间和延迟时间间隔的页眉中。

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

  • \x [ _on | off | auto ]_ #

    • 设置或切换展开表格格式化模式。因此它等效于 \pset expanded

  • \z[S] [ _pattern ]_ #

    • 列出表、视图和序列及其关联的访问权限。如果指定 pattern ,则仅列出名称匹配模式的表、视图和序列。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。

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

  • \! [ _command ]_ #

    • 无参数时,转义到子 shell;当子 shell 退出时,psql 恢复。带参数时,执行 shell 命令 command

    • 与大多数其他元命令不同的是,该行始终的完整其余部分被认为是 \! 的参数,并且在参数中不执行变量插值或反引号扩展。该行的其余部分只是按字面意思传递给 shell。

  • \? [ _topic ]_ #

    • 显示帮助信息。可选的 topic 参数(默认 commands )选择对 psql 的哪一部分进行解释: commands 描述 psql 的反斜杠命令; options 描述可传递给 psql 的命令行选项; variables 显示有关 psql 配置变量的帮助。

  • \; #

    • 反斜杠分号不是像前面命令那样的元命令;它只是导致在不进一步处理的情况下向查询缓冲区添加分号。

    • 通常,psql 会在达到命令结束分号后立即将 SQL 命令调度到服务器,即使当前行上仍有更多输入。因此,例如,输入

select 1; select 2; select 3;
  • 使用三个 SQL 命令,它们被单独发送至服务器,在显示每个命令的结果之前继续执行下一个命令。然而,作为 \; 输入的冒号不触发命令处理,因此它前面的命令和后面的命令以有效的方式进行合并,并在一个请求中发送至服务器。因此,比如

select 1\; select 2\; select 3;
  • 当非反斜杠分号到达时,结果以一个请求的方式将三个 SQL 命令发送至服务器。服务器执行此类请求作为一个事务,除非字符串中包含用于将其分成多个事务的 BEGIN / COMMIT 显式命令。(有关服务器如何处理多查询字符串的详细信息,请参见 Section 55.2.2.1 。)

Tip

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

Tip

获得与 \copy …​ to 相同结果的另一种方式是使用 SQL COPY …​ TO STDOUT 命令并以 \g _filename or \g |_program. Unlike \copy 终止,该方法允许命令跨越多行;此外,可以使用变量插值和反引号扩展。

Tip

这些操作不如使用文件或程序数据源或目标的 SQL COPY 命令那样高效,因为所有数据都必须经过客户端/服务器连接。对于大量数据,SQL 命令可能是更好的选择。而且,由于这种传递方法,CSV 模式中的 \copy …​ from 会错误地将一行上单独的 \. 数据值视为输入结束标记。

Note

如果在没有 pattern 参数的情况下使用了 \d ,则它等同于 \dtvmsE ,后者将显示一个清单,其中包含所有可见的表格、视图、物化视图、序列和外部表格。这纯粹是一个便利措施。

Caution

\deu+ 也会显示远程用户的用户名和密码,因此应小心不予透露。

Tip

有关如何配置和自定义编辑器,请参见下面的 Environment

Tip

如果你使用 \o 命令重定向查询输出,则可能希望使用 \qecho 替代该命令。另请参见 \warn

Tip

有关如何配置和自定义编辑器,请参见下面的 Environment

Note

为了简化输入,由几个词组成的命令不需要用引号引起来。因此,输入 \help alter table 没有问题。

Note

如果你希望在读取时查看屏幕上的行,则必须将变量 ECHO 设置为 all

Tip

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

Tip

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

Tip

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

  • border #

    • value 必须是一个数字。通常,数字越大,表格具有的边框和行就越多,但具体细节取决于特定格式。在 HTML 格式中,此设置将直接转换为 border=&#8230;&#8203; 属性。在大多其他格式中,只有值 0(无边框)、1(内部分割线)和 2(表格框架)才有意义,而且高于2的值的处理方式与 border = 2 相同。此外, latexlatex-longtable 格式允许使用值3在数据行之间添加分割线。

  • columns #

    • wrapped 格式设置目标宽度,以及用于确定输出是否足够宽以需要分页或在扩展自动模式下切换到垂直显示的宽度限制。零(默认值)导致目标宽度受环境变量 COLUMNSCOLUMNS (如果未设置)下检测到的屏幕宽度控制。此外,如果 columns 为零,则 wrapped 格式仅影响屏幕输出。如果 columns 为非零,则文件和管道输出也会折行至该宽度。

  • csv_fieldsep #

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

  • expanded (or x) #

    • 如果指定了 value ,则它必须是 onoff (这将启用或禁用扩展模式),或 auto 。如果 value 被省略,该命令可在启用和禁用设置之间切换。在启用扩展模式时,查询结果以两列的形式显示,列名在左侧,数据在右侧。如果数据无法在标准“水平”模式下容纳在屏幕中,则此模式非常有用。在“自动”设置中,每当查询结果中有多个列且结果比屏幕宽时,都会使用扩展模式;否则,使用常规模式。“自动”设置仅在对齐的和折行的格式中有效。在其他格式中,它始终表现得如同扩展模式已关闭一般。

  • fieldsep #

    • 指定在未对齐的输出格式中要使用的字段分隔符。通过这种方式,可以创建比如制表符分隔的输出,其他程序可能更喜欢这种输出。若要将制表符设为字段分隔符,请键入 \pset fieldsep '\t' 。默认字段分隔符是 '|' (垂直线)。

  • fieldsep_zero #

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

  • footer #

    • 如果指定 value ,则它必须是 onoff ,这将启用或禁用表格页脚的显示( (_n 行)计数)。如果省略 value ,该命令将打开或关闭页脚显示。

  • format #

    • 将输出格式设置为 alignedasciidoccsvhtmllatexlatex-longtabletroff-msunalignedwrapped 中的一个。允许有唯一的缩写。

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

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

    • csv 格式用逗号分隔列值,应用 RFC 4180 中描述的引用规则。此输出与服务器 COPY 命令的 CSV 格式兼容。除非 tuples_only 参数为 on ,否则将生成带有列名的标题行。不打印标题和页脚。每一行都以系统相关的行尾字符终止,通常是类 Unix 系统的新行 ( \n ) 或 Microsoft Windows 的回车和新行序列 ( \r\n )。可以使用 \pset csv_fieldsep 选择逗号以外的字段分隔符字符。

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

    • asciidochtmllatexlatex-longtabletroff-ms 格式输出的表格旨在使用各自的标记语言包含在文档中。它们不是完整的文件!这在 HTML 中可能不是必需的,但在 LaTeX 中你必须有一个完整的文档包装器。 latex 格式使用 LaTeX 的 tabular 环境。 latex-longtable 格式需要 LaTeX longtablebooktabs 包。

  • linestyle #

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

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

    • old-ascii 样式使用纯 ASCII 字符,使用 PostgreSQL 8.4 及更早版本中使用的格式样式。数据中的换行使用 : 符号替换左边缘的列分隔符显示。当数据在没有换行字符的情况下从一行换行到下一行时,将使用 ; 符号替换左边缘的列分隔符。

    • unicode 样式使用 Unicode 框图字符。数据中的换行使用右边缘的回车符号显示。当数据在没有换行字符的情况下从一行换行到下一行时,第一行的右边缘会显示一个省略号符号,并在下一行的左边缘再次显示。

    • border 设置大于 0 时, linestyle 选项还确定用于绘制边框线的字符。纯 ASCII 字符可在任何地方使用,但 Unicode 字符在识别它们的显示器上看起来更美观。

  • null #

    • 设置要打印为 null 值的字符串。默认情况下什么都不打印,很容易与空字符串弄混。例如,人们可能更喜欢 \pset null '(null)'

  • numericlocale #

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

  • pager #

    • 控制查询和 psql 帮助输出的分页程序的使用。当 pager 选项为 off 时,不使用分页程序。当 pager 选项为 on 时,在适当的时候使用分页程序,即当输出到终端并且不适合屏幕时。 pager 选项也可以设置为 always ,这将导致对所有终端输出使用分页程序,无论它是否适合屏幕。没有 value\pset pager 切换分页程序的使用状态。

    • 如果设置了环境变量 PSQL_PAGERPAGER ,则要分页的输出将通过管道传输到指定的程序。否则,将使用与平台相关的默认程序(例如 more )。

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

  • pager_min_lines #

    • 如果 pager_min_lines 设置为大于页面高度的数字,那么在至少有这么多行要显示的输出时才调用分页程序。默认设置为 0。

  • recordsep #

    • 指定在未对齐的输出格式中要使用的记录(行)分隔符。默认值是新行字符。

  • recordsep_zero #

    • 将记录分隔符设置成在未对齐输出格式中使用一个零字节。

  • tableattr (or T) #

    • 在 HTML 格式中,这指定被放置在 table 标记内的属性。例如这可能是 cellpaddingbgcolor 。请注意,您可能不想在这里指定 border ,因为 \pset border 已经负责了这一点。如果没有提供 value ,则表属性处于未设置状态。

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

  • title (or C) #

    • 设置随后打印的表的标题。可以用来赋予输出描述性标记。如果没有提供 value ,则标题处于未设置状态。

  • tuples_only (or t) #

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

  • unicode_border_linestyle #

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

  • unicode_column_linestyle #

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

  • unicode_header_linestyle #

    • unicode 样式的标头绘制样式设置为 singledouble 之一。

  • xheader_width #

    • 将扩展输出中标头的最大宽度设置为 full (默认值)、 columnpageinteger value 之一。

    • full :扩展标头不会被截断,并且和最宽的输出行一样宽。

    • column :将标头行截断到第一列的宽度。

    • page :将标头行截断到终端宽度。

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

Tip

有很多针对 \pset 的快捷命令。请参阅 \a\C\f\H\t\T\x

Note

该命令与 SET SQL 命令无关。

Patterns

各个 \d 命令接受 pattern 参数来指定要显示的对象名称。在最简单的情况下,模式只是对象的名称。模式内的字符通常折叠成小写,就像在 SQL 名称中一样;例如, \dt FOO 将显示名为 foo 的表。与 SQL 名称一样,在模式周围放置双引号将停止折叠成小写。如果您需要在模型中包含一个实际的双引号字符,请将它写成双引号序列中的双引号对;同样,这也与 SQL 带引号标识符的规则一致。例如, \dt "FOO""BAR" 将显示名为 FOO"BAR 的表(不是 foo"bar )。与 SQL 名称的常规规则不同,您可以在模式的一部分周围加上双引号,例如 \dt FOO"FOO"BAR 将显示名为 fooFOObar 的表。

无论何时 pattern 参数完全省略, \d 命令都会显示在当前模式搜索路径中可见的所有对象 — 这等同于使用 * 作为模式。(如果对象包含模式在搜索路径中,并且没有相同类型和名称的对象在搜索路径中前面出现,则该对象被视为 visible 。这等同于该对象可以通过名称引用而无需显式模式限定的声明。)要查看数据库中所有对象,无论是否可见,请使用 *.* 作为模式。

在模式内, * 匹配任何字符序列(包括没有字符)和 ? 匹配任何单个字符。(此符号与 Unix shell 文件名模式相当。)例如, \dt int* 显示其名称以 int 开头的表。但在双引号内, *? 失去这些特殊含义,并且只是从字面上匹配。

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

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

高级用户可以使用正则表达式符号,例如字符类,例如 [0-9] 以匹配任何数字。所有 正则表达式特殊字符的运作方式如 Section 9.7.3 中指出的那样, . 除外,后者如前所述被视为分隔符, * 被转换为正则表达式符号 .*? 被转换为 . ,而 $ 被直接匹配。你可以根据需要通过为 . 编写 ? ,为 R*, or _(_R|)_ for _ 编写 (_R +|)_ 来仿真这些图案字符,并不需要 . _$ 作为正则表达式字符,因为该模式必须匹配整个名称,不同于正则表达式的通常解释( 换句话说, $ 会自动附加到你的模式)。如果不想让模式锚定,可以在开头和/或结尾处编写 * 。请注意在双引号内,所有正则表达式特殊字符都失去其特殊含义,并将被直接匹配。此外,正则表达式特殊字符在运算符名称模式(即, \do 的参数)中被直接匹配。

Advanced Features

Variables

psql 提供与常见 Unix 命令外壳类似的变量替换功能。变量只是名称/值对,其中值可以是任何长度的任何字符串。名称必须包括字母(包括非拉丁字母)、数字和下划线。

要设置变量,请使用 psql meta-command \set 。例如,

testdb=> \set foo bar

将变量 foo 设置为值 bar 。要检索变量的内容,请在名称前面加上冒号,例如:

testdb=> \echo :foo
bar

这适用于常规 SQL 命令和元命令;详细信息如下文 SQL Interpolation 中所述。

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

Note

\set 的参数受与其他命令相同的替换规则的约束。因此你可以构建像 \set :foo 'something' 这样的有趣引用,分别获取“软链接”或 Perl 或者 PHP 中著名的“变量变量”。不幸的是(或幸运的是?),无法使用这些构造来做任何有用的事情。另一方面, \set bar :foo 是复制变量的完美有效的方法。

psql 特殊处理了其中一些变量。它们表示某些选项设置,可以通过更改变量的值在运行时进行更改,或者在某些情况下表示 psql 的可更改状态。根据惯例,所有经过特殊处理的变量的名称都由所有大写 ASCII 字母(以及可能的数字和下划线)组成。为了确保将来的最大兼容性,请避免将此类变量名用于你自己的目的。

控制 psql 行为的变量通常不能取消设置或设置为无效值。允许使用 \unset 命令,但被解释为将变量设置到其默认值。在没有第二个参数的情况下使用 \set 命令被解释为将变量设置为 on ,以接受该值的控制变量,并且对于其他变量则被拒绝。此外,接受 onoff 值的控制变量还将接受布尔值的另一种常见拼写,例如 truefalse

经过特殊处理的变量包括:

  • AUTOCOMMIT #

    • on (默认值)时,每个 SQL 命令在成功完成时都会自动提交。要在这种模式下推迟提交,你必须输入 BEGINSTART TRANSACTION SQL 命令。当 off 或未设置时,直到你明确发出 COMMITEND ,SQL 命令才会提交。autocommit-off 模式的工作原理是为你发出一个隐含的 BEGIN ,在任何尚未进入事务块且本身不是 BEGIN 或其他事务控制命令的命令之前,或者不能在事务块中执行的命令(例如 VACUUM )。

  • COMP_KEYWORD_CASE #

    • 确定在完成 SQL 关键字时要使用哪种字母大小写。如果设置为 lowerupper ,则完成的单词将分别是小写或大写。如果设置为 preserve-lowerpreserve-upper (默认值),则完成的单词将与已经输入单词的大小写一致,但未输入任何内容就完成的单词将分别是小写或大写。

  • DBNAME #

    • 你当前连接到的数据库的名称。每次你连接到数据库(包括程序启动)时都会设置此名称,但可以更改或取消设置。

  • ECHO #

    • 如果设置为 all ,则所有非空输入行在读取时都会打印到标准输出。(这并不适用于交互式读取的行。)要在程序启动时选择此行为,请使用开关 -a 。如果设置为 queries ,psql 在将每个查询发送到服务器时将其打印到标准输出。选择此行为的开关是 -e 。如果设置为 errors ,则只会将失败的查询显示在标准错误输出上。此行为的开关是 -b 。如果设置为 none (默认值),则不显示任何查询。

  • ECHO_HIDDEN #

    • 当此变量设置为 on 并且 backslash 命令查询数据库时,该查询将首先显示。此功能可帮助你研究 PostgreSQL 内部并为你自己的程序提供类似的功能。(要在程序启动时选择此行为,请使用 -E 开关。)如果你将此变量设置为 noexec ,则查询将仅显示但不实际发送到服务器并执行。默认值是 off

  • ENCODING #

    • 当前客户端字符集编码。每次你连接到数据库(包括程序启动)时以及你使用 \encoding 更改编码时都会设置此变量,但可以更改或取消设置。

  • ERROR #

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

  • FETCH_COUNT #

    • 如果此变量设置为大于零的整数, SELECT 查询的结果将按该数目的行分组获取和显示,而不是在显示之前收集整个结果集的默认行为。因此,无论结果集的大小如何,使用的内存量都非常有限。启用此功能时通常使用 100 到 1000 的设置。请记住,在使用此功能时,查询可能在显示了部分行后发生故障。

  • HIDE_TABLEAM #

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

  • HIDE_TOAST_COMPRESSION #

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

  • HISTCONTROL #

    • 如果此变量设置为 ignorespace ,则不会将以空格开头的行输入到历史记录列表中。如果设置为 ignoredups ,则不会输入与之前的历史记录行匹配的行。 ignoreboth 的值合并了这两个选项。如果设置为 none (默认值),则以交互模式读取的所有行都保存在历史记录列表中。

  • HISTFILE #

    • 将用于存储历史记录列表的文件名。如果未设置,则文件名取自 PSQL_HISTORY 环境变量。如果也未设置,则默认值为 ~/.psql_history ,或 Windows 上的 %APPDATA%\postgresql\psql_history 。例如,放入:

\set HISTFILE ~/.psql_history-:DBNAME
  • ~/.psqlrc 中将导致 psql 为每个数据库维护一个单独的历史记录。

    • HISTSIZE #

  • 存储在命令历史记录中的命令的最大数量(默认为 500)。如果设置为负值,则不应用限制。

    • HOST #

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

    • IGNOREEOF #

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

    • LASTOID #

  • INSERT\lo_import 命令返回的最后受影响的 OID 的值。此变量仅保证在显示下一条 SQL 命令的结果后才有效。版本 12 及更高版本 PostgreSQL 服务器不再支持 OID 系统列,因此在针对此类服务器时,LASTOID 始终为 0。

    • LAST_ERROR_MESSAGE__LAST_ERROR_SQLSTATE #

  • 当前 psql 会话中最近失败查询的主要错误消息和关联的 SQLSTATE 代码,或空字符串和 00000 (如果当前会话中没有错误发生)。

    • ON_ERROR_ROLLBACK #

  • 当设置为 on 时,如果事务块中的语句生成错误,则错误将被忽略,事务继续。当设置为 interactive 时,此类错误仅在交互式会话中被忽略,而不读取脚本文件时被忽略。当设置为 off (默认值)时,事务块中的语句生成错误将中止整个事务。错误回滚模式通过在事务块中的每条命令之前为您发出隐式 SAVEPOINT ,然后在命令失败时回滚到保存点来工作。

    • ON_ERROR_STOP #

  • 默认情况下,在发生错误后命令处理将继续。当此变量设置为 on 时,处理将立即停止。在交互模式中,psql 将返回到命令提示符;否则,psql 将退出,返回错误代码 3 以区分这种情况与使用错误代码 1 报告的致命错误条件。在这两种情况下,任何当前运行的脚本(如果有,则为顶级脚本,以及它可能调用的任何其他脚本)都将立即终止。如果顶级命令字符串包含多个 SQL 命令,则处理将随当前命令停止。

    • PORT #

  • 当前连接的数据库服务器端口。每次连接到数据库(包括程序启动)时都会设置此值,但此值可以更改或取消。

    • PROMPT1_PROMPT2_PROMPT3 #

  • 这些指定 psql 发出的提示应是什么样子。请参见下文的 Prompting

    • QUIET #

  • 将此变量设置为 on 等同于命令行选项 -q 。它在交互模式中可能不会太有用。

    • ROW_COUNT #

  • 最后一条 SQL 查询返回或影响的行数,如果查询失败或没有报告行数,则为 0。

    • SERVER_VERSION_NAME__SERVER_VERSION_NUM #

  • 服务器版本号为字符串,例如 9.6.210.111beta1 ,以数字形式表示,例如 90602100001 。每次连接到数据库(包括程序启动)时都会设置这些设置,但这些设置可以更改或取消。

    • 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 #

  • 此变量可以设置为 nevererrorsalways 来控制服务器消息中是否显示 CONTEXT 字段。默认值是 errors (这意味着上下文中将显示错误消息,但在注意或警告消息中将不显示)。当 VERBOSITY 设置为 tersesqlstate 时,此设置不起作用。(另请参阅 \errverbose ,在您想要一个您刚刚收到的错误的详细版本时使用。)

    • SINGLELINE #

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

    • SINGLESTEP #

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

    • SQLSTATE #

  • 与上一个 SQL 查询失败相关的错误代码(参阅 Appendix A ),如果成功则为 00000

    • USER #

  • 您当前连接到的数据库用户。每次连接到数据库(包括程序启动)时都会设置此项,但可以更改或取消设置。

    • VERBOSITY #

  • 此变量可以设置为 defaultverbosetersesqlstate 来控制错误报告的详细程度。(另请参阅 \errverbose ,在您想要一个您刚刚收到的错误的详细版本时使用。)

    • VERSION_VERSION_NAME_VERSION_NUM #

  • 这些变量在程序启动时设置,以分别反映 psql 的版本,包括详细字符串、短字符串(例如 9.6.210.111beta1 )和数字(例如 90602100001 )。它们可以更改或取消设置。

Note

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

Note

自动提交开启模式是 PostgreSQL 的传统行为,但自动提交关闭模式更接近 SQL 规范。如果您更喜欢自动提交关闭模式,您可能希望在系统级 psqlrc 文件或您的 ~/.psqlrc 文件中设置它。

Tip

虽然您可以使用此功能来处理任何输出格式,但默认的 aligned 格式通常看起来很糟糕,因为每组 FETCH_COUNT 行将分别设置格式,这导致列宽不同,跨行组。其他输出格式效果更好。

Note

此功能盗用自 Bash 并且毫不犹豫。

Note

此功能盗用自 Bash 并且毫不犹豫。

Note

此功能盗用自 Bash 并且毫不犹豫。

Note

此功能盗用自 Bash 并且毫不犹豫。

SQL Interpolation

psql 变量的一个关键功能是您可以将它们替换(“内插”)到常规 SQL 语句中,以及元命令的参数中。此外,psql 提供了确保用作 SQL 文字和标识符的变量值被正确引用的功能。不加任何引用内插值的语法是在变量名前加上冒号 ( : )。例如,

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;

将查询表 my_table 。请注意,这可能是不安全的:变量的值会被逐字复制,因此它可能包含不平衡的引号,甚至反斜杠命令。您必须确保将其放在有意义的位置。

当一个值将被用作 SQL 文字或标识符时,最安全的做法是对其进行引用。若要将变量的值作为 SQL 文字引用,请编写冒号,后跟被单引号引住的变量名。若要将该值作为 SQL 标识符引用,请编写冒号,后跟被双引号引住的变量名。这些结构正确处理了嵌入在变量值中的引号和其他特殊字符。前面的示例可以更安全地这样编写:

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";

变量内插不会在带引号的 SQL 文字和标识符中执行。因此,诸如 ':foo' 之类的结构不起作用,无法从变量的值生成带引号的文字(如果它确实起作用将是不安全的,因为这样做无法正确处理嵌入在值中的引号)。

此机制的一个示例用途是将文件内容复制到表列中。首先将文件加载到变量中,然后将该变量的值内插为带引号的字符串:

testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');

(请注意,如果 my_file.txt 包含 NUL 字节,这仍然行不通。psql 变量值中不支持嵌入 NUL 字节。)

由于冒号可以在 SQL 命令中合法出现,因此对内插的明显尝试(即 :name:'name':"name" )不会被替换,除非当前设置了命名的变量。无论如何,您都可以用反斜杠转义冒号,以防止其被替换。

:{?_name 特殊语法根据变量是否存在返回真或假,因此总是会被替换,除非冒号使用反斜杠转义。

冒号语法针对变量是标准 SQL,适用于嵌入式查询语言如 ECPG。数组切片和类型转换的冒号语法是 PostgreSQL 扩展,有时可能与标准用法冲突。使用冒号引号语法来转义变量值作为 SQL 变量名或标识符是 psql 扩展。

Prompting

psql 发出的提示可根据你的偏好进行定制。三个变量 PROMPT1PROMPT2PROMPT3 包含字符串和特殊转义序列,它们描述提示符的外观。提示符 1 是正常的提示符,在 psql 请求新的命令时发出。提示符 2 在命令输入期间需要更多输入时发出,例如是因为命令不是以分号结尾或引号未闭合。提示符 3 在你运行 SQL COPY FROM STDIN 命令并需要在终端上键入行值时发出。

选定的提示变量值将被逐字打印,除遇到百分号 ( % ) 外。根据下一个字符,某些其它文本会替换。已定义的替换内容为:

  • %M #

    • 数据库服务器的完全主机名(带有域名),如果连接是通过 Unix 域套接字,则为 [local] ,如果 Unix 域套接字不在默认编译位置,则为 [local: /dir/name_]_。

  • %m #

    • 数据库服务器的主机名,在第一个句点处截断,如果连接是通过 Unix 域套接字,则为 [local]

  • %> #

    • 数据库服务器侦听的端口号。

  • %n #

    • 数据库会话用户名。(该值的展开在数据库会话期间可能发生更改,这是命令 SET SESSION AUTHORIZATION 的结果。)

  • %/ #

    • 当前数据库的名称。

  • %~ #

    • %/ 相同,但如果数据库是你的默认数据库,则输出为 ~ (波浪符)。

  • %

    • 如果会话用户是数据库超级用户,则为 # ,否则为 &gt; 。(该值的展开在数据库会话期间可能发生更改,这是命令 SET SESSION AUTHORIZATION 的结果。)

  • %p #

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

  • %R #

    • 提示符 1 中通常为 = ,但如果会话处于条件块的非活动分支,则为 @ ,如果处于单行模式,则为 ^ ,如果会话已与数据库断开连接(如果 \connect 失败,可能发生这种情况),则为 ! 。在提示符 2 中, %R 替换为取决于 psql 期望更多输入的原因的字符:如果命令只是尚未终止,则为 - ,但如果 /* &#8230;&#8203; */ 注释未完成,则为 * ,如果带引号的字符串未完成,则为单引号,如果带引号的标识符未完成,则为双引号,如果带美元符号的字符串未完成,则为美元符号,如果存在不匹配的左括号,则为 ( 。在提示符 3 中, %R 不会生成任何内容。

  • %x #

    • 事务状态:未在事务块中时为空字符串,在事务块中时为 * ,在失败的事务块中时为 ! ,或者在事务状态不确定的情况下(例如,因为没有连接),则为空。

  • %l #

    • 当前语句内部的行号,从 1 开始。

  • %__digits #

    • 用指示的八进制代码的字符替换。

  • %:name: #

    • psql 变量 name 的值。有关详细信息,请参见上文 Variables

  • %`command` #

    • command 的输出,类似于普通的“反引号”替换。

  • %[ …​ %] #

    • 提示符可以包含终端控制字符,这些字符例如可以更改提示符文本的颜色、背景或样式,或更改终端窗口的标题。为了让 Readline 的行编辑功能正常工作,这些不可打印的控制字符必须通过 %[%] 包围起来指定为不可见。提示符内可以出现这些对的多个。例如:

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
  • 在兼容 VT100、支持颜色的终端上,创建一个粗体 ( 1; ) 黑底黄字 ( 33;40 ) 提示符。

    • %w #

  • PROMPT1 最近输出的相同宽度的空格。这可用作 PROMPT2 设置,这样多行语句将与第一行对齐,但是看不见辅助提示符。

在提示符中插入百分号,请编写 %% 。提示符 1 和 2 的默认提示符是 '%/%R%x%# ' ,提示符 3 的默认提示符是 '>> '

Note

此功能是从 tcsh 中可耻盗用的。

Command-Line Editing

psql 使用 Readline 或 libedit 库(如果可用)以方便地编辑和检索行。退出 psql 时,会自动保存命令历史记录,并在启动 psql 时重新加载。输入上箭头或 Ctrl-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 字符的文本时,这会变得特别有用。

Environment

  • COLUMNS #

    • 如果 \pset columns 为零,它将控制 wrapped 格式的宽度和宽度的确定,用于确定在扩展自动模式中宽输出需要分页器还是应切换到竖排格式。

  • PGDATABASE_PGHOST_PGPORT__PGUSER #

  • PG_COLOR #

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

  • PSQL_EDITOR_EDITOR_VISUAL #

    • \e\ef\ev 命令使用的编辑器。这些变量按列出的顺序检查;设置的第一个将被使用。如果它们都没有被设置,默认在 Unix 系统上使用 vi ,在 Windows 系统上使用 notepad.exe

  • PSQL_EDITOR_LINENUMBER_ARG #

    • 当在带有行号参数时使用 \e\ef\ev 时,此变量指定用于将起始行号传递给用户编辑器的命令行参数。对于诸如 Emacs 或 vi 等编辑器,这是一个加号。如果选项名和行号之间需要有空格,请在变量的值中包含一个尾随空格。示例:

PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '
  • 在 Unix 系统上的默认是 + (对应于默认编辑器 vi ,并且适用于许多其他常见的编辑器);但是在 Windows 系统上没有默认设置。

    • PSQL_HISTORY #

  • 命令历史记录文件的备用位置。执行波浪号 ( ~ ) 扩展。

    • PSQL_PAGER__PAGER #

  • 如果查询的结果超出了屏幕,它们将通过该命令管道传递。典型值为 moreless 。通过将 PSQL_PAGERPAGER 设置为空字符串或通过调整 \pset 命令的分页器相关选项,可以禁用分页器。这些变量按列出的顺序检查;设置的第一个将被使用。如果它们都没有被设置,默认情况下在大多平台上使用 more ,但在 Cygwin 上使用 less

    • PSQL_WATCH_PAGER #

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

    • PSQLRC #

  • 用户 .psqlrc 文件的备用位置。执行波浪号 ( ~ ) 扩展。

    • SHELL #

  • \! 命令执行的命令。

    • TMPDIR #

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

此实用程序与大多数其他 PostgreSQL 实用程序一样,还使用 libpq 支持的环境变量(请参阅 Section 34.15 )。

Files

  • psqlrc and ~/.psqlrc #

    • 除非传入 -X 选项,否则 psql 会尝试在连接到数据库后,但接受常规命令之前读取并执行来自系统范围的启动文件 ( psqlrc ) 以及用户的个人启动文件 ( ~/.psqlrc ) 中的命令。这些文件可用于设置客户端和/或服务器以满足用户体验,通常使用 \setSET 命令。

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

    • 用户的个人启动文件名为 .psqlrc ,并在调用用户的 home 目录中查找。在 Windows 中,个人启动文件会被命名为 %APPDATA%\postgresql\psqlrc.conf 。在任一情况下,都可以通过设置 PSQLRC 环境变量来覆盖此默认文件路径。

    • 系统范围的启动文件和用户的个人启动文件都可以通过追加破折号和 PostgreSQL 主要或次要发行版本标识符到文件名来指定 psql 版本,例如 ~/.psqlrc-16~/.psqlrc-16.3 。最匹配版本的文件将读取为优先于非版本特定文件。在根据上述内容确定文件路径后,将添加这些版本后缀。

  • .psql_history #

    • 命令行历史记录存储在文件 ~/.psql_history 中,或存储在 Windows 上的 %APPDATA%\postgresql\psql_history 中。

    • 历史记录文件的位置可以通过 HISTFILE psql 变量或 PSQL_HISTORY 环境变量显式设置。

Notes

Notes for Windows Users

psql 被构建为“控制台应用程序”。由于 Windows 控制台窗口使用与其他系统不同的编码,因此在 psql 中使用 8 位字符时必须特别小心。如果 psql 检测到有问题的控制台代码页,它将在启动时发出警告。要更改控制台代码页,需要两件事:

Examples

第一个示例展示如何将一个命令跨多个输入行展开。请注意不断变化的提示符:

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)

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