|
psql描述与一个数据库联接psql 是一个普通的 PostgreSQL 客户端应用。为了与一个数据库联接,你需要知道你的目标数据库, 服务器的主机名和端口号以及你希望以 哪个用户的身份进行联接等信息。我们可以通过命令行参数告诉 psql 这些信息,分别是 -d , -h , -p ,和 -U 。 如果有个参数不属于任何选 项开关,那么它会被解释成数据库名 (或者是用户名-如果数据库名称也给出了.)。 不是所有这些选项都是必须的,缺省的也可以。如 果你省略主机名, psql 将通过 Unix 域套接字与本地主机的服务器相联。 缺省的端口号是编译时确定的。因为数据库服务器使用同样的缺省值, 所以在大多数设置下,你可能不需要声明端口号。 缺省的用户名是你的 Unix 用户名,与数据库同名。 要注意的是你不能用任意用户名与 任何数据库相联。你的数据库管理员应该告诉你你的访问权限。 你可以通过设置几个环境变量 PGDATABASE , PGHOST , PGPORT 和 PGUSER 为对应的值的方法节约几次敲击。 如果因为任何原因而无法与数据库相联 (例如,权限不够,postmaster 没有运行等), psql 将返回一个错误并退出。 输入查询通常状况下, psql 提供一个带有 psql 正在与之联接的接数据库名的,后缀 "=>"的提示符.例如, $ 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 可用于管理或书写脚本的原因。 元命令更常见的叫法是斜杠或反斜杠命令。 一个 psql 命令的格式是反斜杠 后面紧跟一个命令动词,然后是任意参数. 参数与命令动词和其他参数以任意个空白字符间隔. 要在参数里面包含空白,你必须用单引号把它包围起来。 要在这样的参数里包含单引号,前面加一个反斜杠。 任何包含在单引号里的东西 会被进一步进行类 C 的替换,把 \n (新行), \t (tab), \ digits , \0 digits 和 \0x digits (给出的十进制,八进制,或十六进制码的字符)替换掉。 如果一个不带引号的参数以冒号( : ) 开头,它会被当作一个变量,并且该变量的值会最终成为真正的参数值。 (译注:类似 ecpg 和 pl/pgsql 的变量用法。) 用“反勾号” ( "backticks" ` ) 引起的内容被当作一个命令行传入 shell。 该命令的输出(删除了结尾的新行)被当作参数值。上面描述 的转意(字符)序列在反勾号里也生效。(译注:与 shell 程序类似) 有些命令以一个 SQL 标识的名称(如,一个表名)为参数。 这些参数遵循 SQL 语法关于双引号的规则: 不带双引号的标识强制成小写。 对于所有其他命令,双引号没有特殊含义并且将被当成参数的一部分。 对参数的分析在碰到另一个不带引号的反斜杠时停止。 这里会认为是一个新的元命令的开始。特殊序列 \\ (双反斜杠)标识参数的结尾并将继续分析后面的 SQL 查询(如果存在的话)。这样 SQL 和 psql 命令可以自由的在一行里面混合。 但是在任何情况下,一条元命令的参数不能延续超过行尾。 下列元命令是已定义的:
命令行选项如果配置好了, psql 理解标准的 Unix 短选项和 GNU 风格的长选项。后者不是在所有系统上都能获得。
高级特性变量psql 提供类似通常 Unix 命令 shell 那样的变量替换特性。 这个特性是新引入的还不是很复杂,但是我们计划在今后扩展它。 变量只是简单的名称/数值对, 这里的值可以是任何长度的任何值。要设置一个变量,使用 psql 元命令 \set : testdb=> \set foo bar 把变量 "foo" 设置为值 "bar" 。 要检索变量的内容,在变量名前面放上冒号然后把它用在任意斜杠命令里: testdb=> \echo :foo bar
如果你不带第二个参数调用 \set , 那么只是设置这个变量而没有值。 要重置(或删除)一个变量,使用命令 \unset 。 psql 的内部变量可以包括任意顺序, 任意数量的字母,数字和下划线。 有一些常用变量被 psql 另眼相待。它们是一些选项设置,这些选 项在运行时可以通过改变变量的值或者改变一些应用的表现状态而改变。 尽管你可以把这些变量用于其他用途,但是我们不鼓励这么 做,因为程序的特性可能会很快变得非常奇怪。 通常,所有特殊对待的变量都是由大写字母组成(可能还有数字和下划线)。 为了保证 和未来的最大限度的兼容性,请避免使用这样的变量。 下面是一个所有特殊对待的变量列表。
SQL 代换一个附加的 psql 变量的有用特性是你可以把它们替换 ( "代换" )成正规的 SQL 语句。这样做的语法同样还是变量名前面加一个冒号 ( : )。 testdb=> \set foo 'my_table' testdb=> SELECT * FROM :foo; 将会查询表 my_table 。变量的值是逐字拷贝的, 所以它甚至可以包含不对称的引号或反斜杠命令。 你必须保证你输入的东西是有意义 的。变量替换将不会在引起来的 SQL 语句里面发生。 利用这个功能的一个时髦的应用是通过使用一个随后的语句中最后插入的 OID 建立一个外键仿真(scenario ?)。 另一个可能用到这个机制的地方是把一个文件的内容拷贝到一个域里面去。 首先把文件装载到一个变量然后象上面那样处理。 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 用于嵌入查询语言的标准,如 ecpg 。用于数组片段和类型转换的冒号语法是 PostgreSQL 扩展,因此有冲突。) 提示符psql 使用的提示符可以根据你的喜好客户化。三个变量 PROMPT1 , PROMPT2 , 和 PROMPT3 包含描述提示符的外观的字串和特殊转意序列。 Prompt 1 是 psql 请求一个新查询时的使用的正常提示符。 Prompt 2 是在一个查询输入期待更多输入时(因为查询没有用一个分号 结束或者引号没有关闭)显示的提示符。 Prompt 3 在你运行一个 SQL COPY 命令和等待你在终端上键入记录时使用。 相应的提示符变量的值是按字面打印的,除非碰到一个百分号( "%" )。这时某些其他的文本被替换, 替换为何物取决于下一个字符。已定义的替换是:
要在提示符里插入百分号,键入 %% 。缺省提示符等效于 '%/%R%# ' 用于 prompts 1 和 2,以及 '>> ' 用于 prompt 3。
杂项psql 正常结束时向 shell 返回 0, 发生自身致命错误(用光内存,文件没有找到)时返回 1, 与后端联接出错和会话不是交互的时候返回 2,如果在一个脚本里面发生错误或者变量 ON_ERROR_STOP 被设置了返回 3。 在启动之前, psql 试图读取并执行文件 $HOME/.psqlrc 里的命令。 这个特性可以用来按口味设置客户端或者服务器(用 \set 和 SET 命令)。 GNU readlinepsql 为了编辑和检索命令行的方便支持 readline 和历史库。 命令历史存放在你的家目录的一个叫 .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 ... 然后你不得不重新编译 psql (不必重新编译整个代码树)。 GNU readline 库可以从 GNU 计划的 FTP 服务器 ftp://ftp.gnu.org 得到。 例子
第一个例子演示了如何把一个查询分成多个行进行输入。注意提示符的变化: 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 | 这里你决定把提示符变成更有趣的东西: 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
附录虫子和说明
|