PSQL(1) | PostgreSQL Client Applications | PSQL(1) |
psql - PostgreSQL 交互终端
psql [option...] [dbname [username]]
psql 是一个以终端为基础的 PostgreSQL 前端。它允许你交互地键入查询,把它们发出给 PostgreSQL, 然后看看查询的结果。另外,输入可以来自一个文件。还有, 它提供了一些元命令和多种类 shell 地特性来实现书写脚本以及对大量任务的自动化。
如果命令字串包含多个
SQL
命令,那么他们在一个事务里处理,
除非在字串里包含了明确的
BEGIN/COMMIT
命令把他们分成多个事务。
这个和从 psql
的标准输入里给它填充相同字串不同。
如果filename 是- (连字符),则从标准输入读取。
使用这个选项与用 psql
< filename
有微小的区别。通常,两者都回按照你预期那样运行,但是使用
-f打开了一些很好的特性,
比如带行号的错误信息。而且,使用这个选项还有可能有减小启动负荷的机会。
另一方面,如果你把所有内容手工输入,
使用 shell
输入定向的方式(理论上)能保证生成和你已经得到的完全一样的输出(译注:重复运行命令)。
这个选项已经废弃了,因为它在概念上有漏洞。
(提示输入非缺省用户名和提示输入服务器要求的口令是完全两码事。)我们鼓励你用
-U 和 -W 选项取代。
在当前版本里,如果服务器要求口令认证,psql 自动提出一个口令提示符。因为目 前这个特性是以一个“hack”为基础, 自动识别有可能奇怪地失效,因此用这个选项 强制一个提示符。 如果没有声明口令提示符而服务器要求口令认证,那么联接企图 将失败。
如果正常结束,那么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.4beta5, 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 [listen(7)]
和 NOTIFY [notify(7)]
生成的异步通知信号。
你在 psql 里输入的任何以不带引号的反斜杠('\')开头的东西都是 psql 元命令,这些命令是由 psql 自己处理的。这些命令也是令 psql 可用于管理或书写脚本的原因。 元命令更常见的叫法是斜杠或反斜杠命令。
一个 psql
命令的格式是反斜杠后面紧跟一个命令动词,然后是任意参数。
参数与命令动词和其他参数以任意个空白字符间隔。
要在参数里面包含空白,你必须用单引号把它包围起来。
要在这样的参数里包含单引号,前面加一个反斜杠。
任何包含在单引号里的东西会被进一步进行类
C 的替换,把 \n (new line),\t (tab),
\digits, \0digits, 和 \0xdigits
(给出的十进制,八进制,或十六进制码的字符)替换掉。
如果一个不带引号的参数以冒号(:)开头,
它会被当作一个psql
变量,并且该变量的值会最终成为真正的参数值。
(译注:类似 ecpg 和 pl/pgsql
的变量用法。)
用反引号 ("backticks" `)
包围的内容被当作一个命令行传入
shell。
该命令的输出(删除了结尾的新行)被当作参数值。上面描述的逃逸(字符)序列在反引号里也生效。
有些命令以一个 SQL
标识的名称(如,一个表名)为参数。
这些参数遵循 SQL
语法关于双引号的规则:
不带双引号的标识强制成小写,
而双引号保护字母不受大小写转换,并且允许在标识符中使用空白。
在双引号中,成对的双引号在结果名字中分析成一个双引号。比如,
FOO"BAR"BAZ 解析成 fooBARbaz,而
"A weird"" name" 变成 A weird"
name。 name.
对参数的分析在碰到另一个不带引号的反斜杠时停止。
这里会认为是一个新的元命令的开始。特殊序列
\\
(双反斜杠)标识参数的结尾并将继续分析后面的
SQL
命令(如果存在的话)。这样
SQL 和
psql命令可以自由的在一行里面混合。
但是在任何情况下,一条元命令的参数不能延续超过行尾。
下列元命令是已定义的:
如果省略
username,则假设是当前用户名。
作为一条特殊规则,不带任何参数运行\connect
将以缺省用户身份与缺省数据库连接(正如你不带任何参数运行
psql 一样。)
如果联接失败(用户名错,访问拒绝等),那么将保留前面的联接--当且仅当在
psql
处于交互模式下如此。
如果运行的是非交互的脚本,处理会马上停止,并返回一个错误。
选择这样的区别是一方面为用户使用方便考虑,另一方面为保证脚本不会碰巧操作了错误的数据库的安全机制考虑的。
这条命令的语法是模拟
SQL COPY
命令的。(参考它的描述获取细节。)
要注意的是由此而来,有一些特殊的分析规则应用于\copy
命令。
尤其是变量替换规则和反斜杠代换规则不起作用。
从\d+ 来的命令也是一样的,只不过还显示与表的列关联的注解。
=>\dd version
Object descriptions
Schema | Name | Object | Description ------------+---------+----------+---------------------------
pg_catalog | version | function | PostgreSQL version string (1 row)
可以用COMMENT SQL
命令生成对对象的描述。
如果声明了
pattern,那么只列出匹配模式的对象。
然后根据一般的psql规则重新分析查询缓冲区, 这时整个缓冲区当作一个单行。 (因此你无法用这个方法制作“脚本”,用\i 做脚本。) 这还意味着 如果该查询以分号结尾(或者包含分号),它就会马上被执行。否则它只是在查询 缓冲区里等待。
=>\echo `date` Tue Oct 26 21:40:57 CEST 1999
foo=>\lo_import '/home/peter/pictures/photo.xcf' 'a picture of me' lo_import 152801
注意这条命令与服务器端的
lo_import
有一些区别,因为这条命令是本地用户在本地文件系统上操作,
而不是以服务器用户在服务器文件系统上操作。
"查询结果"包括所有表,命令响应和从数据库服务器来的提示, 同样还有各种各样查询数据库的反斜杠命令的输出(如\d),但是没有错误信息。
可调节的打印选项有:
"Unaligned" (不对齐)把一条记录的所有字段都输出到一行, 用当前有效的域分隔符分隔。这主要用于生成那些要被其他程序读取的输出(tab分隔,逗号分隔)。 "Aligned" (对齐)模式是标准的,人类可读的,格式化好了的文本输出,也是缺省。 "HTML" 和 "LaTeX" 模式把表输出为可用于文档里的对应标记语言。它们还不是完整的文档! (可能对于 HTML 变化还不是太大,但是在 LaTeX 里,你必须有一个完整的文档包装器。)
所有四种输出模式都支持扩展格式。
如果关闭了分页器,则不使用它,如果打开了,程序只在需要的时候使用分页器,也就是说,
输出是到终端,而且那个表很可能无法与屏幕匹配。
(psql
在决定何时分页时不是很完美。)\pset
pager
开关分页器。我们也可以把分页器设置为
always,导致我们在任何情况下都使用分页器。
可以在 "Examples 例子"
节看到这些不同格式输出的示例。
有效的变量名可以包含字符,数字和下划线。
参阅下面的 "Variables
变量" 获取细节。
尽管你可以设置任何变量为任意值,
psql对一些变量特殊对待。它们在关于变量的节里面有文档。
命令grant(7) 和revoke(7)
用于设置访问权限。
参阅grant(7)
获取更多信息。
这是\dp("显示权限")的别名。
各种\d 命令都接受一个
pattern
参数,声明要显示的对象名字。*
表示"任何字符序列",
而 ?
表示"任何单个字符"。(这个表示法和
Unix 的 shell
文件名模式兼容。)
高级用户也可以使用正则表达式表示法,比如字符表,[0-9]
这样的东西来匹配"任意数字"。
要让任何这些模式匹配字符可以安字面方式解析,那就应该用双引号包围它们。
一个包含(无引号的)句点的模式会被解析承一个模式名的模式后面跟着一个对象名的模式。
比如,\dt foo*.bar*
显示所有以foo
开头的模式里的以 bar
开头的表名字。
如果没有出现句点,那么这个模式只匹配在当前模式搜索路径中可见的对象。
如果完全省略 pattern
参数, 那么\d
命令显示所有在当前模式搜索路径中可见的对象。
要查阅在数据库中的所有对象,使用模式
*.*。
psql 提供类似通常 Unix 命令 shell 那样的变量替换特性。 变量只是简单的名称/数值对, 这里的值可以是任何长度的任何值。要设置一个变量,使用 psql 元命令 \set:
testdb=>\set foo bar
testdb=>\echo :foo bar
如果你不带第二个参数调用\set,
那么只是设置这个变量而没有值。
要重置(或删除)一个变量,使用命令\unset。
psql 的内部变量可以包括任意顺序, 任意数量的字母,数字和下划线。 有一些常用变量被 psql 另眼相待。它们是一些选项设置, 这些选项在运行时可以通过改变变量的值或者改变一些应用的表现状态而改变。 尽管你可以把这些变量用于其他用途,但是我们不鼓励这么做,因为程序的特性可能会很快变得非常奇怪。 通常,所有特殊对待的变量都是由大写字母组成(可能还有数字和下划线)。 为了保证和未来的最大限度的兼容性,请避免使用这样的变量。 下面是一个所有特殊对待的变量列表。
一个附加的 psql 变量的有用特性是你可以把它们替换("代换")成正规的 SQL 语句。这样做的语法同样还是变量名前面加一个冒号(:)。
testdb=>\set foo 'my_table' testdb=>SELECT * FROM :foo;
利用这个功能的一个时髦的应用是通过使用一个随后的语句中最后插入的
OID
建立一个外键仿真场景。
另一个可能用到这个机制的地方是把一个文件的内容拷贝到一个字段里面去。
首先把文件装载到一个变量然后象上面那样处理。
testdb=>\set content '\'' `cat my_file.txt` '\'' testdb=>INSERT INTO my_table VALUES (:content);
testdb=>\set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\''
因为冒号也可以合法的出现在
SQL
命令里,便有下面规则的应用:
如果没有设置变量,字符序列
"冒号+名称"
不会被改变。
在任何情况下你都可以用反斜杠逃逸冒号以保护它免于被解释。
(变量的冒号语法是 SQL
用于嵌入查询语言的标准,如
ECPG。用于数组片段和类型转换的冒号语法是
PostgreSQL
扩展,因此有冲突。)
psql 使用的提示符可以根据你的喜好客户化。三个变量 PROMPT1,PROMPT2,和 PROMPT3 包含描述提示符的外观的字串和特殊逃逸序列。Prompt 1 是 psql 请求一个新命令时的使用的正常提示符。 Prompt 2 是在一个命令输入期待更多输入时(因为查询没有用一个分号结束或者引号没有关闭)显示的提示符。 Prompt 3 在你运行一个 SQL COPY 命令和等待你在终端上键入记录时使用。
相应的提示符变量的值是按字面打印的,除非碰到一个百分号(%)。这时某些其他的文本被替换,
替换为何物取决于下一个字符。已定义的替换是:
要在提示符里插入百分号,键入%%。缺省提示符等效于
'%/%R%# ' 用于 prompts 1 和
2,以及'>> ' 用于 prompt 3。
psql 为了编辑和检索命令行的方便支持 readline 和历史库。 命令历史存放在你的家目录的一个叫 .psql_history 的文件里, 并且当 psql 启动的时候会装载进来。 还支持 Tab 补齐,尽管该补齐逻辑并不是一个 SQL 分析器必备的。 如果因某些原因你不喜欢 tab 补齐,你可以把下面几行放在你的家目录的一个叫.inputrc 的文件里关闭这个特性:
$if psql set disable-completion on $endif(这不是 psql 的特性, 是Readline 的。参考它的文档获取更多细节。)
testdb=>\foo Field separator is "oo".
第一个例子演示了如何把一个查询分成多个行进行输入。注意提示符的变化:
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)
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
Postgresql 中文网站 何伟平 <laser@pgsqldb.org>
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | Application |