psql

Name

psql --  PostgreSQL交互式终端

Synopsis

psql [option...] [dbname [username]]

描述

psqlPostgreSQL的一种基于终端的前端。它让你能够交互式地输入查询,把它们发送给PostgreSQL,并且看到查询的结果。此外,输入也可以来自于一个文件。它还提供了一些元命令和多种 shell 风格的特性来协助我们编写代码以及自动进行多种任务。

选项

-a
--echo-all

把所有输入行以它们被读取的形式打印到标准输出。比起交互式模式,这对于脚本处理更有用。这等效于将变量ECHO设置为all

-A
--no-align

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

-c command
--command=command

指定psql执行一个命令字符串command并接着退出。这在 shell 脚本中有用。开始文件(psqlrc~/.psqlrc)会被这个选项忽略掉。

command必须是一个能被服务器完全解析的命令字符串(即它不包含psql-相关的特性)或者是一个单一反斜线命令。因此你不能用这个选项把SQLpsql元命令混合起来。要实现混合,你可以把该字符串用管道导向psql,例如:echo '\x \\ SELECT * FROM foo;' | psql\\是元命令分隔符)。

如果命令字符串包含多个 SQL 名ing,它们会在一个单一事务中处理,除非在字符串中显式地包含有BEGIN/COMMIT命令将它划分成多个事务。这和把同一个字符串喂给psql的标准输入时的行为不同。还有,只有最后一个 SQL 命令的结果会被返回。

由于这些遗留的行为,在-c字符串中放入多于一个命令常常会得到意想不到的结果。最好将多个命令用上述的echo或者这里所说的 shell 喂给psql的标准输入,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF

-d dbname
--dbname=dbname

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

