pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
psql — PostgreSQL 的交互式终端
psql [options] [dbname[user] ]
psql是PostgreSQL的一个基于终端的前端。它使你能够交互式地输入查询,将其发送给PostgreSQL,并查看查询结果。也可以从文件提供输入。此外,它还提供了若干元命令和多种类似 shell 的特性,以便于编写脚本和自动化执行各种任务。
psql 是一个常规的 PostgreSQL 客户端应用。要连接到数据库,你需要知道目标数据库的名称、服务器的主机名和端口号,以及你想以哪个用户名连接。psql 可以通过命令行选项(即分别为 -d、-h、-p 和 -U)把这些参数告知它。如果遇到一个不属于任何选项的参数,它将被解释为数据库名(如果数据库名已经给出,则解释为用户名)。并非所有这些选项都是必需的,会应用默认值。 如果省略主机名,psql 将通过 Unix 域套接字连接到本地主机上的 服务器。默认端口号在编译时确定。由于数据库 服务器使用相同的默认值,因此在大多数情况下不必 指定端口。默认用户名是你的 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 中的任何以未加引号的反斜线开始的内容都是一个由 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。
\cd [directory]把当前工作目录更改为 directory。如果没有参数,则切换到当前用户的主目录。
要打印当前工作目录,请使用 \!pwd。
\C [ title ]设置作为查询结果打印的任何表的标题,或取消任何这样的标题。此命令等价于 \pset title . (The name of this command derives from “caption”, as it was previously only used to set the caption in an HTML table.)title
\connect (or \c) [ dbname [ username ] ]建立到一个新数据库和/或以另一个用户名的连接。先前的连接会被关闭。如果dbname为-,则假定使用当前的数据库名。
如果省略username,则假定使用当前的用户名。
作为一条特殊规则,不带任何参数的\connect将以默认用户连接到默认数据库(就像你启动psql时不带任何参数一样)。
如果连接尝试失败(用户名错误、访问被拒绝等),当且仅当psql处于交互模式时,才会保留先前的连接。在执行非交互式脚本时,处理会立即停止并报错。选择这种区别对待,一方面是为了让用户方便地应对输入错误,另一方面是作为一种安全机制,防止脚本意外地作用于错误的数据库。
\copy table [ with oids ] { from | to } filename | stdin | stdout [ using delimiters 'characters' ] [ with null as 'string' ]执行前端(客户端)复制。此操作执行的是一条 SQL COPY 命令, 但不是由后端读取或写入指定的文件(后者因此需要后端访问权限和特殊的用户权限,并且受限于后端可访问的文件系统), 而是由 psql 读取或写入该文件, 并在后端和本地文件系统之间传送数据。
该命令的语法类似于 SQL COPY 命令(细节见其描述)。注意,因此对 \copy 命令适用特殊的解析规则。特别是,变量替换规则和反斜线转义不适用。
这个操作不如 SQL 的 COPY 命令高效,因为所有数据都必须通过 客户端/服务器的 IP 或套接字连接。对于大量数据, 另一种技术可能更可取。
注意前端副本与后端副本对 stdin 和 stdout 的解释不同:在前端副本中它们总是指 psql 的输入和输出流。在后端 副本中,stdin 来自 COPY 本身来自的地方(例如用 -f 选项运行的一个脚本), 而 stdout 指查询输出流(见 下面的 \o 元命令)。
\copyright显示 PostgreSQL 的版权和分发条款。
\d relationShows all columns of relation (which could be a table, view, index, or sequence), 它们的类型以及任何特殊属性(如 NOT NULL 或默认值,如果有)。如果该关系实际上是表,任何已定义的索引、主键、唯一约束和检查约束也会列出。如果该关系是视图,则还显示视图定义。
命令形式 \d+ 相同,但还会显示与表列关联的任何注释。
如果 \d 不带任何参数调用,它等价于 \dtvs,后者会显示所有表、视图和序列的列表。这纯粹是为了方便。
\da [ pattern ]列出所有可用的聚合函数及其操作的数据类型。如果指定了 pattern(正则表达式), 则只显示匹配的聚合。
\dd [ object ]显示对象(可以是一个正则表达式)的描述,如果没有给出参数则显示所有对象的描述。(对象涵盖聚合、函数、操作符、类型、关系(表、视图、索引、序列、大对象)、规则和触发器。)例如:
=> \dd version
Object descriptions
Name | What | Description
---------+----------+---------------------------
version | function | PostgreSQL version string
(1 row)
对象的描述可以用 COMMENT ON SQL 命令生成。
PostgreSQL 把对象描述存储在 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 分别代表索引(index)、序列(sequence)、 表(table)、视图(view)和系统表(system table)。可以按任意顺序指定其中 任意个或全部,以获得它们的列表以及各自的属主。
如果指定了 pattern, 它是一个正则表达式,把列表限制为名字 匹配的对象。如果在命令名后面加上 “+”,每个对象都会连同其相关联的描述一起列出(如果有的话)。
\dl这是\lo_list的别名,用于显示大对象列表。
\do [ name ]列出可用的操作符及其操作数和返回类型。 如果指定了 name, 则只显示具有该名称的操作符。
\dp [ pattern ]这是 \z 的别名,因它更具助记性而保留(display permissions,显示权限)。
\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 大对象。可以选择把给定的注释与该对象关联。 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显示当前存储在数据库中的所有 PostgreSQL 大对象的列表以及为它们提供的任何注释。
\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.
“查询结果” 包括从数据库服务器获得的所有 表、命令响应和通知, 以及查询数据库的各反斜杠 命令(如 \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切换分页器的使用以输出表格。如果设置了环境变量 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
\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 权限。
\! [ command ]进入一个单独的 shell,或执行 shell 命令 command。参数不会被进一步解释;shell 会原样看到它们。
\?获取有关反斜线(\)命令的帮助信息。
如果做了相应配置,psql 既理解标准的 Unix 短选项,也理解 GNU 风格的长选项。后者并非在所有系统上都可用。
在读入时把所有行打印到屏幕。这对脚本处理比交互模式更有用。 This is equivalent to setting the variable ECHO to all.
切换到非对齐输出模式(默认输出模式是对齐的)。
query指定 psql 执行一个查询字符串 query,然后退出。这在 shell 脚本中很有用。
query 必须是 后端完全可解析的查询字符串(即不含 psql 特有的功能),或者是单条反斜杠命令。因此 你不能混合 SQL 和 psql 元命令。要做到这一点,可以把字符串管道输入 psql,像这样: echo "\x \\ select * from foo;" | psql。
dbname指定要连接的数据库的名称。这等效于在命令行上把 dbname 指定为第一个非选项参数。
显示发送到后端的所有查询。这等效于把变量 ECHO 设置为 queries。
回显 \d 及其他反斜线命令生成的实际查询。如果你想在自己的程序中包含类似的功能,可以使用它。这等价于在 psql 中设置变量 ECHO_HIDDEN。
filename用文件 filename 作为查询的来源,而不是交互式地读取查询。 文件处理完后,psql 终止。这在很多方面等价于内部 命令 \i。
如果filename是-(连字符),则会读取标准输入。
使用这个选项与写成psql < 有细微差别。通常两种形式都会得到你期望的结果,但使用filename-f可以启用一些有用的特性,例如带行号的错误消息。使用这个选项也还有一点机会降低启动开销。另一方面,使用 shell 输入重定向的形式在理论上能保证得到与你手工逐行输入时完全相同的输出。
separator使用separator作为字段分隔符。这等效于\pset fieldsep或者\f。
hostname指定 postmaster 所在机器的主机名。 如果 host 以斜线开头,它被用作 Unix 域套接字所在的目录。
打开 HTML 表格输出。这等效于 \pset format html 或 \H 命令。
列出所有可用的数据库,然后退出。其他非连接选项会被忽略。这类似于内部命令 \list。
filename把所有查询输出放到文件filename中。这等效于命令\o。
port指定 postmaster 用于监听连接的 TCP/IP 端口,或者在省略时指定本地 Unix 域套接字文件扩展名。默认是 PGPORT 环境变量的值,如果没有设置,则默认为编译时指定的端口,通常是 5432。
assignment以 \pset 的形式指定打印选项。注意,这里必须用一个等号而不是空格来分隔名称和值。例如,要把输出格式设置为 LaTeX,可以写 -P format=latex。
指定 psql 安静地工作。默认情况下,它会打印欢迎消息和各种提示信息。如果使用了这个选项,以上那些就都不会输出。这与 -c 选项配合很有用。 Within psql you can also set the QUIET variable to achieve the same effect.
separator把separator用作记录分隔符。这等效于\pset recordsep命令。
以单步模式运行。即每条查询发送到后端之前都会提示用户,并可选择取消执行。可用它来调试脚本。
以单行模式运行,此时换行符像分号一样 终止一条查询。
这种模式是为坚持使用它的用户提供的,但并不一定值得推荐。特别是,如果在一行中混合了SQL和元命令,对于没有经验的用户来说,它们的执行顺序未必总是清楚的。
关闭列名和结果行计数页脚等的打印。它完全等效于 \t 元命令。
table_options指定要放在HTML table标签内的选项。详见\pset。
让 psql 在连接数据库之前提示输入用户名和密码。
这个选项已废弃,因为它在概念上有缺陷。 (为非默认用户名而提示与因为后端要求 而为口令提示其实是两件 事。)建议改看 -U 和 -W 选项。
username以用户 username 而不是默认用户连接到数据库。(当然,你必须有权限这样做。)
assignment执行变量赋值,类似于 \set 内部命令。注意在命令行上必须用等号分隔名称和值。 要取消变量的设置,去掉等号即可。要把一个变量 设置为没有值,使用等号但去掉值。 这些赋值在启动的非常早期阶段完成, 因此为内部目的保留的变量可能会在 稍后被覆盖。
显示 psql 的版本。
要求 psql 在连接数据库之前提示输入密码。即使你随后用元命令 \connect.
在当前版本中,只要后端要求口令认证,psql 就会自动发出口令提示。 由于这目前基于一个技巧,自动 识别可能神秘地失败,因此提供这个选项来强制提示。 如果没有发出口令提示而后端又要求口令认证, 连接尝试将失败。
打开扩展行格式模式。这等效于 命令 \x。
不读取启动文件 ~/.psqlrc。
显示有关 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 的内部变量名可以由 字母、数字和下划线以任意顺序和任意数量组成。 A number of regular variables are treated specially by 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当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
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_insert 命令返回。此变量只在下一条 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当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但可以被取消设置。
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);
One possible problem with this approach is that my_file.txt might contain single quotes. These need to be escaped so that they don't cause a syntax error when the third line is processed. This could be done with the program sed:
testdb=> \set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\''
Observe the correct number of backslashes (6)! You can resolve it this way: After psql has parsed this line, it passes sed -e "s/'/\\\'/g" < my_file.txt to the shell. The shell will do its own thing inside the double quotes and execute sed with the arguments -e and s/'/\\'/g. When sed parses this it will replace the two backslashes with a single one and then do the substitution. Perhaps at one point you thought it was great that all Unix commands use the same escape character. And this is ignoring the fact that you might have to escape all backslashes as well because SQL text constants are also subject to certain interpretations. In that case you might be better off preparing the file externally.
由于冒号可以合法地出现在查询中,适用以下规则:如果该变量未设置,字符序列“冒号+名称”不会被更改。在任何情况下,你都可以用反斜线转义冒号来保护它不被解释。 (变量的冒号语法是嵌入式查询语言(如 ecpg)的标准 SQL 语法。数组切片和类型转换的冒号语法是 PostgreSQL 扩展,因此存在冲突。)
psql 发出的提示符可以按你的偏好定制。三个变量 PROMPT1、PROMPT2 和 PROMPT3 包含描述提示符外观的字符串和特殊转义序列。 提示符 1 是 psql 请求新查询时发出的常规提示符。提示符 2 在查询输入期间期待更多输入时发出,因为查询未以分号结束或引号未闭合。提示符 3 在你运行 SQL COPY 命令并需要在终端上输入元组时发出。
相应的提示符变量的值按字面打印,除非遇到百分号(%)。根据下一个字符的不同,会替换为某些其他文本。已定义的替换有:
%MThe full hostname (with domain name) of the database server, or [local] if the connection is over a Unix domain socket, or [local:, if the Unix domain socket is not at the compiled in default location./dir/name]
%m数据库服务器的主机名(在第一个点后截断);如果连接通过 Unix 域套接字则为 [local]。
%>数据库服务器正在监听的端口号。
%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抄袭过来的。
psql 正常结束时向 shell 返回 0;发生自身的致命错误(内存不足、找不到文件)时返回 1;与后端的连接变坏且会话不是交互式时返回 2;脚本中发生错误且设置了变量 ON_ERROR_STOP 时返回 3。
启动之前,psql 会尝试读取并执行文件 $HOME/.psqlrc 中的命令。它可用于按喜好设置客户端或服务器(使用 \set 和 SET 命令)。
psql 支持 readline 和 history 库以方便地进行行编辑和历史检索。命令历史保存在你的主目录下名为 .psql_history 的文件中,并在 psql 启动时重新装载。 也支持 Tab 补全,不过补全逻辑并不自称是一个 SQL 解析器。 可用时,psql 会自动构建为使用这些特性。如果由于某种原因你不喜欢 Tab 补全,可以把它关闭, 方法是把以下内容放进你主目录下名为 .inputrc 的文件中:
$if psql set disable-completion on $endif
(这不是 psql 而是 readline 的特性。详细内容请阅读其文档。)
如果你安装了 readline 库但 psql 似乎没有使用它,必须确保 PostgreSQL 的顶级 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 ...
Then you have to recompile psql (not necessarily the entire code tree).
GNU readline 库可以从 GNU 项目的 FTP 服务器 ftp://ftp.gnu.org 获取。
This section only shows a few examples specific to psql. 如果你想学习 SQL 或熟悉 PostgreSQL,可能希望阅读发行版中包含的教程。
第一个例子显示如何把一条查询分布在多行输入上。注意提示符的变化:
testdb=>CREATE TABLE my_table (testdb(>first integer not null default 0,testdb(>second texttestdb->);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 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
或者,使用简短命令:
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
在早期的 psql 中,允许第一个 参数直接紧跟在(单字母)命令之后。为了兼容性这一点在一定程度上仍被支持,但我不打算在这里解释细节,因为不鼓励这种用法。但如果你收到奇怪的消息,请记住这一点。例如
testdb=> \foo
Field separator is "oo",
这可能不是人们期望的结果。
psql 只与相同版本的服务器顺畅配合。这并不意味着其他组合会立即失败,但可能出现或明显或微妙的问题。
Pressing Control-C during a “copy in” (data sent to the server) doesn't show the most ideal of behaviors. 如果你收到类似“COPY 状态必须先终止”的消息,只需输入 \c - - 重置连接。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。