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

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.0 已于 2005 年 5 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

psql

psql — Postgres 的交互式终端

大纲

psql [ options ] [ dbname [ user ] ]

概要

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

描述

连接到数据库

psql 是一个常规的 Postgres 客户端应用程序。 In order to connect to a database you need to know the name of your target database, the hostname and port number of the server and what user name you want to connect as. psql 可以通过命令行选项(即分别为 -d、-h、-p 和 -U)把这些参数告知它。 如果遇到一个不属于任何选项的参数,它将被解释为数据库名(如果数据库名已经给出,则解释为用户名)。 并非所有这些选项都是必需的,会应用默认值。 If you omit the host name psql will connect via a UNIX domain socket to a server on the local host. 默认端口号在编译时确定。由于数据库服务器使用相同的默认值,因此在大多数情况下不必指定端口。 默认用户名是你的 Unix 用户名,默认数据库名也是如此。 请注意,你不能随意以任意用户名连接到任意数据库。数据库管理员应当已经告知你拥有的访问权限。 为了少打一些字,你还可以把环境变量 PGDATABASE、PGHOST、PGPORT 和 PGUSER 设置为适当的值。

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

输入查询

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

$ psql testdb
Welcome to psql, 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 在管理和编写脚本方面很有用的原因。元命令更常被称为斜线或反斜线命令。

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

要在参数中包含空白,必须用单引号把它括起来。要在这类参数中包含单引号,可以在它前面加一个反斜线。单引号中的内容还会进一步做类 C 的替换,即 \n(换行)、\t(制表符)、 \digits, \0digits, and \0xdigits (the character with the given decimal, octal, or hexadecimal code).

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