如果这个参数包含一个=符号或者开始于一个合法的URI前缀(postgresql://postgres://),它会被当作一个conninfo字符串。详见Section 31.1.1

-e
--echo-queries

把发送给服务器的所有 SQL 命令也拷贝到标准输出。这等效于设置变量ECHOqueries

-E
--echo-hidden

回显\d以及其他反斜线命令生成的实际查询。你可以用这个选项来学习psql的内部操作。这等效于从psql内部设置变量ECHO_HIDDEN

-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

指定服务器运行的机器的主机名。如果该值以一个斜线开始,则它被用作 Unix 域套接字的目录。

-H
--html

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

-l
--list

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

-L filename
--log-file=filename

除了正常的输出目的地之外,把所有查询输出写入文件filename

-n
--no-readline

不使用readline进行行编辑并且不使用历史。这有助于在剪切和粘贴时关闭 tab 补全。

-o filename
--output=filename

将所有查询输出放入文件filename。这等效于\o命令。

-p port
--port=port

指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认是放在PGPORT环境变量中(如果被设置)的值,否则使用编译在程序中的默认值,通常是 5432。

-P assignment
--pset=assignment

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

-q
--quiet

指定psql应该安静地工作。默认情况下,它会打印欢迎消息和多种输出信息。如果使用了这个选项,这些都不会发生。这个选项和-c选项一起时很有用。在psql内你还可以设置QUIET变量打到同样的效果。

-R separator
--record-separator=separator

使用separator做为未对齐输出的记录分隔符。这等效于\pset recordsep命令。

-s
--single-step

在单步模式中运行。这意味着每个查询在被发送给服务器之前用户都会被提示,用这个选项也可以取消执行。这个选项主要用于调试。

-S
--single-line

运行在单行模式中,这时一个新行会终止一个 SQL 命令,就像分号的作用一样。

Note: 有些人还坚持使用这种模式,但是我们并不鼓励使用它。特别是如果你在一行中混合SQL和元命令,对于没有经验的用户可能总是无法了解执行的顺序。

-t
--tuples-only

关闭打印列名和结果行计数脚注等信息。这等效于\t命令。

-T table_options
--table-attr=table_options

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

-U username
--username=username

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

-v assignment
--set=assignment
--variable=assignment

执行一次变量赋值,就像\set元命令所作的那样。注意,如果有变量名和值,你必须在命令行上用等号分隔它们。要复原一个变量,去掉等号即可。要把一个变量设置为空值,可以保留等号但去掉值。这些赋值在启动的非常早期就会完成,因此为内部目的保留的变量可能会在之后被覆盖。

-V
--version

打印psql版本并退出。

-w
--no-password

从不发出一个口令提示。如果服务器要求口令认证并且没有其他方式提供口令(例如一个.pgpass文件),那儿连接尝试将失败。这个选项对于批处理任务和脚本有用,因为在其中没有一个用户来输入口令。

请注意该选项的设置将在整个会话中都有效,所以它会影响元命令\connect的使用以及初始的连接尝试。

-W
--password

强制psql在连接到一个数据库之前提示要求一个口令。

这个选项从来不是必须的,因为如果服务器要求口令认证,psql将自动提示要求一个口令。但是,psql将浪费一次连接尝试来发现服务器想要一个口令。在某些情况下,值得键入-W来避免额外的连接尝试。

请注意该选项的设置将在整个会话中都有效,所以它会影响元命令\connect的使用以及初始的连接尝试。

-x
--expanded

开启扩展表格式化模式。这等效于\x命令。

-X,
--no-psqlrc

不读取启动文件(不管是系统范围的psqlrc文件或是用户的~/.psqlrc文件)。

-z
--field-separator-zero

将未对齐输出的域分隔符设置为一个零字节。

-0
--record-separator-zero

设置未对齐输出的记录分隔符为一个零字节。这在交互时有用,例如xargs -0

-1
--single-transaction

psql执行一个脚本时,使用这个选项将在脚本的周围包裹上BEGIN/COMMIT来让该脚本在一个单一事务中执行。这确保了要么所有命令成功完成,要么任何修改都不被应用。

如果脚本本身已经使用了BEGINCOMMIT或者ROLLBACK,那么这个选项将不会得到期望的效果。同样, 如果脚本中包含任何不能在事务块中执行的命令,指定这个选项将导致命令失败(并且因此导致整个事务失败)。

-?
--help

显示有关psql命令行参数,并且退出。

退出状态

如果psql正常结束,那么psql向 shell 返回 0,如果自身发生致命错误(例如内存不足、文件未找到), 则返回 1,如果和数据库的连接失效而且会话不是交互的则返回 2,如果脚本中发生错误并且设置了变量ON_ERROR_STOP则返回 3。

用法

连接到一个数据库

psql是一个常规的PostgreSQL客户端应用。为了连接到一个数据库,你需要知道你的目标数据库的名称、主机名以及服务器的端口号,还有你作为哪个用户连接。psql能够通过命令行选项被告知这些参数,即分别是-d-h-p-U。如果找到一个参数不属于任何选项,它将被解释为数据库名称(或者在数据库名已经给定的情况下被解释为用户名)。不是所有这些参数都是必须的,它们都有有用的默认值。如果你忽略主机名,psql将通过一个 Unix 域套接字连接到本地主机上的一个服务器,或者通过 TCP/IP 连接到没有 Unix 域套接字的机器上的localhost。默认端口号则是在编译时决定的。由于数据库服务器使用了相同的默认值,大多数情况下你将不必指端口。默认的用户名是你的 Unix 用户名,默认的数据库名也一样。注意你不能连接任意用户名下的任意数据库,你的数据库管理员应该已经告知过你你的访问权利。

如果默认值不太正确,那么你可以通过设置环境变量PGDATABASEPGHOSTPGPORT和/或者PGUSER为合适的值来节省输入(额外的环境变量见Section 31.14)。用一个~/.pgpass文件来避免常规必须输入的口令也很方便。详见Section 31.15

指定连接参数的另一种方法是在一个conninfo字符串或是一个URI中,这被用来代替一个数据库名。这种机制让你能对连接进行非常广泛的控制。例如:

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

Section 31.17中描述的一样,也可以使用LDAP来查找连接参数。关于所有可用的连接选项可参考Section 31.1.2.

如果因为任何原因而无法建立连接(例如权限不够、服务器没有在目标主机上运行等),psql将返回一个错误并终止。

如果至少一个标准输入或标准输出是一个终端,那么psql会设置客户端编码为"auto",这将从区域设置(Unix 系统上的LC_CTYPE环境变量)中检测合适的客户端编码。如果这无法得到想要的效果,客户端编码可以通过环境变量PGCLIENTENCODING覆盖。

输入 SQL 命令

在普通操作中,psql提供一个带有当前连接的数据库名后面跟上字符串=>的提示符。例如:

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

testdb=>

用户可以在这个提示符下键入SQL命令。通常,输入行将到达一个命令终止的分号时被发送到服务器。 一行的结束并不表示命令的终止。因此为了清晰,命令可以跨越好几行。如果命令被发送出去并且执行没有错误,命令的结果会被显示在屏幕上。

当命令正在被执行时,psql同样还轮询由LISTENNOTIFY生成的异步通知事件。

元命令

你在psql中输入的任何以一个未引用反斜线开头的东西都是psql元命令,这些命令将由psql自己处理。这些命令也让psql有助于管理或编写脚本。元命令也常被称作斜线或反斜线命令。

一个psql命令的格式是反斜线后面紧跟一个命令动词,然后是任意参数。参数与命令动词和其它参数之间以任意个空白字符分隔。

要在一个参数中包括空白,你可以把它放在单引号中。要在一个参数中包括一个单引号,在单引号引用的本文中写两个单引号。任何包含在单引号中的东西都会被进一步进行类似 C 语言的替换: \n(新行)、\t(制表符)、 \b(退格)、\r(回车)、 \f(换页)、 \digits(八进制)以及 \xdigits(十六进制)。 在单引号引用的文本中出现在任何其他字符之前的一个反斜线引用那个单一字符,不管该字符是什么。

在一个参数中,被封闭在反引号(`)中的文本被作为一个传递给 shell 的命令。该命令的输出(移除了任何尾部的新行)会替换反引文本。

如果在一个参数中出现一个未引用冒号(:)后面跟着一个psql变量名,如SQL 代入中所述它会被该变量的值替换。

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

对参数的解析在行的末尾或者找到另一个未引用的反斜线时停止。一个未引用的反斜线会被认为是一个新的元命令的开始。特殊的序列\\(两个反斜线)标记参数的末尾并将继续解析SQL命令(如果还有)。这样SQLpsql命令可以在一行中自由混合。但是在任何情况下,一条元命令的参数不能延续超过行尾。

psql中定义了下列元命令:

\a

如果目前的表格输出格式是未对齐,它会切换成对齐。如果是对齐的,则切换成未对齐。这个命令是为了保持向后兼容。更一般化的解决方案可见\pset

\c或者\connect [ dbname [ username ] [ host ] [ port ] ]

建立一个到PostgreSQL服务器的新连接。如果新连接被成功建立,之前的连接将被关闭。如果dbnameusernamehostport被忽略或被指定为-,将使用之前连接的值。如果之前没有连接,将使用该参数的libpq默认值。

如果连接尝试失败(错误的用户名、访问被拒绝等),那么只有psql处于交互模式时才将保留前面的连接。当运行一个非交互脚本时,处理将立即停止并返回一个错误。选择这样的区别一方面是为便于用户避免笔误,另一方面也是一种安全机制保证脚本不会碰巧在错误的数据库上执行。

\C [ title ]

把正在打印的任何表格的标题设置为一个查询的结果或者取消这样的设置。这条命令等效于\pset title title(这条命令的名称源于"caption", 因为它以前只被用来设置一个HTML表格中的标题)。

\cd [ directory ]

把当前工作目录改为directory。没有参数则改为当前用户的主目录。

Tip: 要打印你的当前工作目录,可使用\! pwd

\conninfo

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

\copy { table [ ( column_list ) ] | ( query ) } { from | to } { 'filename' | program 'command' | stdin | stdout | pstdin | pstdout } [ [ with ] ( option [, ...] ) ]

执行一次前端(客户端)拷贝。这是一个运行SQL COPY命令的操作,不同之处在于读写指定文件的是服务器,而psql读写该文件并且在服务器和本地文件系统之间传送数据。这意味着文件可访问性和权限都是本地用户而不是服务器的,因此不需要 SQL 超级用户权限。

当指定了program时,command会被psql执行并且来自或者去向command的数据被在服务器和客户端之间传送。这意味着执行权限是本地用户而不是服务器的,因此不需要 SQL 超级用户权限。

\copy ... from stdin | to stdout分别基于该命令的输入和输出进行读/写。所有行都从发出命令的同一个源读取,直到读到\.或者流达到EOF。输出被发送到和命令输出相同的位置。要从psql的标准输入或者输出读/写,可以使用pstdin或者pstdout。这个选项有助于在一个 SQL 脚本文件中嵌入填充表的动作。

该命令的语法类似于SQL COPY命令,并且option必须指示SQL COPY命令的选项之一。注意正因为这样,对\copy命令会应用特殊的解析规则。尤其是变量替换规则和反斜线转义不适合\copy

Tip: 此操作不如SQL COPY命令高效,因为所有数据必须通过客户端/服务器连接。对于大数据量,SQL命令更好。

\copyright

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

\d[S+] [ pattern ]

对于每个匹配pattern的关系(表、视图、索引、序列或者外部表)或者组合类型,显示所有列、它们的类型、表空间(如果不是默认表空间)和任何特殊属性(诸如NOT NULL或默认值)。相关的索引、约束、规则和触发器也会被显示。对于外部表,相关的外部服务器也会被显示("匹配模式"被定义在下文的模式中)。

对于一些类型的关系,\d为每一列显示额外的信息:序列的列值、索引的被索引表达式以及外部表的外部数据包装器选项。

命令形式\d+是同样的,不过会显示更多信息:任何与该表列相关的注释也会被显示,还有表中是否出现 OID,如果关系是一个视图还会显示视图的定义。

默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

Note: 如果没有为\d使用一个pattern参数,它就等效于\dtvsE,这将显示显示一个所有可见表、视图、序列和外部表的列表。这纯粹是一种便利措施。

\da[S] [ pattern ]

列举聚集函数,以及它们的返回类型和它们所操作的数据类型。如果指定了pattern,只有名称匹配该模式的聚集会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

\db[+] [ pattern ]

列出表空间。如果指定了pattern,只有名称匹配该模式的表空间会被显示。如果在命令名称后追加了+,还会为每个对象列出其相关权限。

\dc[S+] [ pattern ]

列出字符集编码之间的转换。如果指定了pattern,只有名称匹配该模式的转换会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。如果在命令名称后追加了+,还会为每个对象列出其相关的描述。

\dC[+] [ pattern ]

列出类型造型。如果指定了pattern,只有源类型或目标类型匹配该模式的造型会被显示。如果在命令名称后追加了+,还会为每个对象列出其相关的描述。

\dd[S] [ pattern ]

显示类型为constraintoperator classoperator familyruletrigger的对象的描述。所有其他注释可以用那些对象类型的相应反斜线命令查看。

\dd显示匹配pattern的对象的描述,如果没有给定参数则显示合适类型的可见对象。但是在两种情况下,都只会列出有一个描述的对象。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

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

\ddp [ pattern ]

列出默认的访问特权设置。为每一个其默认特权设置已经被改得与内建默认值不同的角色(以及模式,如果适用)显示一项。如果指定了pattern,只有角色名或模式名匹配该模式的项会被显示。

ALTER DEFAULT PRIVILEGES命令被用来设置默认的访问特权。所显示特权的含义在GRANT中解释。

\dD[S+] [ pattern ]

列出域。如果指定了pattern,只有名称匹配该模式的域会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。如果在命令名称后追加了+,还会为每个对象列出其相关的权限和描述。

\dE[S+] [ pattern ]
\di[S+] [ pattern ]
\dm[S+] [ pattern ]
\ds[S+] [ pattern ]
\dt[S+] [ pattern ]
\dv[S+] [ pattern ]

在这一组命令中,字母Eimst以及v分别表示外部表、索引、物化视图、序列、表和视图。你可以用任何顺序指定任意或者所有这些字母来获得一个这些类型对象的列表。例如,\dit会列出索引和表。如果在命令名称后追加了+,还会为每个对象列出其在磁盘上的物理尺寸以及其相关的描述(如果有)。如果指定了pattern,只有名称匹配该模式的对象会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

\des[+] [ pattern ]

列出外部服务器。如果指定了pattern,只有名称匹配该模式的服务器会被列出。如果使用了形式\des+,将显示每个服务器的完整描述,包括该服务器的 ACL、类型、版本、选项和描述。

\det[+] [ pattern ]

列出外部表。如果指定了pattern,只有表名或模式名匹配该模式的项会被显示。如果使用了形式\det+,通用选项和外部表的描述也会被显示。

\deu[+] [ pattern ]

列出用户映射(助记:"外部用户")。如果指定了pattern,只有用户名匹配该模式的映射会被显示。如果使用了形式\deu+,还会显示关于每个映射的额外信息。

Caution

\deu+可能也会显示远程用户的用户名和口令,因此当心不要泄露它们。

\dew[+] [ pattern ]

列出外部数据包装器(助记:"外部包装器")。如果指定了pattern,只有名称匹配该模式的外部数据包装器会被显示。如果使用了形式\dew+,外部数据包装器的 ACL、选项和描述也会被显示。

\df[antwS+] [ pattern ]

列出函数和它们的参数、返回类型和函数类型,函数类型被分成"agg"(聚集)、 "normal""trigger""window"。要只显示指定类型的函数,在该命令中加入相应的字母antw。如果指定了pattern,只有名称匹配该模式的函数会被显示。如果使用了形式\df+,每个函数的额外信息也会被显示,包括安全性、易变性、源代码和描述。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

Tip: 要查看采用指定类型的参数或返回值的函数,可以使用你的显示工具的搜索功能在\df输出中滚动。

\dF[+] [ pattern ]

列出文本搜索配置。如果指定了pattern,只有名称匹配该模式的配置会被显示。如果使用了形式\dF+,将显示每一种配置的完整描述,包括底层的文本搜索解析器以及用于每一种解析器记号类型的词典列表。

\dFd[+] [ pattern ]

列出文本搜索词典。如果指定了pattern,只有名称匹配该模式的词典会被显示。如果使用了形式\dFd+,将显示关于每一个选中词典的额外信息,包括底层的文本搜索模板和选项值。

\dFp[+] [ pattern ]

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

\dFt[+] [ pattern ]

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

\dg[+] [ pattern ]

列出数据库角色(由于"users""groups"的概念已经被统一成了"roles",这个命令等效于\du)。如果指定了pattern,只有名称匹配该模式的那些角色会被显示。如果使用了形式\dg+,将显示有关每个角色的额外信息,当前这会为每个角色增加注释。

\dl

这是\lo_list的一个别名,它会显示一个大对象的列表。

\dL[S+] [ pattern ]

列出过程语言。如果指定了pattern,只有名称匹配该模式的语言会被列出。默认情况下,只有用户创建的语言被显示;提供S修饰符可以包括系统对象。如果在命令名称后追加了+,还会为每种语言列出其调用句柄、验证器、访问特权以及它是否为系统对象。

\dn[S+] [ pattern ]

列出模式(命名空间)。如果指定了pattern,只有名称匹配该模式的模式会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。如果在命令名称后追加了+,还会为每个对象列出其相关的权限和描述(如果有)。

\do[S] [ pattern ]

列出操作符以及它们的操作数和返回类型。如果指定了pattern,只有名称匹配该模式的操作符会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

\dO[S+] [ pattern ]

列出排序规则。如果指定了pattern,只有名称匹配该模式的排序规则会被显示。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。如果在命令名称后追加了+,还会为每种排序规则列出其相关的描述(如果有)。注意只有当前数据库编码可用的排序规则才会被显示,因此同一安装的不同数据库中的结果可能不同。

\dp [ pattern ]

列出表、视图和序列及其相关的访问特权。如果指定了pattern,只有名称匹配该模式的表、视图和序列会被列出。

GRANTREVOKE命令被用于设置访问特权。显示的特权在GRANT中解释。

\drds [ role-pattern [ database-pattern ] ]

列出已定义的配置设置。这些设置可以是角色相关的、数据库相关的或两者都相关的。role-pattern以及database-pattern分别被用来选择特定的角色和数据库到列表中。如果被忽略,或者指定了*,所有的设置都会被列出,分别包括非角色相关或非数据库相关的。

ALTER ROLEALTER DATABASE命令被用来定义针对每个角色和每个数据库的配置设置。

\dT[S+] [ pattern ]

列出数据类型。如果指定了pattern,只有名称匹配该模式的类型会被列出。如果在命令名称后追加了+,还会为每种类型列出其内部名称和尺寸、它的允许值(如果它是一个enum类型)及其相关的权限。默认情况下,只有用户创建的对象被显示;提供一个模式或者S修饰符可以包括系统对象。

\du[+] [ pattern ]

列出数据库角色(因为"users""groups"的概念已经被统一成了"roles",这个命令现在等效于\dg)。如果指定了pattern,只有名称匹配该模式的那些角色会被显示。如果使用了形式\du+,将显示有关每个角色的额外信息,当前这会为每个角色增加注释。

\dx[+] [ pattern ]

列出已安装的扩展。如果指定了pattern,只有名称匹配该模式的那些扩展会被列出。如果使用了形式\dx+,所有属于每个匹配扩展的对象都会被列出。

\dy[+] [ pattern ]

列出事件触发器。如果指定了pattern,只有名称匹配该模式的那些数据触发器会被列出。如果在命令名称后追加了+,还会为每个对象列出其相关的描述。

\e或者\edit [ filename ] [ line_number ]

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

新的查询缓冲区接着被根据psql的一般规则再解析,这里整个缓冲区被当做一个单一行(因此你不能用这种方式制作脚本。要制作脚本可使用\i)。这意味着如果查询以一个分号结束(或者包含一个分号),它会立即被执行。否则它将仅仅在查询缓冲区中等待,键入分号或\g可以发送它,或者键入\r取消之。

如果指定了一个行号,psql将把游标定位在文件或查询缓冲区的指定行上。注意如果给出了一个单一的全为数字的参数,psql会假定它是一个行号而不是一个文件名。

Tip: 如何配置或自定义你的编辑器可参考环境

\echo text [ ... ]

把参数打印到标准输出,用一个空格分隔并且最后跟一个新行。这可以用于脚本输出中的散布信息。例如:

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

如果第一个参数是一个未引用的-n,不会有拖尾的新行。

Tip: 如果你使用\o命令来重定向你的查询输出,你可能希望用\qecho来取代这个命令。

\ef [ function_description [ line_number ] ]

这个命令以一个CREATE OR REPLACE FUNCTION命令的形式取得并且编辑命名函数的定义。编辑以\edit相同的方式完成。在编辑器退出后,被更新的命令会等在查询缓冲区中。输入分号或\g可以发送它,或者输入\r来取消它。

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

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

如果指定了一个行号,psql将把游标定位在函数体的指定行上(注意函数体通常不是从该文件的第一行开始)。

Tip: 如何配置和自定义你的编辑器可参考环境

\encoding [ encoding ]

设置客户端字符集编码。如果没有参数,这个命令会显示当前的编码。

\f [ string ]

为未对齐的查询输出设置域分隔符。默认值是竖线(|)。设置输出选项的一种通用方法还可参见\pset

\g [ { filename | |command } ]

把当前查询输入缓冲区发送到服务器并且可选地存储查询输出在filename中或者把输出用管道传输到一个单独的 Unix shell 中来执行command。只有该查询成功地返回零个或多个元组才会写该文件或命令,而查询失败或者是一个非数据返回 SQL 命令的则不会写该文件或命令。

一个裸的\g本质上等效于一个分号。一个带参数的\g\o命令的一个"one-shot"替换方案。

\gset [ prefix ]

把当前查询输入缓冲区发送到服务器并且可选地存储查询输出在psql变量中(见变量)。要被执行的查询必须正好返回一行。该行的每一列被存储到一个单独的变量,该变量按照列命名。例如:

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset
=> \echo :var1 :var2
hello 10

如果你指定了一个prefix,该字符串是为查询的列名创建变量名而预先准备的:

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset result_
=> \echo :result_var1 :result_var2
hello 10

如果一个列结果是 NULL,对应的变量会被重置而不是被设置。

如果查询失败或者不返回一行,没有变量会被改变。

\h或者\help [ command ]

给出指定的SQL命令的语法帮助。如果没有指定command,那么psql将列出所有语法帮助可用的命令。如果command是一个星号(*),那么所有SQL命令的语法帮助都会被显示。

Note: 为了简化录入,由多个词组成的命令不需要被引用。因此录入\help alter table就没有问题。

\H

打开HTML查询输出格式。如果HTML格式已经打开,它会被切换回默认的对齐文本格式。这个命令是为了兼容性和方便性而存在的,有关设置其他输出选项可见\pset

\i filename

从文件filename读取输入并且执行它,就好像它是从键盘输入的一样。

Note: 如果你想要在屏幕上看见行被读入的样子,你必须设置变量ECHOall

\ir filename

\ir命令类似于\i,但是不同的是会解析相对文件名。在交互模式中执行时,两种命令的行为是相同的。不过,在从一个脚本中调用时,\ir会相对于脚本被找到的目录而不是当前工作目录解释文件名。

\l[+]或者\list[+] [ pattern ]

列出服务器中的数据库并且显示它们的名称、拥有者、字符集编码以及访问特权。如果指定了pattern,只有名称匹配该模式的数据库被列出。如果在命令名称后追加了+,还会显示数据库尺寸、默认表空间和描述(只有当前用户能够连接的数据库的尺寸信息才可用)。

\lo_export loid filename

从服务器读取OID loid所对应的大对象并且将它写到filename中。注意这和服务器函数lo_export略有不同,该服务器函数使用运行数据库服务器的那个用户的权限操作,并且它会在服务器文件系统上操作。

Tip: 使用\lo_list来找出该大对象的OID

\lo_import filename [ comment ]

将文件存储到一个PostgreSQL大对象中。可选地,它能把一段给定注释关联到该对象。例如:

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

该响应指出大对象接收到了对象 ID 152801,这可以被用来访问未来新创建的大对象。为了阅读方便,我们推荐总是为每一个兑现关联一段人类可读的注释。OID 和注释都能用\lo_list命令查看。

注意这个命令与服务器端的lo_import略有不同,因为它会作为本地用户在本地文件系统上操作,而不是作为服务器用户在服务器文件系统上操作。

\lo_list

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

\lo_unlink loid

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

Tip: 使用\lo_list来找出该大对象的OID

\o [ {filename | |command} ]

保存未来的查询结果到文件filename中或者将未来的结果用管道导入一个单独的 Unix shell 来执行command。如果没有指定参数,查询输出将被重置到标准输出。

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

Tip: 要把文本输出散布在查询结果之间,可使用\qecho

\p

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

\password [ username ]

更改指定用户(默认指当前用户)的口令。这个命令会提示要求新口令、加密它并且把它作为一个ALTER ROLE命令发送到服务器。这确保了新口令不会以明文出现在命令历史、服务器日志或其他地方。

\prompt [ text ] name

提示用户提供文本,这会被赋值给变量name。可以指定一个可选的提示字符串text(对于多个词的提示要在文本周围包围上单引号)。

默认情况下,\prompt使用终端用于输入和输出。不过,如果-f命令行开关会被使用,\prompt会使用标准输入和标准输出。

\pset option [ value ]

这个命令设置影响查询结果表输出的选项。option指出要设置哪个选项。value的语义根据选中的选项变化。对于一些选项,忽略value会导致该选项被切换或者重设,具体如特定选项中所述。如果没有提到这样的行为,那么忽略value只会导致当前设置被显示。

可调整的打印选项是:

border

value必须是一个数字。通常,数字越大表格将具有更多边界和线条,但是这取决于具体的格式。在HTML格式中,这将直接翻译成border=...属性,在其他格式中只有值 0(无边界)、1(内部划分线)和2(表格边框)有意义。latexlatex-longtable也支持一个border值 3,它会在每行之间增加一条划分线。

columns

wrapped格式设置目标宽度,并且也设置宽度限制,该限制用来决定是否输出足够宽到要求页面控制器或者需要切换到扩展自动模式中的垂直显示。零(默认值)导致目标宽度被环境变量COLUMNS控制,如果没有设置COLUMNS则目标宽度是检测到的屏幕宽度。此外,如果columns为零则wrapped格式只影响屏幕输出。如果columns为非零则文件和管道输出也被包裹成该宽度。

expanded (或者 x)

如果value被指定,它必须是onoff,它们将启用或者禁用扩展模式,还可以指定为auto。如果value被忽略,该命令将在 on 和 off 设置之间切换。当扩展模式被启用时,查询结果会被显示在两列中,列名在左并且数据在右。如果数据无法在普通的"水平"模式中适应屏幕,这种模式就可以发挥作用。在自动设置中,只要查询输出比屏幕宽,就会使用扩展模式,否则将使用常规模式。自动设置只在对齐和包裹格式中有效。在其他格式中,它的行为总是和关闭了扩展模式时一样。

fieldsep

指定要用在未对齐输出格式中的域分隔符。例如,这种方式可以创建制表符或逗号分隔的输出,这样其他程序可能更喜欢。要把域分隔符设置为一个制表符,可以输入\pset fieldsep '\t'。默认的域分隔符是'|'(一个竖线)。

fieldsep_zero

设置用在未对齐输出格式中的域分隔符为一个零字节。

footer

如果value被指定,它必须是onoff,它会启用或禁用表格页脚的显示((n rows)计数)。如果value被忽略,该命令会切换页脚显示为 on 或 off。

format

设置输出格式为unalignedalignedwrappedhtmllatex(使用tabular)、 latex-longtabletroff-ms之一。允许唯一缩写(亦即只需一个字母)。

unaligned格式把一行的所有列写在一行上,之间用当前活动的域分隔符分隔。这对于创建准备让其他程序读取的输出有用(例如,制表符分隔或逗号分隔格式)。

aligned格式是标准的、人类可读的、精细格式化的文本输出,这是默认值。

wrapped格式与aligned相似,但是会把宽数据值包装成跨行显示来让输出适合目标列宽度。目标宽度按照下文描述的columns选项决定。注意psql将不会尝试包装列头的标题,因此如果列头所需的总宽度超过目标宽度,wrapped格式的行为与aligned相同。

htmllatexlatex-longtabletroff-ms格式把表格输出成可以放在使用相应标记语言的文档中的形式。它们不是完整的文档!这在HTML中可能不是必需的,但是在LaTeX中你必须有一个完整的文档包装器。latex-longtable也要求LaTeX longtablebooktabs包。

linestyle

设置边界线的绘制风格为asciiold-asciiunicode之一。允许唯一的缩写(亦即只需要一个字母)。默认设置是ascii。这个选项只影响alignedwrapped输出格式。

ascii风格使用纯ASCII字符。数据中的新行使用右手空白中的一个+符号显示。当wrapped格式把输出从一行包装成不带一个新行字符的下一行时,会在第一行的左手空白中显示一个点(.),并且在接下来的行的左手空白中继续。

old-ascii风格使用纯ASCII字符,使用PostgreSQL 8.4 及以前的版本中的格式化风格。数据中的新行使用一个:符号代替左手列分隔符。当数据被从一行包装成不带一个新行字符的下一行时,一个;符号被用来取代左手列分隔符。

unicode风格使用 Unicode 方框绘制字符。数据中的新行使用右手空白中的一个回车符号显示。当数据被从一行包装成不带一个新行字符的下一行时,会在第一行的右手空白中显示一个省略符,并且在接下来的行的左手空白中继续。

border设置大于零时,这个选项也决定用什么字符绘制边界线。纯ASCII字符在各处都可用,但是 Unicode 字符在识别它们的显示上看起来更好。

null

设置要被打印用来取代空值的字符串。默认值是什么都不打印,但这很容易与一个空字符串搞混。例如,有人可能更喜欢\pset null '(null)'

numericlocale

如果value被指定,它必须是onoff,它将启用或禁用显示一个区域相关的字符来分隔数字组和十进制标记的左部。如果value被忽略,该命令会在常规输出和区域相关的数字输出之间切换。

pager

控制用于查询和psql帮助输出的一个页面控制器程序的使用。如果环境变量PAGER被设置,输出会被用管道导入到指定的程序。否则将会使用一个平台相关的默认值(例如more)。

pager选项是off时,页面控制器程序不会被使用。当pager选项是on时,会在适当的时候使用该页面控制器,即当输出是输出到终端且不适合屏幕时。pager选项也能被设置为always,它会导致该页面控制器被用于所有终端输出,而不管它是否适合屏幕。不带一个value\pset pager会切换页面控制器的使用为 on 或 off。

recordsep

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

recordsep_zero

设置要用在未对齐输出格式中的记录分隔符为一个零字节。

tableattr(或T

HTML格式中,这会指定要被放在table标签中的属性。例如这可以是cellpaddingbgcolor。注意你可能不想在这里指定border,因为那已经有\pset border负责了。如果没有给出value,表格属性会被重置。

latex-longtable格式中,这会控制每一个包含左对齐数据类型的列所占的宽度比例。它被指定成一个空白分隔的值列表,例如'0.2 0.2 0.6'。未指定的输出列将使用最后一个指定值。

title

为任何后续打印的表格设置表格标题。这可以被用来给出你的输出描述标签。如果没有给出value,标题会被重置。

tuples_only(或者 t

如果value被指定,它必须是onoff,它们将启用或禁用仅元组模式。如果value被忽略,该命令会在常规输出和仅元组输出之间切换。常规输出包括诸如列头、标题和多种页脚在内的额外信息。在仅元组模式中,只显示实际的表格数据。

这些不同的格式外观的展示可以见例子节。

Tip: 有多种\pset的快捷命令。见 \a\C\H\t\T以及\x

Note: 调用不带任何参数的\pset是一种错误。在未来,这种情况可能显示所有打印选项的当前状态。

\q或者\quit

退出psql程序。在一个脚本文件中,只有该脚本的执行会被终止。

\qecho text [ ... ]

这个命令与\echo一样,不过输出将被写出到\o设置的查询输出通道。

\r

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

\s [ filename ]

打印或保存命令行历史到filename中。如果filename被忽略,历史会被写到标准输出。这个选项只有psql被配置为使用GNU Readline库时才可用。

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

设置psql变量namevalue,或者在给出多于一个值时设置为所有值的串接。如果只给出了一个参数,边讲将用一个空值设置。要重置一个变量,使用\unset命令。

不带任何参数的\set显示所有当前设置的psql变量的名称和值。

可用的变量名称能够包含字母、数字和下划线。详见变量。变量名是大小写敏感的。

尽管我们欢迎你把任何变量设置为任何你想要的东西,psql会把多个变量当作特殊的。它们在有关变量的小节中记录。

Note: 这个命令与SQL命令SET无关。

\setenv [ name [ value ] ]

设置环境变量namevalue,或者在没有提供value时重设环境变量。例如:

testdb=> \setenv PAGER less
testdb=> \setenv LESS -imx4F

\sf[+] function_description

这个命令取出并且以一个CREATE OR REPLACE FUNCTION命令的形式显示该命名函数的定义。该定义被打印到\o设置的当前查询输出通道。

目标函数能用名称单独指定,也可以用名称和参数指定,例如foo(integer, text)。如果同一个名称有多于一个函数,必须给出参数类型。

如果+被追加到命令名称,那么输出行会被编号,函数体的第一行开始于行号 1。

\t

切换输出列名称标题以及行计数页脚的显示。这个命令等效于\pset tuples_only并且是为了便利而提供。

\T table_options

指定HTML输出格式中table标签内要被替换的属性。这个命令等效于\pset tableattr table_options

\timing [ on | off ]

没有参数时,切换显示还是不显示每个 SQL 语句的执行时间,以毫秒计。有参数则按参数设置。

\unset name

重设(删除)psql变量name

\w filename
\w |command

把当前查询缓冲区输出到文件filename或是用管道导到 Unix 命令command

\watch [ seconds ]

反复执行当前的查询缓冲区(像\g)直到被打断或查询失败。在两次执行之间等待指定的秒数(默认为 2 秒)。

\x [ on | off | auto ]

设置或切换扩展表格格式化模式。这样它等效于\pset expanded

\z [ pattern ]

列出表格、视图和序列及它们相关的访问特权。如果指定了一个pattern,只有名称匹配该模式的表、视图和序列会被列出。

这是\dp的一个别名("显示特权")。

\! [ command ]

转义为一个独立的 Unix shell 或者执行 Unix 命令command。参数不会被进一步解释,shell 将看到它们原来的样子。特别地,变量替换规则和反斜线转义不适用。

\?

显示有关反斜线命令的帮助信息。

模式

多种\d命令接受一个pattern参数来指定要被显示的对象名称。在最简单的情况中,一个模式就是一个对象的准确名称。一个模式内的字符通常会被折叠成小写形式,就像 SQL 名称中的字符一样,例如\dt FOO将显示名为foo的表。就像在 SQL 名称中那样,在一个模式周围放置双引号将会停止折叠成小写形式。如果你需要在一个模式中包括一个真正的双引号字符,将它写成在双引号序列中的一对双引号,这符合 SQL 引用标识符的规则。例如,\dt "FOO""BAR"将显示名为FOO"BAR(而非foo"bar)的表。与 SQL 名称的一般规则不同,你可以在一个模式的一部分周围放上双引号,例如\dt FOO"FOO"BAR将显示名为fooFOObar的表。

只要pattern参数被完全忽略,\d命令显示在当前模式搜索路径中可见的所有对象 — 这等效于使用*作为模式(如果一个对象所属的模式在搜索路径中并且在搜索路径中没有同类型同名称的对象位于它之前,该对象被称为是可见的。这等效于用不带显式模式限定语句引用对象的语句)。要查看数据库中的所有对象而不管其可见性,可以使用*.*作为模式。

在一个模式中,*可以匹配任何字符序列(包括没有字符)并且?匹配任何单个字符(这种记号可以与 Unix shell 文件名模式相比)。例如,\dt int*显示名称以int开始的表。但是在双引号中,*?会失去这些特殊含义并且只是按其字面匹配。

包含一个点(.)的模式被解释为一个模式(Schema)名模式(Pattern)后面跟上一个对象名模式。例如,\dt foo*.*bar*显示在模式名称以foo开始的模式中名称包括bar的所有表。当不出现点号时,那么该模式只匹配在当前模式搜索路径中可见的对象。同样,在双引号内的点号会失去其特殊含义并且只是按其字面匹配。

高级用户可以使用正则表达式记号法(如字符类),例如[0-9]用来匹配任意数字。所有正则表达式特殊字符按照Section 9.7.3中指定的方式工作,不过对于前面提到的被当做一个分隔符的.*被翻译成正则表达式记号.*?被翻译成.并且$会按字面意思匹配。你可以在需要时通过书写下面的形式来模拟这些模式字符: ?用于.(R+|)用于 R*,或者 (R|)用于 R?$不需要作为一个正则表达式字符,因为该模式必须匹配整个名称,这与通常的正则表达式解释不通(换句话说,$会被自动追加到你的模式中)。如果你不希望该模式被固定,在开头或结尾写上*。注意在双引号内,所有正则表达式特殊字符都会失去它们的特殊含义并且只是按其字面匹配。还有,在操作符名称模式中,正则表达式特殊字符按其字面匹配(即\do的参数)。

高级特性

变量

psql提供类似于普通 Unix 命令 shell 的变量替换特性。变量是简单的名称/值对,这里值可以是任何长度的任何字符串。名称必须由字母(包括非拉丁字母)、数字和下划线组成。

要设置一个变量,可以使用psql元命令\set。例如,

testdb=> \set foo bar

设置变量foo为值bar。要检索该变量的内容,只需要在变量名前面加上一个冒号,例如:

testdb=> \echo :foo
bar

这可以用在常规的 SQL 命令和元命令中。更多细节请参考下文的SQL 代入

如果调用\set时没有第二个参数,变量会被设置为一个空字符串。要重设(即删除)一个变量,可使用命令\unset。要显示所有变量的值,可以在调用\set时不带任何参数。

Note: \set的参数正如其他命令一样服从相同的替换规则。因此你可以构造有趣的引用(例如\set :foo 'something')和PerlPHP"软链接""可变变量variable variables"。不幸地是(或者幸运地是),没有办法用这些结构做任何有用的事情。在另一方面,\set bar :foo是一种完美复制变量的可用方法。

许多这种变量会被psql特别地对待。它们表示特定的选项设置(这些设置可以在运行时通过修改变量的值来改变)或者在某些情况下表示psql的可变状态。尽管你可以把这些变量用于其他目的,但我们不推荐这样做,因为程序行为可能会发展得很奇怪很快。按照惯例,所有特殊对待的变量名由所有大写 ASCII 字母(并且可能有数字和下划线)组成。要保证未来的最大兼容性,应该避免将这种变量名用于你自己的目的。下面是所有被特殊对待的变量列表。

AUTOCOMMIT

设置为on(默认值)时,每一个 SQL 命令会在成功结束后被自动提交。要在这种模式中推迟提交,你必须输入一个BEGINSTART TRANSACTION SQL 命令。被设置为off或被重置时,SQL 命令将不会被提交,直到你显式地发出COMMITEND。自动提交关闭模式通过在任何命令之前为你发出一个隐式BEGIN来工作,该命令不能已经在一个事务块中并且自身不是一个BEGIN或者其他事务控制命令,该命令也不能是一个不允许在一个事务块中执行的命令(例如VACUUM)。

Note: 在自动提交关闭模式中,你必须通过输入ABORT或者ROLLBACK显式地放弃失败的事务。还要记住如果你退出会话时没有提交,你的工作将被丢失。

Note: 自动提交打开模式是PostgreSQL的传统行为,但是自动提交关闭是最接近 SQL 说明的。如果你更喜欢自动提交关闭,你可能希望在系统范围的psqlrc文件或你的~/.psqlrc文件中设置它。

COMP_KEYWORD_CASE

判断一个 SQL 关键词完成时要用的字母大小写形式。如果被设置为lowerupper,已完成的词将分别是小写或大写形式。如果被设置为preserve-lowerpreserve-upper(默认值),已完成的词将是已经被输入的词的大小写形式,但是没有输入任何东西的正在被完成的词将分别是小写或大写形式。

DBNAME

你当前连接到的数据库名。每次你连接到一个数据库(包括程序启动)时这个变量都会被设置,而且不能被重设。

ECHO

如果设置成all,所有从键盘输入或者来自于一个脚本的所有行会在被解析或执行前被写到标准输出。要在程序启动时选择这种行为,可以使用开关-a。如果设置成queriespsql只是会在所有查询被发送给服务器时打印它们。这种行为的开关是-e

ECHO_HIDDEN

当这个变量被设置并且一个反斜线命令查询数据库时,该查询会被先显示。用这种方法,你可以学习PostgreSQL内部并且在你自己的程序中提供相似的功能(要在程序开始时选择这种行为,可以使用开关-E)。如果你把该变量设置成值noexec,查询只是会被显示但是并不会被真正地发送给服务器执行。

ENCODING

当前的客户端字符集编码。

FETCH_COUNT

如果这个变量被设置为一个整数值 > 0,SELECT查询的结果会按照它指定的行数被取出并且分批显示(每批中包含该变量指定的行数),而不是以默认的方式收集整个结果集后再显示。因此只会用到有限的内存量,而不管结果集的尺寸。当启用这个特性时,常用的设置是 100 到 1000。记住在使用这个特性时,一个查询可能在已经显示了某些行后失败。

Tip: 尽管你能够在这种特性中使用任何输出格式,默认的对齐格式却容易得到不太好的显示,因为每一个包含FETCH_COUNT行的组将被独立格式化,这就导致在不同的行组之间列宽会变化。其他的输出格式会工作得更好。

HISTCONTROL

如果这个变量被设置为ignorespace,以一个空格开始的行不会进入到历史列表中。如果设置为一个值ignoredups,匹配之前历史行的行不会被放入历史列表。一个值ignoreboth结合了前两个选项。如果被重置,或者被设置为与以上值不同的其他值,所有在交互模式中读取的行会被保存在历史列表中。

Note: 这种特性是“可耻地”从Bash中“抄袭”而来。

HISTFILE

该文件名将被用来存储历史列表。默认值是~/.psql_history。例如,把

\set HISTFILE ~/.psql_history- :DBNAME

放进~/.psqlrc将导致psql为每一个数据库维护一个独立的历史。

Note: 这种特性是“可耻地”从Bash中“抄袭”而来。

HISTSIZE

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

Note: 这种特性是“可耻地”从Bash中“抄袭”而来。

HOST

你当前连接到的数据库服务器主机。每次你连接到一个数据库(包括程序启动)时这个变量都会被设置,而且不能被重设。

IGNOREEOF

如果被重置,向一个psql交互式会话发送一个EOF字符(通常是Control+D)将会终止应用。如果设置为一个数字值,在应用终止前多个EOF字符会被忽略。如果该变量被设置但不是数字值,默认值会是 10。

Note: 这种特性是“可耻地”从Bash中“抄袭”而来。

LASTOID

上次被影响的 OID 的值,作为一个INSERT\lo_import命令的返回值。这个变量只保证在下一个 命令的结果被显示完之前有效。

ON_ERROR_ROLLBACK

当设置为on,如果一个事务块内的语句产生一个错误,该错误会被忽略并且事务会继续。当设置为interactive时,这种错误只会在交互式会话中被忽略,而在读取脚本文件时不会被忽略。当设置为off(默认值)时,在一个事务块中产生错误的语句会中止整个事务。这种开启了遇错误回滚的模式会为你在事务块中每个命令之前发出一个隐式的SAVEPOINT,并且在错误时回滚到该保存点。

ON_ERROR_STOP

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

PORT

你当前连接的数据库服务器端口。每次你连接到一个数据库(包括程序启动)时这个变量都会被设置,而且不能被重设。

PROMPT1
PROMPT2
PROMPT3

这些变量指定了psql发出的提示符的样式。详见下文的提示符

QUIET

这个变量等效于命令行选项-q。这在交互模式中可能不是太有用。

SINGLELINE

这个变量等效于命令行选项-S

SINGLESTEP

这个变量等效于命令行选项-s

USER

当前你是以哪个用户连接数据库的。每次你连接到一个数据库(包括程序启动)时这个变量都会被设置,而且不能被重设。

VERBOSITY

这个变量可以被设置为值defaultverbose或者terse来控制错误报告的详细程度。

SQL 代入

psql变量的一个关键特性是可以把它们替换("代入")常规的SQL语句以及元命令的参数中。此外,psql提供方法保证变量值被按照 SQL 文字使用并且标识符会被正确地引用。代入一个不带任何引号的值的语法是在变量名前面放一个冒号(:)。例如,

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

会查询表my_table。注意这可能不安全:变量的值会被按照字面文本复制,因此它可能包含不平衡的引号甚至是反斜线命令。你必须确保把它放置在有意义的地方。

当一个值要被用作一个 SQL 文字或者标识符时,安排它被引用是最安全的。要引用一个变量值作为一个 SQL 文字,在单引号中写一个冒号后面跟上变量名。要引用该值作为一个 SQL 标识符,在双引号中写一个冒号后面跟上变量名。这些结构会正确处理嵌入在变量值中的引号和其他特殊字符。之前的例子可以更安全地写成:

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

在被引用的SQL文字和标识符中,变量代入将不会被执行。因此一个':foo'这样的结构将不会从一个变量的值产生一个引用的文字(并且即使它能够也不安全,因为它无法正确地处理嵌在该值中的引号)。

下面是一个使用这种机制来把一个文件的内容复制到一个表列中的例子。首先将文件载入到一个变量,然后把该变量的值作为一个引用字符串代入:

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

(注意如果my_file.txt包含空字节,这仍不会工作。psql不支持在变量值中嵌入的空字节)。

因为冒号能够合法地出现在 SQL 命令中,一次在代入时表面上的尝试(即:name:'name':"name")不会被替换除非命名的变量当前被设置。在任何情况下,你可以使用一个反斜线转义冒号来保护它不被替换。

变量的冒号语法是用于嵌入式查询语言的标准SQL,例如ECPG。数组切片和类型转换的冒号语法是PostgreSQL扩展,有时候会与标准用法冲突。将一个变量值转义为一个 SQL 文字或标识符的冒号引用语法是一种psql扩展。

提示符

psql发出的提示符可以根据你的偏好自定义。三个变量PROMPT1PROMPT2PROMPT3包含描述提示符外表的字符串和特殊转义序列。提示符 1 是psql要求一个新命令时发出的普通提示符。在命令输入期间因为命令没有用一个分号终止或者一个引号没有关闭而要求更多输入时会发出提示符 2。当你运行一个SQL COPY命令并且你期望在终端上录入行值时会发出提示符 3。

选中的提示符变量的值被以原文打印,除了碰到一个百分号(%)。基于下一个字符,会替换为其他文本。定义好的替换是:

%M

数据库服务器的完整主机名(带域名),如果连接建立在一个 Unix 域套接字上则是[local],如果该 Unix 域套接字不在编译在程序中的默认位置则是[local:/dir/name]

%m

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

%>

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

%n

数据库会话用户名(这个值的展开可能在一个数据库会话期间被命令SET SESSION AUTHORIZATION改变)。

%/

当前数据库的名称。

%~

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

%#

如果该会话用户是一个数据库超级用户,那么提示符是一个#,否则是一个>(这个值的展开可能在一个数据库会话期间被命令SET SESSION AUTHORIZATION改变)。

%R

在提示符 1 中通常是=,但如果在单行模式中则是^,如果该会话已从数据库断开(\connect失败时可能会发生)则是!。在提示符 2 中,根据psql是否期待更多输入(因为命令还没有终止、位于一段/* ... */注释内部或者位于一个被引用的或者美元转义的字符串内部),该序列会被-*、一个单引号、一个双引号或者一个美元符号替代。在提示符 3 中,该序列不会产生任何东西。

%x

事务状态:当不在一个事务块中时是一个空字符串,在一个事务块中时是一个*,当处于一个失败的事务块中时是!,当事务状态是不确定(例如,因为没有连接)时为?

%digits

带有所指八进制代码的字符会被替换进来。

%:name:

psql变量name的值。详见变量小节。

%`command`

command的输出,类似于普通的"反单引号"替换。

%[ ... %]

提示符能够包含终端控制字符,例如改变颜色、背景或提示符文本风格、改变终端窗口标题的字符。为了 的行编辑特性工作正常,这些非打印控制字符必须被设计为通过在它们周围裹上%[%]成为不可见。在提示符中能够出现多对这样的%[%]。例如:

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '

会导致在 VT100 兼容的彩色终端上的一个粗体的(1;)黑色上加黄色(33;40)的提示符。

要插入一个百分号到你的提示符中,可写成%%。提示符 1 和 2 的默认值是'%/%R%# ',提示符 3 的默认值是'>> '

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

命令行编辑

为了便于行编辑和检索,psql支持Readline库。当psql退出时命令历史会被自动保存,并且在psql启动时会将其重新载入。尽管补全逻辑并未声称是一个SQL解析器,但是 Tab 补全也被支持。由 Tab 补全产生的查询也会与其他 SQL 命令相互干涉,例如SET TRANSACTION ISOLATION LEVEL。如果由于某种原因你不喜欢 Tab 补全,你可以通过将以下内容放在你的主目录中名为.inputrc的一个文件中来关闭该功能:

$if psql
set disable-completion on
$endif

(这不是一个psql特性,而是一个Readline特性。详情可参阅它的文档。)

环境

COLUMNS

如果\pset columns为零,它控制wrapped格式的宽度以及用来判断宽输出是否要求页面控制器或者需要切换到扩展自动模式中的垂直显示的宽度。

PAGER

如果查询结果不适合该屏幕,它们会被用管道导向这个命令。通常的值是moreless。默认值是与平台相关的。页面控制器的使用可以使用\pset命令禁用。

PGDATABASE
PGHOST
PGPORT
PGUSER

默认连接参数(见Section 31.14)。

PSQL_EDITOR
EDITOR
VISUAL

\e\ef命令使用的编辑器。变量会按照列出的顺序被检查,会设置使用其中第一个。

在 Unix 系统上内建的默认编辑器是vi,而在 Windows 系统上的内建默认编辑器是notepad.exe

PSQL_EDITOR_LINENUMBER_ARG

\e\ef与一个行号参数一起使用,这个变量指定被用来传递开始行号给用户的编辑器的命令行参数。对于诸如Emacsvi这样的编辑器,有一个加号。如果需要在选项名和行号之间有空格,在该变量的值中包括一个拖尾的空格。例子:

PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '

Unix 系统上的默认值是+(对应于默认编辑器vi,并且对很多通用编辑器有用),但是在 Windows 系统上没有默认值。

PSQL_HISTORY

命令历史文件的可选择的位置。波浪线(~)扩展会被执行。

PSQLRC

用户的.psqlrc文件的可选择的位置。波浪线(~)扩展会被执行。

SHELL

\!命令执行的命令。

TMPDIR

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

和大部分其他PostgreSQL工具相似,这个工具也使用libpq(见Section 31.14)支持的环境变量。

文件

psqlrc and ~/.psqlrc

除非给psql传递了一个-X-c选项,在连接到数据库之后并且在接受正常的命令之前,psql会尝试从系统范围的启动文件(psqlrc)读取并执行命令,然后是用户的个人启动文件(~/.psqlrc)。这些文件可以被用来设置要使用的客户端或者服务器,通常会用\setSET命令。

系统范围的启动文件被命名为psqlrc并且会在安装的"系统配置"目录中查找它,该目录用运行pg_config --sysconfdir来识别是最可靠的。默认情况下,这个目录会是相对于包含PostgreSQL可执行文件的目录的../etc/。这个目录的名称可以通过PGSYSCONFDIR环境变量显式地设置。

用户的个人启动文件被命名为.psqlrc并且会在调用用户的主目录中查找它。在 Windows 上(它缺少这种概念),个人启动文件被命名为%APPDATA%\postgresql\psqlrc.conf。用户启动文件的位置可以通过PSQLRC环境变量显式地设置。

系统范围的启动文件以及用户的个人启动文件可以通过在文件名后追加一个破折号以及PostgreSQL主次版本号来变成psql版本相关的,例如~/.psqlrc-9.2或者~/.psqlrc-9.2.5。最相关的版本相匹配的文件将在非版本相关的文件之前被读取。

.psql_history

命令行历史被存储在~/.psql_history中,或者在 Windows 上保存在%APPDATA%\postgresql\psql_history中。

历史文件的位置可以显式地通过PSQL_HISTORY环境变量设置。

注解

Windows 用户注记

psql被构建成一个"控制台应用"。由于 Windows 控制台窗口使用一种不同系统其他部分的编码,在psql中使用 8 位字符时你必须特别小心。如果psql检测到了一个有问题的控制台代码页,它将在开始时警告你。要改变控制台代码页,两件事情是必需的:

例子

第一个例子展示如何把一个命令分布在多行输入上。注意提示符的变化:

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

现在再看看表格定义:

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