pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
psql — PostgreSQL 的交互式终端
psql [option...] [dbname [username]]
psql是PostgreSQL的一个基于终端的前端。它使你能够交互式地输入查询,将其发送给PostgreSQL,并查看查询结果。也可以从文件提供输入。此外,它还提供了若干元命令和多种类似 shell 的特性,以便于编写脚本和自动化执行各种任务。
-a--echo-all在读入时把所有行打印到屏幕。这对脚本处理比交互模式更有用。这等效于把变量 ECHO 设置为 all。
-A--no-align切换到非对齐输出模式(默认输出模式是对齐的)。
-c command--command command指定 psql 执行一个命令字符串 command,然后退出。这在 shell 脚本中很有用。
command 必须是一个服务器完全可解析的命令字符串(即不包含 psql 专有的特性),或者是单个反斜线命令。因此不能用这个选项混合 SQL 和 psql 元命令。要那样做,可以把字符串用管道输送到 psql 中,像这样: echo "\x \\ select * from foo;" | psql.
如果命令字符串包含多条 SQL 命令,它们会在单个事务中处理,除非字符串中包含显式的 BEGIN/COMMIT 命令将其分成多个事务。这与把同一字符串送入psql标准输入时的行为不同。
-d dbname--dbname dbname指定要连接的数据库的名称。这等效于在命令行上把 dbname 指定为第一个非选项参数。
-e--echo-queries显示发送到服务器的所有命令。这等效于把变量 ECHO 设置为 queries。
-E--echo-hidden回显 \d 及其他反斜线命令生成的实际查询。如果你想在自己的程序中包含类似的功能,可以使用它。这等效于在 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。
-n--no-readline不使用 readline 进行行编辑,也不使用历史记录。这在剪切粘贴时关闭制表符展开会很有用。
-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 命令,就像分号的作用一样。
这种模式是为坚持使用它的用户提供的,但并不一定值得推荐。特别是,如果在一行中混合了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打开扩展表格式模式。这等效于\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 设置为适当的值。
如果由于任何原因(例如权限不足、服务器没有在目标主机上运行等)导致连接无法建立,psql将返回一个错误并且终止。
在正常操作时,psql 提供一个提示符,它是 psql 当前连接到的数据库名称后跟字符串 =>。例如:
$ psql testdb
Welcome to psql 7.4.30, 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 中的任何以未加引号的反斜线开始的内容都是一个由 psql 自身处理的 psql 元命令。这些命令正是让 psql 在管理和编写脚本方面很有用的原因。元命令更常被称为斜线或反斜线命令。
psql命令的格式是用反斜线后面直接跟上一个命令动词,然后是一些参数。参数与命令动词和其他参数之间用任意多个空白字符分隔开。
要在参数中包含空白,可以用单引号将它括起来。要在这样的参数中包含一个单引号,可以在它前面放一个反斜线。单引号中的内容还会接受类似 C 语言的替换:\n(换行)、\t(制表符)、\digits、\0digits和 \0xdigits(分别表示以十进制、八进制或十六进制给出的码点对应的字符)。
如果未加引号的参数以冒号(:)开头,它会被当作一个 psql 变量,该变量的值将被用作参数。
用反引号(`)包围的参数会被当作传给 shell 的命令行。该命令的输出(去掉末尾的换行符)将被用作参数值。上述转义序列在反引号中同样适用。
有些命令把SQL标识符(例如表名)作为参数。这些参数遵循SQL的语法规则:未加引号的字母会被强制转换为小写,而双引号(")可以保护字母不发生大小写转换,并允许在标识符中包含空白。在双引号内,成对的双引号会在结果名称中折叠成一个双引号。例如,FOO"BAR"BAZ会被解释为fooBARbaz,而"A weird"" name"会变成A weird" name。
参数解析会在行尾或遇到另一个未加引号的反斜线时停止。未加引号的反斜线会被视为新元命令的开始。特殊序列\(两个反斜线)表示参数结束,并继续解析SQL命令(如果还有)。通过这种方式,SQL命令和psql命令可以自由地混合在同一行中。但无论如何,元命令的参数都不能延续到下一行。
定义了下列元命令:
\a如果当前表格输出格式是非对齐,则切换为对齐;否则切换为非对齐。保留此命令是为了向后兼容。更通用的解决方案参见 \pset。
\cd [directory]将当前工作目录更改为directory。如果没有参数,则切换到当前用户的主目录。
要打印当前工作目录,请使用\! pwd。
\C [ title ]设置作为查询结果打印的表的标题,或取消此类标题。该命令等价于\pset title 。(此命令的名称源自“caption”,因为它过去只用于设置HTML表的标题。)title
\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 命令高效,因为所有数据都必须通过客户端/服务器连接。对于大量数据,另一种技术可能更可取。
注意客户端副本与服务器副本对 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,则只显示名称匹配该模式的聚合函数。
\dc [ pattern ]列出所有可用的字符集编码之间的转换。如果指定了pattern,则只列出名称匹配该模式的转换。
\dC列出所有可用的类型转换。
\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 SQL 命令创建。
\dD [ pattern ]列出所有可用的域。如果指定了pattern,则只显示匹配该模式的域。
\df [ pattern ]列出可用的函数及其参数和返回类型。 If pattern is specified, only functions whose names match the pattern are shown. If the form \df+ is used, additional information about each function, including language and description, is shown.
为了减少杂乱,\df 不显示数据类型 I/O 函数。这是通过忽略接受或返回 cstring 类型的函数实现的。
\distvS [ pattern ]这不是实际的命令名:字母 i、s、t、v、S 分别代表索引、序列、表、视图和系统表。你可以按任意顺序指定其中任意个或全部字母,以获得所有匹配对象的列表。字母 S 把列表限制为系统对象;不带 S 时只显示非系统对象。如果向命令名追加 +,每个对象还会列出其关联的描述(如果有)。
如果指定了 pattern,则只列出名称匹配该模式的对象。
\dl这是\lo_list的别名,用于显示大对象列表。
\dn [ pattern ]列出所有可用的模式(命名空间)。如果指定了 pattern(正则表达式), 则只列出名称匹配该模式的模式。
\do [ pattern ]列出可用的操作符及其操作数和返回类型。如果指定了pattern,则只列出名称匹配该模式的操作符。
\dp [ pattern ]产生所有可用表及其相关访问权限的列表。 If pattern is specified, only tables whose names match the pattern are listed.
\dT [ pattern ]列出所有数据类型,或者只列出匹配pattern的类型。命令形式\dT+显示额外的信息。
\du [ pattern ]列出所有数据库用户,或者只列出匹配pattern的用户。
\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
如果第一个参数是未加引号的 -n,则不写末尾的换行符。
如果你使用 \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)列出服务器中所有数据库的名称、所有者和字符集编码。向命令名追加 + 还可以看到数据库的任何描述。
\lo_export loid filename从数据库中读取具有OIDloid的大对象,并将其写入filename。请注意,这与服务器函数 lo_export略有不同,后者使用运行数据库服务器的用户的权限, 并在服务器的文件系统上操作。
使用\lo_list命令来查找大对象的OID。
\lo_import filename [ comment ]把该文件存储为一个 PostgreSQL 大对象。可以选择把给定的注释与该对象关联。例如:
foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
该响应表明这个大对象得到的对象 ID 是 152801,如果以后想再访问该对象,就应当记住这个 ID。因此, 建议始终为每个对象关联一段人类可读的注释。之后可以用 \lo_list 命令查看这些注释。
注意这条命令与服务器端的 lo_import 有微妙的差别,因为它以本地 用户在本地文件系统上操作,而不是服务器的用户和文件 系统。
\lo_list列出当前存储在数据库中的所有PostgreSQL大对象,以及为它们提供的注释。
\lo_unlink loid从数据库中删除OID 为 loid的大对象。
使用\lo_list命令来查找大对象的OID。
\o [ {filename | |command} ]把以后的查询结果保存到文件filename中,或通过管道把以后的结果送给单独的 Unix shell 去执行command。如果未指定参数,查询输出将重置为标准输出。
“查询结果”包括从数据库服务器获得的所有表、命令响应和提示,以及各种查询数据库的反斜线命令(例如\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)在只显示元组和完整显示之间切换。完整显示可能显示额外信息,如列标题、标题和各种页脚。 In tuples only mode, only actual table data is shown.
title [ text ]为随后打印的任何表设置表标题。这可用于为输出提供描述性标签。如果不带参数,则取消标题。
tableattr (or T) [ text ]允许你指定要放在 HTML table 标签内的任何属性。例如可以是 cellpadding 或 bgcolor。注意这里可能不应该指定 border,因为那已由 \pset border 处理。
pager控制查询和 psql 帮助输出对分页器的使用。如果设置了环境变量 PAGER,输出将通过管道送到指定的程序。否则使用依赖于平台的默认值(如 more)。
当 pager 为 off 时,不使用分页器。当 pager 为 on 时,只在合适的情况下使用分页器,即输出到终端且放不到屏幕上时。(psql 对何时使用分页器的估计并不完美。)\pset pager 打开和关闭分页器。pager 也可以设置为 always,这会使分页器总是被使用。
这些不同格式的外观的示例见 示例 一节。
\pset 有多种快捷命令。参见 \a、\C、\H、\t、\T 和 \x。
不带参数调用 \pset 是一个错误。将来这个调用可能会显示所有打印选项的当前状态。
\q退出psql程序。
\qecho text [ ... ]此命令与 \echo 相同,只是所有输出将写入由 \o 设置的查询输出通道。
\r重置(清空)查询缓冲区。
\s [ filename ]打印命令行历史或把它保存到 filename。如果省略 filename,则历史写到标准输出。只有 psql 被配置为使用 GNU history 库时此选项才可用。
在当前版本中,不再需要保存命令历史,因为程序终止时会自动完成。每次 psql 启动时也会自动加载历史。
\set [ name [ value [ ... ]]]把内部变量 name 设置为 value,如果给出多个值则设置为它们的串接。如果没有给出第二个参数,该变量只是被设置为没有值。要取消设置一个变量,使用 \unset 命令。
有效的变量名可以包含字符、数字和下划线。详见 变量 一节。
尽管你可以随意把任何变量设成任何 值,psql 还是把若干变量 视为特殊的。它们在变量一节中记录。
这条命令与 SQL 命令 SET 完全无关。
\t切换输出中的列名标题和行数页脚的显示状态。这个命令等价于\pset tuples_only,提供它是为了使用方便。
\T table_options允许你指定要放在 HTML 表输出模式的 table 标签中的属性。此命令等价于 \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参数来指定要被显示的对象名称。*表示“任意字符序列”,?表示“任意单个字符”(这种记号方法与 Unix shell 的文件名模式相当)。高级用户还可以使用字符类等正则表达式记法,例如用[0-9]匹配“任意数字”。要让这些模式匹配字符中的任何一个按字面意思解释,可以用双引号把它括起来。
包含(未加引号的)点号的模式会被解释为模式名称的匹配模式,后接对象名称的匹配模式。例如,\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 的内部变量名可以由字母、数字和下划线按任意顺序、任意数量组成。其中一些变量会被 psql 特殊对待。它们表示特定的选项设置(运行时可以通过更改该变量的值来改变),或者表示应用的某种状态。尽管你可以把这些变量用于其他目的,但不建议这样做,因为程序的行为可能会很快变得非常奇怪。按照惯例,所有被特殊对待的变量都由全大写字母(以及可能的数字和下划线)组成。为了确保将来最大的兼容性,请避免把这类变量名用于自己的目的。下面是所有被特殊对待的变量的列表。
AUTOCOMMIT当为 on(默认)时,每条 SQL 命令在成功完成后自动提交。要在此模式下推迟提交,必须输入 BEGIN 或 START TRANSACTION SQL 命令。当为 off 或未设置时,SQL 命令在你显式发出 COMMIT 或 END 之前不会提交。 自动提交关闭模式的工作方式是:在任何尚不在事务块中且本身不是 BEGIN 或其他事务控制命令的命令之前,为你隐式发出一个 BEGIN。
在自动提交关闭模式中,必须通过ABORT或者ROLLBACK显式地放弃任何失败的事务。还要记住,如果退出会话时没有提交,则所有的工作都会丢失。
自动提交开启模式是 PostgreSQL 的传统行为,而自动提交关闭更接近 SQL 规范。如果你更喜欢自动提交关闭,可能希望在你的 .psqlrc 文件中设置它。
DBNAME当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
ECHO如果设置为 all,所有输入的或来自脚本的行在解析或执行之前都被写到标准输出。要在程序启动时选择此行为,使用开关 -a。 If set to queries, psql merely prints all queries as they are sent to the server. The switch for this is -e.
ECHO_HIDDEN设置了此变量后,当反斜线命令查询数据库时会先显示该查询。这样你就可以研究 PostgreSQL 的内部实现,并在自己的程序中提供类似的功能。(要在程序启动时选择此行为,使用开关 -E。)如果你把该变量设置为 noexec,查询只被显示而不会真正发送到服务器执行。
ENCODING当前的客户端字符集编码。
HISTCONTROL如果这个变量被设置为ignorespace,则以一个空格开始的行不会被放入到历史列表中。如果被设置为值ignoredups,则与上一条历史记录相同的行不会被放入。值ignoreboth组合了上述两种值。如果未设置,或被设置为上述值以外的其他值,所有在交互模式中被读入的行都会保存在历史列表中。
这个特性是可耻地从Bash抄袭过来的。
HISTSIZE存储在命令历史中的命令数量。默认值是 500。
这个特性是可耻地从Bash抄袭过来的。
HOST当前连接到的数据库服务器主机。每次连接到数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
IGNOREEOF如果未设置,向 psql 的交互式 会话发送一个 EOF 字符(通常是 Control+D) 将终止应用程序。如果设为数值, 则在应用程序终止之前会忽略那么多 个 EOF 字符。如果变量已设置但没有 数值,默认为 10。
此特性是从 Bash 厚颜无耻地抄袭来的。
LASTOID最后被影响的 OID 的值,这可能会由INSERT或者\lo_import命令返回。这个变量只保证在下一个SQL命令的结果被显示完之前有效。
ON_ERROR_STOP默认情况下,如果非交互式脚本遇到错误(如格式错误的 SQL 命令或内部元命令),处理会继续。这是 psql 的传统行为,但有时并不理想。如果设置了此变量,脚本处理将立即终止。如果该脚本是从另一个脚本调用的,后者也会以同样的方式终止。如果最外层的脚本不是从交互式 psql 会话调用而是使用 -f 选项调用的,psql 将返回错误码 3,以区别于致命错误情况(错误码 1)。
PORT当前连接到的数据库服务器端口。每次连接到数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
PROMPT1PROMPT2PROMPT3这些变量指定psql发出的提示符的模样。见下文的提示符。
QUIET此变量等价于命令行选项 -q。在交互模式下它可能不太有用。
SINGLELINE此变量等价于命令行选项 -S。
SINGLESTEP此变量等价于命令行选项 -s。
USER当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
VERBOSITY这个变量可以被设置为值default、verbose或者terse来控制错误报告的详细程度。
psql 变量的另一个有用特性是, 你可以把它们替换(“插值”)到常规的 SQL 语句中。其语法同样是把变量名前加上 冒号(:)。
testdb=>\set foo 'my_table'testdb=>SELECT * FROM :foo;
将查询表 my_table。变量的值按字面复制,因此它甚至可以包含不平衡的引号或反斜线命令。你必须确保它放在哪里都有意义。带引号的 SQL 实体中不会执行变量插值。
此功能的一个流行应用是在后续语句中引用最后插入的 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 文本常量同样要经过某些解释。在这种 情况下,你或许更适合在外部预先准备好文件。
由于冒号可以合法地出现在 SQL 命令中,因此适用以下规则:字符序列 :name 不会被更改,除非 name 是当前已设置的变量的名称。在任何情况下,你都可以用反斜线转义冒号来保护它不被替换。(变量的冒号语法是嵌入式查询语言(如 ECPG)的标准 SQL 语法。数组切片和类型转换的冒号语法是 PostgreSQL 的扩展,因此存在冲突。)
psql 发出的提示符可以按你的喜好进行定制。PROMPT1、PROMPT2 和 PROMPT3 这三个变量包含描述提示符外观的字符串和特殊转义序列。提示符 1 是 psql 请求新命令时发出的常规提示符。提示符 2 会在录入命令期间还需要更多输入时发出,例如命令尚未以分号结束,或者引号尚未闭合时。在执行 SQL COPY FROM STDIN 命令并需要在终端中输入一行值时,会发出提示符 3。
选定的提示符变量的值按字面打印,除非遇到百分号(%)。根据下一个字符的不同,会替换为某些其他文本。已定义的替换有:
%M数据库服务器的完整主机名(含域名);如果通过 Unix 域套接字连接,则为[local];如果 Unix 域套接字不在编译时指定的默认位置,则为[local:。/dir/name]
%m数据库服务器的主机名,在第一个点号处截断;如果通过 Unix 域套接字连接,则为[local]。
%>数据库服务器监听的端口号。
%n数据库会话用户名。(在数据库会话期间,SET SESSION AUTHORIZATION命令可能改变该值的扩展结果。)
%/当前数据库的名称。
%~类似 %/,但如果该数据库是你的默认数据库,则输出 ~ (波浪号)。
%#如果会话用户是数据库超级用户,则为#,否则为>。(在数据库会话期间,SET SESSION AUTHORIZATION命令可能改变该值的扩展结果。)
%R在提示符 1 中通常是 =,但在单行模式中是 ^,如果会话与数据库断开连接(\connect 失败时可能发生)则是 !。在提示符 2 中该序列被替换为 -、*、单引号或双引号,取决于 psql expects more input because the command wasn't terminated yet, because you are inside a /* ... */ comment, or because you are inside a quote. In prompt 3 the sequence doesn't produce anything.
%x事务状态:如果当前不在事务块中,则为空字符串;如果处于事务块中,则为 *;如果处于失败的事务块中,则为 !;如果事务状态不确定(例如因为当前没有连接),则为 ?。
%digits替换为指定数字代码对应的字符。如果digits以0x开头,其余的字符会被解释为十六进制;否则,如果第一位数字是0,这些数字会被解释为八进制;否则,这些数字会被读作十进制数。
%:name:psql 变量 name 的值。详见 变量。
%`command`command 的输出,类似普通的 “反引号”替换。
To insert a percent sign into your prompt, write %%. The default prompts are '%/%R%# ' for prompts 1 and 2, and '>> ' for prompt 3.
这个特性是可耻地从tcsh抄袭过来的。
psql 支持 Readline 库以方便地进行行编辑和历史检索。命令 历史保存在你的主目录下名为 .psql_history 的文件中, 并在 psql 启动时重新装载。也支持 Tab 补全,不过补全逻辑并不自称是一个 SQL 解析器。如果由于某种原因你不喜欢 Tab 补全, 可以把它关闭,方法是把以下内容放进你主目录下名为 .inputrc 的文件中:
$if psql set disable-completion on $endif
(这不是 psql 的特性而是 Readline 的。详细内容请阅读其文档。)
HOME初始化文件(.psqlrc) 和命令历史文件(.psql_history)所在的目录。
PAGER如果查询结果无法在屏幕上完整显示,则会通过管道传递给这个命令。典型值为 more 或 less。默认值取决于平台。可以使用 \pset 命令禁用分页器的使用。
PGDATABASE要连接的默认数据库
PGHOSTPGPORTPGUSER默认连接参数。
PSQL_EDITOREDITORVISUAL\e命令使用的编辑器。这些变量按列出的顺序检查;使用第一个被设置的变量。
SHELL被\!命令执行的命令。
TMPDIR存储临时文件的目录。默认是/tmp。
启动之前,psql 会尝试读取并执行文件 $HOME/.psqlrc 中的命令。它可用于按喜好设置客户端或服务器(使用 \set 和 SET 命令)。
命令行历史存储在文件 $HOME/.psql_history 中。
在早期,psql 允许单字母反斜线命令的第一个参数直接跟在命令后面,中间没有空白。为了兼容性这一点在一定程度上仍被支持,但我们不打算在这里解释细节,因为不鼓励这种用法。如果你收到奇怪的消息,请记住这一点。 For example
testdb=> \foo
Field separator is "oo".
which is perhaps not what one would expect.
psql 只能与相同版本的服务器顺利配合工作。这并不意味着其他组合会完全失败,但可能出现或微妙或不那么微妙的问题。如果服务器的版本不同,反斜线命令特别容易失败。
第一个例子显示如何把一条命令分布在多行输入上。注意提示符的变化:
testdb=>CREATE TABLE my_table (testdb(>first integer not null default 0,testdb(>second texttestdb->);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 2Border 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 0Border 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 1Border style is 1. peter@localhost testdb=>\pset format unalignedOutput format is unaligned. peter@localhost testdb=>\pset fieldsep ","Field separator is ",". peter@localhost testdb=>\pset tuples_onlyShowing 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 \xOutput 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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。