↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

psql

psql — PostgreSQL 的交互式终端

大纲

psql [options] [dbname [user]]

描述

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

选项

-a
--echo-all

在读入时把所有行打印到屏幕。这对脚本处理比交互模式更有用。 This is equivalent to setting the variable ECHO to all.

-A
--no-align

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

-c query
--command query

指定 psql 执行一个查询字符串 query,然后退出。这在 shell 脚本中很有用。

query 必须是一个后端完全可解析的查询字符串(即不包含 psql 专有的特性),或者是单个反斜线命令。因此不能用这个选项混合 SQL 和 psql 元命令。 To achieve that, you could pipe the string into psql, like this: echo "\x \\ select * from foo;" | psql.

-d dbname
--dbname dbname

指定要连接的数据库的名称。这等效于在命令行上把 dbname 指定为第一个非选项参数。

-e
--echo-queries

显示发送到后端的所有查询。这等效于把变量 ECHO 设置为 queries。

-E
--echo-hidden

回显 \d 及其他反斜线命令生成的实际查询。如果你想在自己的程序中包含类似的功能,可以使用它。 This is equivalent to setting the variable ECHO_HIDDEN from within psql.

-f filename
--file filename

用文件 filename 作为查询的来源,而不是交互式地读取查询。 文件处理完后,psql 终止。这在很多方面等价于内部 命令 \i。

如果filename是-(连字符),则会读取标准输入。

使用这个选项与写成psql < filename有细微差别。通常两种形式都会得到你期望的结果,但使用-f可以启用一些有用的特性,例如带行号的错误消息。使用这个选项也还有一点机会降低启动开销。另一方面,使用 shell 输入重定向的形式在理论上能保证得到与你手工逐行输入时完全相同的输出。

-F separator
--field-separator separator

使用separator作为字段分隔符。这等效于\pset fieldsep或者\f。

-h hostname
--host hostname

指定 postmaster 正在运行的主机的主机名。如果 host 以斜线开头,则它会被用作 Unix 域套接字所在的目录。

-H
--html

打开 HTML 表格输出。这等效于 \pset format html 或 \H 命令。

-l
--list

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

-o filename
--output filename

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

-p port
--port port

指定 postmaster 用于监听连接的 TCP/IP 端口,或者在省略时指定本地 Unix 域套接字文件扩展名。默认是 PGPORT 环境变量的值,如果没有设置,则默认为编译时指定的端口,通常是 5432。

-P assignment
--pset assignment

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

-q
--quiet

指定 psql 安静地工作。默认情况下,它会打印欢迎消息和各种提示信息。如果使用了这个选项,以上那些就都不会输出。这与 -c 选项配合很有用。 Within psql you can also set the QUIET variable to achieve the same effect.

-R separator
--record-separator separator

把separator用作记录分隔符。这等效于\pset recordsep命令。

-s
--single-step

以单步模式运行。即每条查询发送到后端之前都会提示用户,并可选择取消执行。可用它来调试脚本。

-S
--single-line

以单行模式运行,此时换行符像分号一样 终止一条查询。

注意

这种模式是为坚持使用它的用户提供的,但并不一定值得推荐。特别是,如果在一行中混合了SQL和元命令,对于没有经验的用户来说,它们的执行顺序未必总是清楚的。

-t
--tuples-only

关闭列名和结果行计数页脚等的打印。它完全等效于 \t 元命令。

-T table_options
--table-attr table_options

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

-u

让 psql 在连接数据库之前提示输入用户名和密码。

这个选项已废弃,因为它在概念上有缺陷。 (为非默认用户名而提示与因为后端要求 而为口令提示其实是两件 事。)建议改看 -U 和 -W 选项。

-U username
--username username

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

-v assignment
--set assignment
--variable assignment

执行变量赋值,类似于 \set 内部命令。注意在命令行上必须用等号分隔名称和值。要取消变量的设置, 去掉等号即可。要把一个变量设置为没有值, 使用等号但去掉值。这些赋值在 启动的非常早期阶段完成,因此为内部目的保留 的变量可能会在稍后被覆盖。

-V
--version

显示 psql 的版本。

-W
--password

要求 psql 在连接数据库之前提示输入密码。即使你随后用元命令 \connect.