用反引号(`)括起来的参数被当作传递给 shell 的命令行。命令的输出(去掉末尾的换行符)作为参数值。上述转义序列在反引号中也适用。

有些命令接受一个 SQL 标识符(如表名)作为参数。这些参数遵循 SQL 关于双引号的语法规则:不带双引号的标识符被强制转换为小写。对于所有其他命令,双引号没有特殊含义,会成为参数的一部分。

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

定义了下列元命令:

\a

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

\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 ] ]

建立到一个新数据库和/或以一个用户名的连接。之前的连接被关闭。 If dbname is - the current database name is assumed.

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

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

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

\copy table [ with oids ] { from | to } filename | stdin | stdout [ with delimiters 'characters' ] [ with null as 'string' ]

执行前端(客户端)复制。此操作执行的是一条 SQL COPY 命令, 但不是由后端读取或写入指定的文件(后者因此需要后端访问权限和特殊的用户权限,并且受限于后端可访问的文件系统), 而是由 psql 读取或写入该 文件,并在后端和本地文件系统之间传送数据。

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

提示

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

注意

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

\copyright

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

\d relation

显示关系的所有列(关系可以是表、视图、索引或序列)、它们的类型以及任何特殊属性(如 NOT NULL 或默认值,如果有)。如果该关系实际上是表,任何已定义的索引也会列出。如果该关系是视图,则还显示视图定义。

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

注意

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

\da [ pattern ]

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

\dd [ object ]

显示对象(可以是一个正则表达式)的描述,如果没有给出参数则显示所有对象的描述。 (“Object” covers aggregates, functions, operators, types, relations (tables, views, indices, sequences, large objects), rules, and triggers.) For example:

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

对象的描述可以用 COMMENT ON SQL 命令生成。

注意

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

\df [ pattern ]

列出可用的函数及其参数和返回类型。 If pattern (a regular expression) is specified, only matching functions are shown. If the form \df+ is used, additional information about each function, including language and description is shown.

\distvS [ pattern ]

这不是实际的命令名:字母 i、s、t、v、S 分别代表索引、序列、表、视图和系统表。你可以按任意顺序 指定其中任意个或全部,来获得它们的列表及其 所有者。

如果指定了 pattern,它是一个正则表达式,把列表限制为名称匹配的那些对象。如果在命令名后附加 “+”, 每个对象都会连同其关联的描述(如果有)一起列出。

\dl

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

\do [ name ]

列出可用的操作符及其操作数和返回类型。 如果指定了 name, 则只显示具有该名称的操作符。

\dp [ pattern ]

这是 \z 的别名,因它更具助记性而保留(display permissions,显示权限)。

\dT [ pattern ]

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

\edit (or \e) [ filename ]

如果指定了 filename,则编辑该文件;编辑器退出后,其内容被复制回查询缓冲区。如果没有给出参数,则把当前查询 缓冲区复制到一个临时文件,然后以相同的方式编辑。

新的查询缓冲区随后按照 psql 的正常规则重新解析,即把整个缓冲区当作单行对待。 (Thus you cannot make “scripts” this way, use \i for that.) This means also that if the query ends with (or rather contains) a semicolon, it is immediately executed. In other cases it will merely wait in the query buffer.

提示

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)

列出服务器中的所有数据库及其所有者。向命令名追加 + 还可以看到数据库的任何描述。如果你的 Postgres 安装编译时 带有多字节编码支持,则还会显示每个 数据库的编码方案。

\lo_export loid filename

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

提示

使用 \lo_list 可以查出大对象的 OID。

注意

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

\lo_import filename [ comment ]

把该文件存储为一个 Postgres 大对象。可以选择把给定的注释与该对象关联。 Example:

foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801

The response indicates that the large object received object id 152801 which one ought to remember if one wants to access the object ever again. For that reason it is recommended to always associate a human-readable comment with every object. Those can then be seen with the \lo_list command.

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

注意

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

\lo_list

显示当前存储在数据库中的所有 Postgres 大对象的列表及其所有者。

\lo_unlink loid

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

提示

使用 \lo_list 可以查出大对象的 OID。

注意

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

\o [ {filename | |command} ]

把以后的查询结果保存到文件 filename 中,或把以后的结果通过管道送到一个单独的 Unix shell 去执行 command。 If no arguments are specified, the query output will be reset to stdout.

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

提示

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

\p

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

\pset parameter [ value ]

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

可调整的打印选项有:

format

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

“Unaligned” 把一个元组的所有字段写在一行上,用当前活动的字段分隔符分隔。这用于创建可能要被其他程序读入的输出(制表符分隔、逗号分隔)。 “Aligned” 模式是默认的标准、人类可读、格式良好的文本输出。 The “HTML” and “LaTeX” 模式输出打算用相应标记语言包含进文档中的表。它们不是完整的文档! (This might not be so dramatic in HTML, but in LaTeX you must have a complete document wrapper.)

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'。默认的字段分隔符是 '|'(竖线符号)。

recordsep

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

tuples_only (or t)

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

title [ text ]

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

注意

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

tableattr (or T) [ text ]

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

pager

切换分页器的使用以输出表格。如果设置了环境变量 PAGER,输出将通过管道送到指定的程序。 Otherwise more is used.

无论如何,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 7.0 版起,不再需要保存命令历史,因为程序终止时会自动完成。每次 psql 启动时也会自动加载历史。

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

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

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

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

注意

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

\t

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

\T table_options

允许你指定要放在 HTML 表输出模式的 table 标签中的选项。这条命令 等价于 \pset tableattr table_options。

\w {filename | |command}

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

\x

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

\z [ pattern ]

产生数据库中所有表及其相应访问权限的列表。如果给出参数,它被当作一个正则表达式,只列出匹配它的表。

test=> \z
Access permissions for database "test"
 Relation |           Access permissions
----------+-------------------------------------
 my_table | {"=r","joe=arwR", "group staff=ar"}
(1 row )

这样阅读:

  • "=r":PUBLIC 拥有对该表的读 (SELECT)权限。

  • "joe=arwR": 用户 joe 拥有读、写(UPDATE、DELETE)、追加(INSERT)权限,以及在该表上创建规则的权限。

  • "group staff=ar": 组 staff 拥有 SELECT 和 INSERT 权限。

GRANT 和 REVOKE 命令用于设置访问权限。

\! [ command ]

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

\?

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

命令行选项

如果做了相应配置,psql 既理解标准的 Unix 短选项,也理解 GNU 风格的长选项。后者并非在所有系统上都可用。

-a, --echo-all

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

-A, --no-align

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

-c, --command query

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

query 必须是一个后端完全可解析的查询字符串(即不包含 psql 专有的特性),或者是单个反斜线命令。因此不能用这个选项混合 SQL 和 psql 元命令。要那样做,可以把字符串用管道输送到 psql 中,像这样: echo "\x \\ select * from foo;" | psql.

-d, --dbname dbname

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

-e, --echo-queries

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

-E, --echo-hidden

回显 \d 及其他反斜线命令生成的实际查询。如果你想在自己的程序中包含类似的功能,可以使用它。这等效于在 psql 内部设置变量 ECHO_HIDDEN。

-f, --file filename

使用文件 filename 作为查询来源,而不是交互式地读取查询。该文件处理完后,psql 终止。 This in many ways equivalent to the internal command \i.

使用这个选项与写 psql < filename. 有细微差别。一般来说,两者都会如你期望的那样工作,但使用 -f 会启用一些不错的特性,例如带行号的错误消息。使用这个选项还可能略微降低启动开销。另一方面,使用 shell 输入重定向的变体(理论上)保证产生与你手工输入所有内容时完全相同的输出。

-F, --field-separator separator

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

-h, --host hostname

指定 postmaster 正在运行的主机的主机名。不带此选项时,通信使用本地 Unix 域套接字进行。

-H, --html

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

-l, --list

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

-o, --output filename

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

-p, --port port

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

-P, --pset assignment

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

-q

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

-R, --record-separator separator

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

-s, --single-step

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

-S, --single-line

以单行模式运行,其中换行符与分号一样终止一条查询。

注意

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

-t, --tuples-only

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

-T, --table-attr table_options

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

-u

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

此选项已被废弃,因为它在概念上有缺陷。(提示输入非默认用户名,与因为后端要求而提示输入密码,实际上是两件不同的事情。)建议你改用 -U 和 -W 选项。

-U, --username username

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

-v, --variable, --set assignment

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

-V, --version

显示 psql 的版本。

-W, --password

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

As of version 7.0, psql automatically issues a password prompt whenever the backend requests password authentication. Because this is currently based on a “hack”, the automatic recognition might mysteriously fail, hence this option to force a prompt. 如果没有发出密码提示而后端又要求密码认证,连接尝试将失败。

-x, --expanded

打开扩展行格式模式。这等效于 命令 \x。

-X, --no-psqlrc

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

-?, --help

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

高级特性

变量

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's 的内部变量名可以由字母、数字和下划线以任意顺序、任意数量组成。若干常规变量被 psql. They indicate certain option settings that can be changed at runtime 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

The name of the database you are currently connected to. This is set everytime you connect to a database (including program startup), but can be unset.

ECHO

如果设置为 all,所有输入的或来自脚本的行在解析或执行之前都被写到标准输出。要在程序启动时指定这一点,使用开关 -a。如果设置为 “queries”, psql 只是在所有查询发送到后端时打印它们。 对应的选项是 -e。

ECHO_HIDDEN

设置了此变量后,当反斜线命令查询数据库时会先显示该查询。这样你就可以研究 Postgres 的内部实现,并在自己的程序中提供类似的功能。如果把该 变量设置为值 “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_insert 命令返回。此变量只在下一条 SQL 命令的结果显示之前保证有效。

LO_TRANSACTION

如果你使用 Postgres 大对象接口来专门存储放不进单个元组的数据,所有操作都必须包含在一个事务块中。 (See the documentation of the large object interface for more information.) Since psql has no way to tell if you already have a transaction in progress when you call one of its internal commands \lo_export, \lo_import, \lo_unlink it must take some arbitrary action. This action could either be to roll back any transaction that might already be in progress, or to commit any such transaction, or to do nothing at all. In the last case you must provide your own BEGIN TRANSACTION/COMMIT block or the results will be unpredictable (usually resulting in the desired action's not being performed in any case).

要选择你想做的操作,把此变量设置为 “rollback”, “commit”, or “nothing”. 默认是 to roll back the transaction. If you just want to load one or a few objects this is fine. However, if you intend to transfer many large objects, it might be advisable to provide one explicit transaction block around all commands.

ON_ERROR_STOP

默认情况下,如果非交互式脚本遇到错误(如格式错误的 SQL 查询或内部元命令),处理会继续。这是 psql 的传统行为,但有时并不理想。 如果设置了此变量,脚本处理将立即终止。如果该脚本是从另一个脚本调用的,后者也会以同样的方式终止。 If the outermost script was not called from an interactive psql session but rather using the -f option, psql will return error code 3, to distinguish this case from fatal error conditions (error code 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 语法。数组切片和类型转换的冒号语法是 Postgres 扩展,因此存在冲突。)

提示符

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

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

%M

The full hostname (with domain name) of the database server (or “localhost” if hostname information is not available).

%m

数据库服务器的主机名(在第一个点后截断)。

%>

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

%n

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

%/

当前数据库的名称。

%~

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

%#

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

%R

在提示符 1 中通常是 “=”,单行模式下是 “^”, 会话与数据库断开时(例如 \connect 失败时)是 “!”。在提示符 2 中该序列被替换为 “-”、“*”、单引号或双引号,具体取决于 psql 期待更多输入是因为查询尚未结束、 你在 /* ... */ 注释内,还是你在带引号的字符串内而期待更多输入。在提示符 3 中该序列不解析为任何内容。

%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抄袭过来的。

Miscellaneous

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

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

GNU readline

psql 支持 readline 和 history 库以方便地进行行编辑和历史检索。命令历史保存在你的主目录下名为 .psql_history 的文件中,并在 psql 启动时重新装载。 也支持 Tab 补全,不过补全逻辑并不自称是一个 SQL 解析器。 可用时,psql 会自动构建为使用这些特性。如果由于某种原因你不喜欢 Tab 补全,可以把它关闭, 方法是把以下内容放进你主目录下名为 .inputrc 的文件中:

$if psql
set disable-completion on
$endif

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

如果你安装了 readline 库但 psql 似乎没有使用它,必须确保 Postgres 的顶级 configure 脚本能找到它。 configure 需要同时找到库 libreadline.a (或等价的共享库)以及头文件 readline.h 和 history.h(或 readline/readline.h 和 readline/history.h)。如果 你把库和头文件安装在不常见的地方, 必须把位置告诉 configure,例如:

$ ./configure --with-includes=/opt/gnu/include --with-libs=/opt/gnu/lib  ...

然后你必须重新编译 psql(不一定 要重新编译整个代码树)。

GNU readline 库可以从 GNU 项目的 FTP 服务器 ftp://ftp.gnu.org 获取。

示例

注意

This section only shows a few examples specific to psql. 如果你想学习 SQL 或熟悉 Postgres,可能希望阅读发行版中包含的教程。

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

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    |

At this point you decide to change the prompt to something more interesting:

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)

Notice how the int4 colums in right aligned while the text column in left aligned. You can make this table look differently by using the \pset command.

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

Alternatively, use the short commands:

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

附录

缺陷与问题

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

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

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

  • psql 只与同版本的服务器顺畅配合。 这并不意味着其他组合会立即失败,但可能出现或明显或微妙的问题。

  • 在 copy in(数据发送到服务器)期间按 Control-C 的行为并不理想。 如果你收到类似“PQexec:你必须自己退出 COPY 状态”的消息,只需输入 \c - - 重置连接。

提交更正

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