在当前版本中,只要后端要求口令认证,psql 就会自动发出口令提示。由于这目前基于 一个技巧,自动识别可能神秘地失败, 因此提供这个选项来强制提示。如果没有发出 口令提示而后端又要求口令认证,连接 尝试将失败。

-x
--expanded

打开扩展行格式模式。 This is equivalent to the command \x.

-X,
--no-psqlrc

不读取启动文件 ~/.psqlrc。

-?
--help

显示有关 psql 命令行参数的帮助。

并非所有平台都提供长选项。

退出状态

psql 正常结束时向 shell 返回 0;发生自身的致命错误(内存不足、 找不到文件)时返回 1;与后端的连接变坏且会话不是交互式时返回 2;脚本中发生错误且 设置了变量 ON_ERROR_STOP 时返回 3。

用法

连接到数据库

psql 是一个常规的 PostgreSQL 客户端应用程序。要连接到数据库,你需要知道目标数据库的名称、服务器的主机名和端口号,以及要以哪个用户名连接。 psql 可以通过命令行选项(即分别为 -d、-h、-p 和 -U)把这些参数告知它。如果遇到一个不属于任何选项的参数,它将被解释为数据库名(如果数据库名已经给出,则解释为用户名)。并非所有这些选项都是必需的,会应用默认值。 如果省略主机名, psql 将通过 Unix 域套接字连接到本地主机上的服务器。默认端口号在编译时确定。由于数据库服务器使用相同的默认值,因此在大多数情况下不必指定端口。默认用户名是你的 Unix 用户名,默认数据库名也是如此。请注意,你不能随意以任意用户名连接到任意数据库。数据库管理员应当已经告知你拥有的访问权限。为了少打一些字,你还可以把环境变量 PGDATABASE、PGHOST、PGPORT 和 PGUSER 设置为适当的值。

如果由于任何原因(如权限不足、postmaster 未在服务器上运行等)无法建立连接,psql 将返回错误并终止。

输入查询

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

$ psql testdb
Welcome to psql 7.3.21, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

testdb=>

在提示符下,用户可以输入 SQL 查询。 通常,当遇到表示查询结束的分号时,输入行被发送到后端。行尾并不会 终止一条查询!因此为了清晰,查询可以分布在多行上。 如果查询被发送且没有错误,查询的结果会显示在屏幕上。

每当执行一条查询时,psql 还会轮询由 LISTEN and NOTIFY.

元命令

你输入到 psql 中的任何以未加引号的反斜线开始的内容都是一个由 psql 自身处理的 psql 元命令。这些命令正是让 psql 在管理和编写脚本方面很有用的原因。元命令更常被称为斜线或反斜线命令。

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

要在参数中包含空白,可以用单引号将它括起来。要在这样的参数中包含一个单引号,可以在它前面放一个反斜线。单引号中的内容还会接受类似 C 语言的替换:\n(换行)、\t(制表符)、\digits、\0digits和 \0xdigits(分别表示以十进制、八进制或十六进制给出的码点对应的字符)。

如果未加引号的参数以冒号(:)开头,它会被当作一个 psql 变量,该变量的值将被用作参数。

用反引号(`)包围的参数会被当作传给 shell 的命令行。该命令的输出(去掉末尾的换行符)将被用作参数值。上述转义序列在反引号中同样适用。

有些命令接受一个 SQL 标识符(如表名)作为参数。这些参数遵循 SQL 关于双引号的语法规则:不带双引号的 标识符被强制转换为小写,而双引号内的空白 会包含在参数中。

当遇到另一个未加引号的反斜线时,参数解析停止。 这被当作新元命令的开始。特殊 序列 \\(两个反斜线)标志参数的结束并继续解析 SQL 查询(如果有)。这样 SQL 和 psql 命令就可以在一行中自由混用。 但无论如何,元命令的参数不能延续到行尾之后。

定义了下列元命令:

\a

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

\cd [directory]

把当前工作目录更改为 directory。如果没有参数,则切换到当前用户的主目录。

提示

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

\C [ title ]

设置作为查询结果打印的任何表的标题,或取消任何这样的标题。此命令等价于 \pset title title. (The name of this command derives from “caption”, as it was previously only used to set the caption in an HTML table.)

\connect (or \c) [ dbname [ username ] ]

建立到一个新数据库和/或以另一个用户名的连接。先前的连接会被关闭。如果dbname为-,则假定使用当前的数据库名。

如果省略username,则假定使用当前的用户名。

作为一条特殊规则,不带任何参数的\connect将以默认用户连接到默认数据库(就像你启动psql时不带任何参数一样)。

如果连接尝试失败(用户名错误、访问被拒绝等),当且仅当psql处于交互模式时,才会保留先前的连接。在执行非交互式脚本时,处理会立即停止并报错。选择这种区别对待,一方面是为了让用户方便地应对输入错误,另一方面是作为一种安全机制,防止脚本意外地作用于错误的数据库。

\copy table [ ( column_list ) ] { from | to } filename | stdin | stdout [ with ] [ oids ] [ delimiter [as] 'character' ] [ null [as] 'string' ]

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

该命令的语法类似于 SQL COPY 命令(细节 见其描述)。注意,因此对 \copy 命令适用特殊的解析规则。特别是,变量替换规则和反斜线转义不适用。

提示

此操作不如 SQL COPY 命令高效,因为所有数据都必须通过客户端/服务器的 IP 或套接字连接。对于大量 数据,另一种技术可能更可取。

注意

注意前端复制与后端复制对 stdin 和 stdout 的解释差异:在前端复制中它们总是 指 psql 的输入和输出流。 而在后端复制中 stdin 来自 COPY 自身的来源(例如用 -f 选项运行的脚本),而 stdout 指查询输出流(见 下文的 \o 元命令)。

\copyright

显示 PostgreSQL 的版权和分发条款。

\d [ pattern ]

对每个匹配 pattern 的关系(表、视图、索引或序列),显示所有列、它们的类型以及任何特殊属性(如 NOT NULL 或默认值,如果有)。相关的索引、约束、规则和触发器也会显示,如果该关系是视图则还显示视图定义。 (“Matching the pattern” is defined below.)

命令形式 \d+ 相同,但还会显示 与表列相关联的任何注释。

注意

如果 \d 不带 pattern 参数使用,它等价于 \dtvs,后者会显示所有 表、视图和序列的列表。这纯粹是为了 方便。

\da [ pattern ]

列出所有可用的聚合函数及其操作的数据类型。如果指定了 pattern(正则表达式), 则只显示匹配的聚合。

\dd [ pattern ]

显示匹配 pattern 的对象的描述,如果没有给出参数则显示所有可见对象的描述。但无论哪种情况,都只列出有描述的对象。 (“Object” covers aggregates, functions, operators, types, relations (tables, views, indexes, sequences, large objects), rules, and triggers.) For example:

=> \dd version
                     Object descriptions
   Schema   |  Name   |  Object  |        Description
------------+---------+----------+---------------------------
 pg_catalog | version | function | PostgreSQL version string
(1 row)

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

注意

PostgreSQL 把对象 描述存储在 pg_description 系统表中。

\dD [ pattern ]

列出所有可用的域(派生类型)。如果指定了 pattern, 则只显示匹配的域。

\df [ pattern ]

列出可用的函数及其参数和返回类型。如果指定了 pattern, 则只显示匹配的函数。如果使用 \df+ 形式,还会显示每个函数的 附加信息,包括语言和描述。

注意

为了减少杂乱,\df 不显示数据类型 I/O 函数。这是通过忽略接受或返回 cstring 类型的函数实现的。

\distvS [ pattern ]

这不是实际的命令名:字母 i、s、t、v、S 分别代表索引、序列、表、视图和系统表。你可以按任意顺序指定其中任意个或全部字母,以获得所有匹配对象的列表。字母 S 把列表限制为系统对象;不带 S 时只显示非系统对象。 If “+” is appended to the command name, each object is listed with its associated description, if any.

如果指定了 pattern, 则只列出名字匹配该模式的对象。

\dl

这是\lo_list的别名,用于显示大对象列表。

\do [ pattern ]

列出可用的操作符及其操作数和返回类型。 如果指定了 pattern,则只列出名称匹配该模式的操作符。

\dp [ pattern ]

产生所有可用表及其相关访问权限的列表。 如果指定了 pattern,则只列出名称匹配该模式的表。

访问权限用 GRANT 和 REVOKE 命令设置。更多信息见 GRANT。

\dT [ pattern ]

列出所有数据类型,或者只列出匹配pattern的类型。命令形式\dT+显示额外的信息。

\du [ pattern ]

列出所有数据库用户,或只列出匹配 pattern 的用户。

\edit (or \e) [ filename ]

如果指定了 filename,则编辑该文件;编辑器退出后,其内容被复制回查询缓冲区。 If no argument is given, the current query buffer is copied to a temporary file which is then edited in the same fashion.

然后新的查询缓冲区会按 psql 的正常 规则重新解析,整个缓冲区 被当作单独一行。(因此你不能用这种 方式制作脚本。请用 \i。)这也意味着 如果查询以分号结尾(或更确切地说包含分号),它会被 立即执行。在其他情况下它只会留在 查询缓冲区中等待。

提示

psql 依次搜索环境 变量 PSQL_EDITOR、EDITOR 和 VISUAL(按此顺序)来寻找要用的编辑器。如果 它们全部未设置,则运行 /bin/vi。

\echo text [ ... ]

把参数打印到标准输出,参数之间以一个空格分隔并后跟一个换行符。这在脚本的输出中穿插信息时很有用。例如:

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

If the first argument is an unquoted -n the the trailing newline is not written.

提示

如果你用 \o 命令重定向 查询输出,你可能希望用 \qecho 而不是这条命令。

\encoding [ encoding ]

如果使用多字节编码,则设置客户端编码。不带参数时,此命令显示当前编码。

\f [ string ]

设置非对齐查询输出的字段分隔符。默认是竖线(|)。设置输出选项的通用方法另见 \pset。

\g [ { filename | |command } ]

把当前查询输入缓冲区发送到后端,并可选地把输出保存到 filename 中,或把输出通过管道送到一个单独的 Unix shell 去执行 command。 A bare \g is virtually equivalent to a semicolon. A \g with argument is a “one-shot” alternative to the \o command.

\help (or \h) [ command ]

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

注意

为简化输入,由多个词组成的命令 不必加引号。因此键入 \help alter table 就可以。

\H

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

\i filename

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

注意

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

\l (or \list)

列出服务器中的所有数据库及其所有者。向命令名追加 + 还可以看到数据库的任何描述。 If your PostgreSQL installation was compiled with multibyte encoding support, the encoding scheme of each database is shown as well.

\lo_export loid filename

从数据库读取 OID 为 loid 的大对象并把它写入 filename。注意这条命令与服务器端函数 lo_export 有微妙的差别,后者以数据库服务器 运行用户的权限在服务器的 文件系统上操作。

提示

用 \lo_list 查出大对象的 OID。

注意

关于所有大对象操作的重要信息, 见 LO_TRANSACTION 变量的描述。

\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 命令查看这些注释。

注意这条命令与服务器端的 lo_import 有微妙的差别,因为它以本地 用户在本地文件系统上操作,而不是服务器的用户和文件 系统。

注意

关于所有大对象操作的重要信息, 见 LO_TRANSACTION 变量的描述。

\lo_list

显示当前存储在数据库中的所有 PostgreSQL 大对象的列表以及为它们提供的任何注释。

\lo_unlink loid

从数据库删除 OID 为 loid 的大对象。

提示

用 \lo_list 查出大对象的 OID。

注意

关于所有大对象操作的重要信息, 见 LO_TRANSACTION 变量的描述。

\o [ {filename | |command} ]

把以后的查询结果保存到文件 filename 中,或把以后的结果通过管道送到一个单独的 Unix shell 去执行 command。如果不指定参数,查询输出将重置为 stdout。

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

提示

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

\p

将当前查询缓冲区打印到标准输出。

\pset parameter [ value ]

此命令设置影响查询结果表输出的选项。 parameter 描述要设置哪个选项。 The semantics of value depend thereon.

可调整的打印选项有:

format

把输出格式设置为 unaligned、 aligned、html 或 latex 之一。允许唯一的缩写。 (也就是说一个字母就足够了。)

“非对齐” 把一个元组的所有字段写在一 行上,以当前有效的字段分隔符分隔。这是 为了创建可能要被其他程序读入的输出 (制表符分隔、逗号分隔)。 “对齐” 模式是默认的标准、人类可读、 排版良好的文本输出。 “HTML” 和 “LaTeX” 模式输出的表格用于 包含在使用相应标记语言的文档 中。它们不是完整的文档!(在 HTML 中这或许不那么严重,但在 LaTeX 中你必须 有完整的文档包装。)

border

第二个参数必须是一个数字。一般来说,数字越大表格的边框和线越多,但这取决于具体的格式。 In HTML mode, this will translate directly into the border=... attribute, in the others only values 0 (no border), 1 (internal dividing lines), and 2 (table frame) make sense.

expanded (or x)

在常规格式和扩展格式之间切换。启用扩展格式时, 所有输出有两列,字段名在左、数据在右。如果数据在正常的 “水平”模式下放不到屏幕上,此模式很有用。

所有四种输出模式都支持扩展模式。

null

第二个参数是一个每当字段为空值时应打印 的字符串。默认是完全不打印任何内容,这很容易被误认为例如空 字符串。因此,可以选择写 \pset null '(null)'。

fieldsep

指定在非对齐输出模式中使用的字段分隔符。这样就可以创建例如其他程序可能更喜欢的制表符或逗号分隔的输出。要把制表符设置为字段分隔符,输入 \pset fieldsep '\t'。默认的字段分隔符是 '|'(“竖线”符号)。

footer

切换默认页脚(x 行)的显示。

recordsep

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

tuples_only (or t)

在只显示元组和完整显示之间切换。完整显示可能 显示额外信息,如列标题、标题和各种 页脚。在只显示元组模式下,只显示实际的表数据。

title [ text ]

为随后打印的任何表设置表标题。这可用于为输出提供描述性标签。如果不带参数,则取消标题。

注意

这以前只影响 HTML 模式。现在 你可以在任何输出格式中设置标题。

tableattr (or T) [ text ]

允许你指定要放在 HTML table 标签内的任何属性。例如可以是 cellpadding 或 bgcolor。注意这里可能不应该指定 border,因为那已由 \pset border 处理。

pager

切换查询和 psql 帮助输出对分页器的使用。如果设置了环境变量 PAGER,输出将通过管道送到指定的程序。否则使用依赖于平台的默认值(如 more)。

无论如何,只有在看起来合适时 psql 才 使用分页器。这尤其意味着 输出是发往终端的,而且表在 屏幕上通常放不下。由于打印 例程的模块化性质,并不总是能预测 实际会打印的行数。因此 psql 在何时使用分页器上 可能显得不太挑剔。

Illustrations on how these different formats look can be seen in the 示例 section.

提示

\pset 有多种快捷命令。参见 \a、\C、\H、\t、\T 和 \x。

注意

不带参数调用 \pset 是一个错误。将来这个调用可能会显示所有打印选项的当前状态。

\q

退出 psql 程序。

\qecho text [ ... ]

此命令与 \echo 相同,只是所有输出将写入由 \o 设置的查询输出通道。

\r

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

\s [ filename ]

打印命令行历史或把它保存到 filename。如果省略 filename,则历史写到标准输出。 This option is only available if psql is configured to use the GNU history library.

注意

在当前版本中,不再需要保存 命令历史,因为程序终止时会 自动完成保存。每次 psql 启动时 历史也会自动加载。

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

把内部变量 name 设置为 value,如果给出多个值则设置为它们的串接。如果没有给出第二个参数,该变量只是被设置为没有值。要取消设置一个变量,使用 \unset 命令。

有效的变量名可以包含字符、数字和下划线。详见有关 psql 变量的小节。

尽管欢迎你把任何变量设置为任何值,psql 把若干变量 视为特殊的。它们记录在有关变量的小节中。

注意

此命令与 SQL 命令 SET 完全无关。

\t

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

\T table_options

允许你指定要放在 HTML 表输出模式的 table 标签中的选项。 This command is equivalent to \pset tableattr table_options.

\timing

切换以毫秒为单位显示每条 SQL 语句执行耗时的开关状态。

\w {filename | |command}

把当前查询缓冲区输出到文件filename,或通过管道送给 Unix 命令command。

\x

切换扩展行格式模式。因此它等价于 \pset expanded。

\z [ pattern ]

产生所有可用表及其相关访问权限的列表。 如果指定了 pattern,则只列出名称匹配该模式的表。

访问权限用 GRANT 和 REVOKE 命令设置。更多信息见 GRANT。

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

\! [ command ]

进入一个单独的 shell,或执行 shell 命令 command。参数不会被进一步解释;shell 会原样看到它们。

\?

获取有关反斜线(\)命令的帮助信息。

各种 \d 命令接受一个 pattern 参数来指定要显示的对象名。模式的解释方式类似于 SQL 标识符:未加引号的字母被强制转换为小写,而双引号(")保护字母不被转换大小写,并允许在标识符中包含空白。在双引号中,成对的双引号在结果名称中缩减为一个双引号。例如,FOO"BAR"BAZ 被解释为 fooBARbaz,而 "A weird"" name" 变成 A weird" name。

更有意思的是,\d 模式允许用 * 表示任意字符序列,用 ? 表示任意单个字符。 (This notation is comparable to Unix shell filename patterns.) Advanced users can also use regular-expression notations such as character classes, for example [0-9] to match “any digit”. To make any of these pattern-matching characters be interpreted literally, surround it with double quotes.

包含(未加引号的)点号的模式会被解释为模式名称的匹配模式,后接对象名称的匹配模式。例如,\dt foo*.bar*显示模式名以foo开头且表名以bar开始的所有表。如果没有点号,则该匹配模式只匹配当前模式搜索路径中可见的对象。

每当完全省略pattern参数时,\d命令会显示当前模式搜索路径中可见的所有对象。要查看数据库中的所有对象,可使用模式*.*。

高级特性

变量

psql 提供类似于常见 Unix 命令 shell 的变量替换特性。此特性还比较新 且不太成熟,但将来有扩展它的计划。变量只是名称/值对,其中值可以是任意长度的任意字符串。要设置变量,使用 psql 元命令 \set:

testdb=> \set foo bar

把变量 “foo” 设置为值 “bar”。要获取变量的内容,在名称前加冒号并用作任意斜线命令的参数:

testdb=> \echo :foo
bar

注意

\set 的参数遵循与其他命令相同的替换规则。因此你可以构造有趣的引用,例如 \set :foo 'something',分别得到 Perl 著名的“软链接”或 PHP 著名的“可变变量”。不幸的是(或者幸运的是?), 这些构造没有任何实际用处。另一方面, \set bar :foo 是一种完全合法的复制变量的方法。

如果调用 \set 时不带第二个参数,该变量只是被设置但没有值。要取消设置(或删除)一个变量,使用命令 \unset。

psql 的内部变量名可以 由字母、数字和下划线以任意顺序和任意 数量组成。 A number of regular variables are treated specially by psql. They indicate certain option settings that can be changed at run time by altering the value of the variable or represent some state of the application. Although you can use these variables for any other purpose, this is not recommended, as the program behavior might grow really strange really quickly. By convention, all specially treated variables consist of all upper-case letters (and possibly numbers and underscores). To ensure maximum compatibility in the future, avoid such variables. A list of all specially treated variables follows.

DBNAME

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

ECHO

如果设置为 all,所有输入的或来自脚本的行在解析或执行之前都被写到标准输出。 To specify this on program start-up, use the switch -a. If set to “queries”, psql merely prints all queries as they are sent to the backend. The option for this is -e.

ECHO_HIDDEN

设置了此变量后,当反斜线命令查询数据库时会先显示该查询。这样你就可以研究 PostgreSQL 的内部实现,并在自己的程序中提供类似的功能。如果你把该变量设置为 noexec,查询只被显示而不会真正发送到后端执行。

ENCODING

当前的客户端多字节编码。如果你没有设置为使用多字节字符,此变量将始终包含 SQL_ASCII。

HISTCONTROL

如果此变量设置为 ignorespace, 以空格开头的行不会进入历史列表。如果设置为值 ignoredups,与上一条历史行相同的行不会进入。ignoreboth 值组合这两个选项。如果未设置,或设置为上述值以外的其他值,交互模式下读入的所有行都会保存到历史列表中。

注意

此特性是从 bash 厚颜无耻地抄袭来的。

HISTSIZE

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

注意

这个功能无耻地剽窃自 bash。

HOST

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

IGNOREEOF

如果未设置,向 psql 的交互式会话发送 EOF 字符(通常是 Control D)将终止应用程序。如果设置为数值,则在应用程序终止之前忽略那么多个 EOF 字符。如果该变量已设置但没有数值,默认为 10。

注意

这个功能无耻地剽窃自 bash。

LASTOID

最后被影响的 OID 的值,这可能会由INSERT或者\lo_import命令返回。这个变量只保证在下一个SQL命令的结果被显示完之前有效。

LO_TRANSACTION

如果你使用 PostgreSQL 大 对象接口来专门存储放不进单个元组的数据,所有操作都必须包含在一个事务 块中。(更多信息见大对象接口的文档。)由于 psql 无法 在你调用其内部命令 (\lo_export、\lo_import、 \lo_unlink)之一时判断你是否已有一个正在进行的事务,它必须采取某种任意 操作。该操作可以是回滚可能已在进行的任何事务,或提交任何这样的事务,或什么都不做。在最后一种情况下,你必须提供自己的 BEGIN TRANSACTION/COMMIT 块,否则 结果将是不可预测的(通常导致期望的操作无论如何都不会执行)。

要选择你想做的操作,把此变量设置为 “rollback”、“commit” 或 “nothing” 之一。默认是回滚事务。如果只想加载一个或少数几个对象,这样即可。然而,如果打算传输许多大对象,建议在所有命令周围提供一个显式的事务块。

ON_ERROR_STOP

默认情况下,如果非交互式脚本遇到错误(如格式错误的 SQL 查询或内部元命令),处理会继续。这是 psql 的传统行为,但有时并不理想。如果设置了此变量,脚本处理将立即终止。如果该脚本是从另一个脚本调用的,后者也会以同样的方式终止。如果最外层的脚本不是从交互式 psql 会话调用而是使用 -f 选项调用的,psql 将返回错误码 3,以区别于致命错误情况(错误码 1)。

PORT

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

PROMPT1
PROMPT2
PROMPT3

它们指定 psql 发出的提示符应有的样子。见“提示符”下文。

QUIET

此变量等价于命令行选项 -q。在交互模式下它可能不太有用。

SINGLELINE

此变量由命令行选项 -S 设置。你可以在运行时取消设置或重置它。

SINGLESTEP

此变量等价于命令行选项 -s。

USER

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

SQL Interpolation

psql 变量的另一个有用特性是你可以把它们替换(插值)到常规 SQL 语句中。 The syntax for this is again to prepend the variable name with a colon (:).

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

would then query the table my_table. The value of the variable is copied literally, so it can even contain unbalanced quotes or backslash commands. You must make sure that it makes sense where you put it. Variable interpolation will not be performed into quoted SQL entities.

此功能的一个流行应用是在后续语句中引用最后插入的 OID 来构建外键场景。此机制的另一个可能用法是把文件的内容复制到字段中。先把文件加载到变量中,然后按上述方法进行。

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

此方法的一个可能问题是 my_file.txt 可能包含单引号。需要对这些引号转义,以免在处理第三行时导致语法错误。这可以用程序 sed 完成:

testdb=> \set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\''

注意反斜线的正确个数(6 个)!可以这样理解: psql 解析此行后,把 sed -e "s/'/\\'/g" < my_file.txt 传递给 shell。shell 会在双引号内做自己的处理,并用参数 -e 和 s/'/\\'/g 执行 sed。sed 解析它时会把两个反斜线替换为一个,然后执行替换。也许在某个时候你会觉得所有 Unix 命令都使用 相同的转义字符真是棒极了。而这还没考虑你可能还必须转义所有反斜线,因为 SQL 文本常量同样要经过某些解释。在那种情况下,也许在外部准备好文件更好。

由于冒号可以合法地出现在查询中,因此适用以下规则:如果该变量未设置,字符序列 “冒号+名称”不会被更改。在任何情况下,你都可以用反斜线转义冒号来保护它不被解释。(变量的冒号语法是嵌入式查询语言(如 ecpg)的标准 SQL 语法。数组切片和类型转换的冒号语法是 PostgreSQL 的扩展,因此存在冲突。)

提示符

psql 发出的提示符可以按你的喜好定制。三个变量 PROMPT1、PROMPT2 和 PROMPT3 包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 等待新命令时发出的常规提示符。提示符 2 在命令输入期间期待更多输入时发出,例如因为命令未以分号结束或引号未闭合。提示符 3 在你运行 SQL COPY 命令并需要在终端上输入行值时发出。

相应提示符变量的值按字面打印, 除非遇到百分号(“%”)。 根据下一个字符的不同,会替换为某些其他 文本。已定义的替换有:

%M

数据库服务器的完整主机名(含域名);如果通过 Unix 域套接字连接,则为[local];如果 Unix 域套接字不在编译时指定的默认位置,则为[local:/dir/name]。

%m

数据库服务器的主机名(在第一个点后截断);如果连接通过 Unix 域套接字则为 [local]。

%>

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

%n

你连接时所用的用户名(不是本地系统用户名)。

%/

当前数据库的名称。

%~

类似于 %/,但如果该数据库是你的默认数据库则输出 ~(波浪号)。

%#

如果当前用户是数据库超级用户则为 #,否则为 >。

%R

在提示符 1 中通常是 =,但在单行模式中是 ^,如果会话与数据库断开连接(\connect 失败时可能发生)则是 !。在提示符 2 中该序列被替换为 -、*、单引号或双引号,取决于 psql 是因为命令尚未结束、你在 /* ... */ 注释内,还是你在带引号的字符串内而期待更多输入。

%digits

如果 digits 以 0x 开头,其余字符按十六进制数字解释,并替换为具有相应代码的字符。否则(第一位数字是 0)按八进制数字假设,或按十进制数字。注意写零后跟数字并不保证按八进制解释。

%:name:

psql 变量 name 的值。详见 “变量” 一节。

%`command`

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

To insert a percent sign into your prompt, write %%. The default prompts are equivalent to '%/%R%# ' for prompts 1 and 2, and '>> ' for prompt 3.

注意

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

命令行编辑

psql 支持 Readline 库以方便地进行行编辑和检索。命令历史存储在你的主目录下名为 .psql_history 的文件中,并在 psql 启动时重新加载。也支持制表符补全,尽管补全逻辑并不自称是一个 SQL 解析器。如果由于某种原因你不喜欢制表符补全,可以通过把以下内容放进主目录下名为 .inputrc 的文件来关闭它:

$if psql
set disable-completion on
$endif

(这不是 psql 的特性而是 Readline 的。详细内容请阅读其文档。)

环境

HOME

初始化文件(.psqlrc) 和命令历史文件(.psql_history)所在的目录。

PAGER

如果查询结果无法在屏幕上完整显示,则会通过管道传递给这个命令。典型值为 more 或 less。默认值取决于平台。可以使用 \pset 命令禁用分页器的使用。

PGDATABASE

要连接的默认数据库

PGHOST
PGPORT
PGUSER

默认连接参数。

PSQL_EDITOR
EDITOR
VISUAL

\e命令使用的编辑器。这些变量按列出的顺序检查;使用第一个被设置的变量。

SHELL

被\!命令执行的命令。

TMPDIR

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

文件

  • 启动之前,psql 会尝试读取并执行文件 $HOME/.psqlrc 中的命令。它可用于按喜好设置客户端或服务器(使用 \set 和 SET 命令)。

  • 命令行历史存储在文件 $HOME/.psql_history 中。

注解

  • 在早期,psql 允许单字母反斜线命令的第一个参数直接跟在命令后面,中间没有空白。为了兼容性这一点在一定程度上仍被支持,但我们不打算在这里解释细节,因为不鼓励这种用法。如果你收到奇怪的消息,请记住这一点。例如

    testdb=> \foo
    Field separator is "oo".
    

    这可能不是人们期望的结果。

  • psql 只能与相同版本的服务器顺利配合工作。这并不意味着其他组合会完全失败,但可能出现或微妙或不那么微妙的问题。如果服务器的版本不同,反斜线命令特别容易失败。

  • 在 “copy in”(数据发送到服务器)期间按 Control-C 的行为并不理想。如果你收到类似“COPY state must be terminated first”的消息,只需输入 \c - - 重置连接。

示例

注意

本节只展示几个 psql 特有的例子。如果你想学习 SQL 或熟悉 PostgreSQL,建议阅读文档的教程部分。

第一个例子显示如何把一条查询分布在多行输入上。注意提示符的变化:

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text
testdb-> );
CREATE

现在再看看表定义:

testdb=> \d my_table
             Table "my_table"
 Attribute |  Type   |      Modifier
-----------+---------+--------------------
 first     | integer | not null default 0
 second    | text    |

这时你决定把提示符改成更有意思的 样子:

testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>

假设你已经在表中填入了一些数据,想看一看 它们:

peter@localhost testdb=> SELECT * FROM my_table;
 first | second
-------+--------
     1 | one
     2 | two
     3 | three
     4 | four
(4 rows)

用 \pset 命令可以让这个表 显示成不同的样子:

peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
    1 one
    2 two
    3 three
    4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep ","
Field separator is ",".
peter@localhost testdb=> \pset tuples_only
Showing only tuples.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4

或者,使用简短命令:

peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。