psql
名稱
psql ― PostgreSQL 交互終端
語法
psql [ options ] [ dbname [ user ] ]
概述
psql 是一個以基于終端的 PostgreSQL 前端。它允許你交互地輸入查詢,將它們提交給 PostgreSQL 然后閱讀查詢結(jié)果.輸入也可以來自一個文件。另外,它還提供一些專有命令(meta-commands)和許多類似 shell 風格的特性供你書寫腳本和完成非常廣泛任務(wù)的自動化工作。
描述
與一個數(shù)據(jù)庫聯(lián)接
psql 是一個普通的 Postgres 客戶端應(yīng)用。為了與一個數(shù)據(jù)庫聯(lián)接,你需要知道你的目標數(shù)據(jù)庫,服務(wù)器的主機名和端口號以及你希望以哪個用戶的身份進行聯(lián)接等信息。我們可以通過命令行參數(shù)告訴psql 這些信息,分別是 -d,-h,-p,和 -U。如果有個參數(shù)不屬于任何選項開關(guān),那么它會被解釋成數(shù)據(jù)庫名(或者是用戶名-如果數(shù)據(jù)庫名稱也給出了.)。不是所有這些選項都是必須的,缺省的也可以。如果你省略主機名,psql 將通過域套接字與本地主機的服務(wù)器相聯(lián)。缺省的端口號是編譯時確定的。因為數(shù)據(jù)庫服務(wù)器使用同樣的缺省值,所以在大多數(shù)設(shè)置下,你可能不需要聲明端口號。缺省的用戶名是你的 Unix 用戶名,與數(shù)據(jù)庫同名。要注意的是你不能用任意用戶名與任何數(shù)據(jù)庫相聯(lián)。你的數(shù)據(jù)庫管理員應(yīng)該告訴你你的訪問權(quán)限。你可以通過設(shè)置幾個環(huán)境變量 PGDATABASE,PGHOST,PGPORT,PGUSER 為對應(yīng)的值的方法節(jié)約幾次敲擊。
如果因為任何原因而無法與數(shù)據(jù)庫相聯(lián)(例如,權(quán)限不夠,postmaster 沒有運行等),psql 將返回一個錯誤并退出。
輸入查詢
通常狀況下,psql 提供一個帶有 psql 正在與之聯(lián)接的接數(shù)據(jù)庫名的,后綴 "=>" 的提示符.例如,
$ 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 查詢.通常,輸入的行將在查詢終止分號出現(xiàn)時送到后端.一行的終止并不結(jié)束查詢!因此查詢可以因清晰起見跨越好幾行。如果查詢發(fā)送出去而且沒有錯誤,查詢結(jié)果會顯示在屏幕上。
當查詢正在進行時,psql 同樣還輪詢由 LISTEN 和 NOTIFY 生成的異步通知信號.
psql 專有命令
你在 psql 里輸入的任何以不帶引號的反斜杠('/')開頭的東西都是psql 專有命令,這些命令是由 psql 自己處理的。這些命令也是令 psql可用于管理或書寫腳本的原因。專有命令更常見的叫法是斜杠或反斜杠命令。
一個 psql 命令的格式是反斜杠后面緊跟一個命令動詞,然后是任意參數(shù).參數(shù)與命令動詞和其他參數(shù)以任意個空白字符間隔.
要在參數(shù)里面包含空白,你必須用單引號把它包圍起來。要在這樣的參數(shù)里包含單引號,前面加一個反斜杠。任何包含在單引號里的東西會被進一步進行類 C 的替換,把 /n (新行),/t (tab), /digits,/0digits 和 /0xdigits (給出的十進制,八進制,或十六進制碼的字符)替換掉。
如果一個不帶引號的參數(shù)以冒號(:)開頭,它會被當作一個變量,并且該變量的值會最終成為真正的參數(shù)值。(譯注:類似嵌入SQL的變量用法。)
用“反勾號” (backticks(`))引起的內(nèi)容被當作一個命令行傳入 shell。該命令的輸出(刪除了結(jié)尾的新行)被當作參數(shù)值。上面描述的轉(zhuǎn)意(字符)序列在反勾號里也生效。(譯注:與 shell 程序類似)
有些命令以一個 SQL 標識的名稱(如,一個表名)為參數(shù)。這些參數(shù)遵循SQL 語法關(guān)于雙引號的規(guī)則:不帶雙引號的標識強制成小寫。對于所有其他命令,雙引號沒有特殊含義并且將被當成參數(shù)的一部分。
對參數(shù)的分析在碰到另一個不帶引號的反斜杠時停止。這里會認為是一個新的專有命令的開始。特殊序列 // (雙反斜杠)標識參數(shù)的結(jié)尾并將繼續(xù)分析后面的SQL 查詢(如果存在的話)。這樣 SQL 和 psql 命令可以自由的在一行里面混合。但是在任何情況下,一條專有命令的參數(shù)不能延續(xù)超過行尾。
下列專有命令是已定義的:
/a
如果目前的表輸出格式是不對齊的,切換成對齊的。如果是對齊的,切換成不對齊。這條命令是為了向后兼容。參閱 /pset 獲取一個通用的解決方法。
/C [ title ]
把正在打印的表的標題設(shè)置為一個查詢的結(jié)果或者取消這樣的設(shè)置。這條命令等效于 /pset title title。(這條命令的名稱源于“caption”,因為以前只是用于在一個HTML 表里面設(shè)置標題。)
/connect (or /c) [ dbname [ username ] ]
與一個新的數(shù)據(jù)庫建立一個聯(lián)接,使用/不用一個用戶名。前面的聯(lián)接將關(guān)閉。如果 dbname 是 -,那么就假設(shè)是當前數(shù)據(jù)庫名稱。
如果省略 username,則假設(shè)是當前用戶名。
作為一條特殊規(guī)則,不帶任何參數(shù)運行 /connect 將以缺省用戶身份與缺省數(shù)據(jù)庫連接(正如你不帶任何參數(shù)運行psql 一樣。)
如果聯(lián)接失敗(用戶名錯,訪問拒絕等),那么將保留前面的聯(lián)接--僅僅是在psql 處于交互模式下如此。如果運行的是非交互的腳本,處理會馬上停止,并返回一個錯誤。選擇這樣的區(qū)別是一方面為用戶使用方便考慮,另一方面為保證腳本不會碰巧操作了錯誤的數(shù)據(jù)庫的安全機制考慮的。
/copy table [ with oids ] { from | to } filename | stdin | stdout [ with delimiters 'characters' ] [ with null as 'string' ]
執(zhí)行前端(客戶端)拷貝.這是一個運行 SQLCOPY 命令的操作,不同的是 SQL COPY 是后端在讀寫指明的文件,對應(yīng)地需要訪問后端和特殊的用戶權(quán)限,以及受到后端對文件系統(tǒng)的訪問權(quán)限的限制,而在此命令中 psql 讀寫文件并通過一個本地的文件系統(tǒng)路由從后端中取出或?qū)懭氲臄?shù)據(jù).
這條命令的語法是模擬SQL COPY 命令的,參考它的描述獲取細節(jié)。要注意的是由此而來,有一些特殊的分析規(guī)則應(yīng)用于 /copy 命令。尤其是變量替換規(guī)則和反斜杠代換規(guī)則不起作用。
小技巧:此操作不象 SQLCOPY 命令這樣高效,因為所有數(shù)據(jù)必須通過(客戶/服務(wù)器))client/server IP 或套接字聯(lián)接.對于大數(shù)據(jù)量的操作,另一種方法更可行。
注意:注意在前端和后端拷貝時對 stdin 和 stdout 的解釋的區(qū)別:在前端拷貝時,這些總是指psql 的輸入和輸出流。在后端拷貝時 stdin 來自 COPY 本身的標準輸入(比如,一個帶有-f 選項的腳本),而 stdout 指的是查詢輸出流(參閱下面的 /o 專有命令)。
/copyright
顯示 PostgreSQL 的版權(quán)和版本信息。
/d relation
顯示 relation (可以是表,視圖,索引或序列)的所有列,如果存在地話,它們的類型和存在的任何特殊屬性(象 NOT NULL 或缺省等)也顯示出來。如果實際上這個關(guān)系是一個表,任何已定義的索引也會列出來。如果該關(guān)系是一個視圖,視圖的定義也會顯示出來。
從 /d+ 來的命令也是一樣的,只不過還顯示與表的列關(guān)聯(lián)的注解。
注意:如果不帶任何參數(shù)調(diào)用 /d,等效于 /dtvs,將顯示一個所有表,視圖和序列的列表。這完全是出于方便的考慮。
/da [ pattern ]
列出所有可用聚集函數(shù),以及它們操作的數(shù)據(jù)類型。如果聲明了 pattern (一個規(guī)則表達式),那么只顯示匹配(規(guī)則表達式)的聚集函數(shù)。
/dd [ object ]
顯示對 object (可以是一個規(guī)則表達式)的描述,如果沒有給出參數(shù),顯示所有對象。(“對象”包括聚集,函數(shù),操作符,類型,關(guān)系(表,視圖,索引,序列,大對象),規(guī)則和觸發(fā)器。)例如:
=> /dd version
Object descriptions
Name | What | Description
---------+----------+---------------------------
version | function | PostgreSQL version string
(1 row)
可以用 COMMENT ONSQL 命令生成對對象的描述。
注意:PostgreSQL 在 pg_description 系統(tǒng)表里存儲對象描述。
/df [ pattern ]
列出所有可用函數(shù),以及它們的參數(shù)和返回的數(shù)據(jù)類型。如果聲明了 pattern (一個規(guī)則表達式),那么只顯示匹配(規(guī)則表達式)的函數(shù)。如果使用了 /df+ 的形式,每個函數(shù)的附加信息,包括語言和描述也會顯示出來。
/distvS [ pattern ]
這不是一個實際上的命令名稱:字母 i,s,t,v,S 分別代表索引(index),序列(sequence),表(table),視圖(view)和系統(tǒng)表(system table)。你可以以任意順序聲明任意或者所有這些字母獲得這些對象的一個列表,以及它們的所有者。
如果聲明了 pattern,它是一個規(guī)則表達式把輸出限制在那些匹配的條目上。如果我們在命令名稱后面加一個 "+" ,那么每個對象存在的相關(guān)描述也會顯示出來。
/dl
這是 /lo_list 的別名,顯示一個大對象的列表。
/do [ name ]
列出所有可用操作符,以及它們的操作數(shù)和返回的數(shù)據(jù)類型。如果聲明了 pattern ,那么只顯示匹配的操作符。?/dd>
/dp [ pattern ]
這是一個 /z 的別名,包括它是為了保留其巨大的記憶性價值(顯示權(quán)限"display permissions")。/dT [ pattern ]
列出所有數(shù)據(jù)類型或那些匹配 pattern 的。這條命令的 /dT+ 形式顯示更多信息。
/edit (or /e) [ filename ]
如果聲明了 filename,則編輯此文件并且在編輯器退出后將其內(nèi)容拷貝回查詢緩沖區(qū)。如果沒有給出參數(shù),則把當前查詢緩沖區(qū)內(nèi)容拷貝到一個臨時文件然后以相同方式編輯。
然后根據(jù)一般的psql 規(guī)則重新分析查詢緩沖區(qū),這時整個緩沖區(qū)當作一個單行。(因此你無法用這個方法制作“腳本”,用 /i 做腳本。)這還意味著如果該查詢以分號結(jié)尾(或者包含分號),它就會馬上被執(zhí)行。否則它只是在查詢緩沖區(qū)里等待。
小技巧:psql 搜索環(huán)境變量 PSQL_EDITOR,EDITOR 和 VISUAL(以此順序)查找要用到哪個編輯器。如果上面的都沒有設(shè)置,使用 /bin/vi。
/echo text [ ... ]
向標準輸出打印參數(shù),用一個空格分隔并且最后跟著一個新行。這個特性在顯示腳本的輸出時會有用。例如:
=> /echo `date`
Tue Oct 26 21:40:57 CEST 1999
如果第一個參數(shù)是一個無引號的 -n,那么不會寫出結(jié)尾的新行。
小技巧:如果你使用 /o 命令重定向你的查詢的輸出,你可能會用 /qecho 取代這條命令。
/encoding [ encoding ]
如果你使用多字節(jié)編碼,設(shè)置客戶端編碼方式。不帶參數(shù)時,這條命令顯示當前的編碼方式。
/f [ string ]
為不對齊的查詢輸出設(shè)置域分隔符。缺省時是“|”(一個“管道”符號)。參閱 /pset 獲取設(shè)置輸出選項的通用方法。
/g [ { filename | |command } ]
把當前的查詢輸入緩沖區(qū)的內(nèi)容發(fā)送給后端并且把輸出輸出到可選的 filename 或者把輸出定向到一個獨立的 Unix shell 執(zhí)行 command。單獨一個 /g 實際上等效于一個分號。一個帶有參數(shù)的 /g 是“一次性”的 /o 命令的代用品。
/help (or /h) [ command ]
給出指定 SQL 命令的語法幫助。如果沒有給出 command那?span CLASS="APPLICATION">psql 將列出可獲得語法幫助的所有命令。如果 command 是一個星號("*"),則顯示所有SQL命令的語法幫助。
注意:為簡化敲擊,包含多個單字的命令不需要引起。因此鍵入 /help alter table 是正確的。
/H
打開 HTML 查詢輸出格式。如果 HTML 格式已經(jīng)打開,則切換回缺省的對齊的文本格式。這個命令是為了兼容和方便,參閱 /pset 獲取設(shè)置其他輸出選項的內(nèi)容。
/i filename
從文件 filename 中讀取并把其內(nèi)容當作從鍵盤輸入的那樣執(zhí)行查詢。
注意:如果你想在屏幕上看到讀入的行,你必須對所有行設(shè)置變量 ECHO 。
/l (or /list)
列出服務(wù)器上所有數(shù)據(jù)庫和它們的所有者。在命令名稱后面加一個 "+" 還可以看到對數(shù)據(jù)庫的任何描述。如果你的Postgres 節(jié)點是帶著多字節(jié)支持編譯的,還可以看到每個數(shù)據(jù)庫的編碼方式。
/lo_export loid filename
從數(shù)據(jù)庫里讀取 OID 為 loid 的大對象并把她寫到 filename 里。注意這個功能與服務(wù)器函數(shù) lo_export 有些微小的區(qū)別, lo_export 運行時帶著運行數(shù)據(jù)庫服務(wù)器的用戶權(quán)限,而且是在服務(wù)器的文件系統(tǒng)上。
小技巧:使用 /lo_list 查看大對象的 OID。
注意:參閱變量 LO_TRANSACTION 的描述獲取關(guān)于所有大對象操作的重要信息。
/lo_import filename [ comment ]
把文件存儲為一個 PostgreSQL “大對象”。可以帶著一個該對象的注解選項。例如:
foo=> /lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
響應(yīng)表明此大對象得到一個對象標識 152801,如果你還想訪問該對象,就應(yīng)該把這個對象標識記住。因此,我們建議總是給每個對象關(guān)聯(lián)一個人類可讀的注解。那樣就可以用 /lo_list 命令看到這些注解。
注意這條命令與服務(wù)器端的 lo_import 有一些區(qū)別,因為這條命令是本地用戶在本地文件系統(tǒng)上操作,而不是以服務(wù)器用戶在服務(wù)器文件系統(tǒng)上操作。
注意:參閱變量 LO_TRANSACTION 的描述獲取關(guān)于所有大對象操作的重要信息。
/lo_list
顯示一個目前存儲在該數(shù)據(jù)庫里的所有 PostgreSQL “大對象”和它們的所有者的列表。
/lo_unlink loid
從數(shù)據(jù)庫里刪除 OID 是 loid 的大對象。
小技巧:使用 /lo_list 查找大對象的 OID。
注意:參閱變量 LO_TRANSACTION 的描述獲取關(guān)于所有大對象操作的重要信息。
/o [ {filename | |command} ]
把后面的查詢結(jié)果保存到文件 filename 里或者把后面的查詢結(jié)果定向到一個獨立的 Unix shell 執(zhí)行 command。如果沒有聲明參數(shù),查詢輸出重置為 stdout。
“查詢結(jié)果”包括所有表,命令響應(yīng)和從數(shù)據(jù)庫服務(wù)器來的提示,同樣還有各種各樣查詢數(shù)據(jù)庫的反斜杠命令的輸出(如 /d),但是沒有錯誤信息。
小技巧:要分散查詢結(jié)果之間的輸出,用 /qecho。
/p
打印當前查詢緩沖區(qū)到標準輸出.
/pset parameter [ value ]
這條命令設(shè)置影響查詢結(jié)果表輸出的選項。parameter 描述要設(shè)置的選項是哪一個。value 的語意也取決于它。
可調(diào)節(jié)的打印選項有:
format
設(shè)置輸出格式為 unaligned,aligned,html 或 latex 之一。允許使用唯一的縮寫。(這也意味著一個字母就夠了。)
“Unaligned” (不對齊)把一條記錄的所有域都都輸出到一行,用當前有效的域分隔符分隔。這主要用于生成那些要被其他程序讀取的輸出(tab分隔,逗號分隔)。“Aligned”(對齊)模式是標準的,人類可讀的,格式化好了的文本輸出,也是缺省。“HTML” 和“LaTeX” 模式把表輸出為可用于文檔里的對應(yīng)標記語言。它們還不是完整的文檔!(可能對于HTML 變化還不是太大,但是在 LaTeX 里,你必須有一個完整的文檔包裝器。)
border
第二個參數(shù)必須是一個數(shù)字。通常,數(shù)字越大,表就有越寬的邊界和越多的線,但是這個參數(shù)取決于實際的格式。在HTML 模式里,這個參數(shù)會直接翻譯成 border=... 屬性,在其他的模式里,只有值 0 (無邊界),1 (內(nèi)部分隔線)和 2 (表框架)有意義。
expanded (or x)
在正常和擴展格式之間切換。當打開擴展格式時,所有的輸出都是兩列,域名稱在左,數(shù)據(jù)在右。這個模式在數(shù)據(jù)無法放進通常的“水平”模式的屏幕時很有用。
所有四種輸出模式都支持擴展模式。
null
第二個參數(shù)是一個字串,用以代表域的值為 null 打印。缺省是什么都不打,這樣很容易和類似一個空字串混淆。因此,我們可能選擇 /pset null "(null)"。
fieldsep
聲明在非對齊模式時的域分隔符。這樣我們就可以創(chuàng)建其他程序希望的 tab- 或逗號分隔的輸出。要設(shè)置 tab 域分隔符,鍵入 /pset fieldsep "/t"。缺省域分隔符是“|” (一個“管道”符號)。
recordsep
聲明在非對齊模式時的記錄分隔符。缺省是新行字符。
tuples_only (or t)
在完全顯示和只顯示記錄之間切換。完全顯示將顯示象列頭,標題和各種腳注等信息。只顯示記錄模式將只顯示實際的表數(shù)據(jù)。
title [ text ]
為任何隨后打印的表設(shè)置標題。這個參數(shù)可以用于給你的輸出一個描述性標記。如果不帶參數(shù),重置標題。
注意:以前這個參數(shù)只影響HTML 模式,現(xiàn)在你可以在任何輸出模式里設(shè)置標題。
tableattr (or T) [ text ]
允許你聲明放在 HTML table 標記里的任何屬性。例如,可以是 cellpadding 或者 bgcolor。注意你可能不需要在這里聲明 border,因為已經(jīng)在 /pset border 里用過了。
pager
激活分頁器進行表輸出。如果設(shè)置了環(huán)境變量 PAGER,輸出被定向到指定程序,否則使用 more。
不管怎樣,psql 只在它認為需要的時候使用分頁器。這意味著輸出是到終端去的而那個表很可能無法與屏幕匹配。因為打印過程的模塊化天性,我們不可能每次都準確預(yù)計出實際打印的行數(shù)。因此psql 在決定何時分頁時可能顯得不是很有識別力。
可以在 Examples 節(jié)看到這些不同格式輸出的示例。
小技巧:有很多用于 /pset 的快速命令。參閱 /a,/C,/H,/t,/T 和 /x。
注意:無參數(shù)運行 /pset 是錯誤的。以后這樣調(diào)用將顯示當前打印選項狀態(tài)。
/q
退出 psql 程序.
/qecho text [ ... ]
這條命令等效于 /echo,區(qū)別使所有輸出將寫入由 /o 設(shè)置的輸出通道。
/r
重置(清空)查詢緩沖區(qū)。
/s [ filename ]
將命令行歷史打印出或是存放到 filename。如果省略 filename,歷史將輸出到標準輸出。這個選項只有在psql 配置成使用 GNU 歷史庫后才生效。
注意:對于 psql v7.0,這個( GNU 歷史庫)不再是必須的了,實際上,在程序結(jié)束時自動保存命令行歷史。每次psql 啟動都會裝載命令行歷史。
/set [ name [ value [ ... ]]]
設(shè)置內(nèi)部變量 name 為 value 或著如果給出了多于一個值,設(shè)置為所有這些值的聯(lián)接結(jié)果。如果沒有給出第二個參數(shù),只設(shè)變量不設(shè)值。要重置一個變量,使用 /unset 命令。
有效的變量名可以包含字符,數(shù)字和下劃線。參閱關(guān)于psql 變量的章節(jié)獲取細節(jié)。
盡管你可以設(shè)置任何變量為任意值,psql 對一些變量特殊對待。它們在關(guān)于變量的節(jié)里面有文檔。
注意:這條命令是完全和 SQL 命令 SET不一樣的。
/t
切換輸出的列/字段名的信息頭和行記數(shù)腳注。這條命令等效于 /pset tuples_only,提供主要為了方便。
/T table_options
允許你在使用 HTML 輸出模式時聲明放在 table 標記里的選項。這條命令等效于 /pset tableattr table_options。
/w {filename | |command}
將當前查詢緩沖區(qū)輸出到文件 filename 或者定向到 Unix 命令 command。
/x
切換擴展行格式.等效于 /pset expanded。
/z [ pattern ]
生成一個帶有訪問權(quán)限列表的數(shù)據(jù)庫中所有表的列表。如果給出任何參數(shù),則被當成一個規(guī)則表達式,把列表輸出限制為那些可以匹配的表。
test=> /z
Access permissions for database "test"
Relation | Access permissions
----------+-------------------------------------
my_table | {"=r","joe=arwR", "group staff=ar"}
(1 row )
意思如下:
"=r": PUBLIC 擁有對此表的讀(SELECT)權(quán)限。
"joe=arwR": 用戶 joe 擁有讀,寫(UPDATE,DELETE),“追加”(INSERT)權(quán)限,以及在表上創(chuàng)建規(guī)則的權(quán)限。
"group staff=ar": 組 staff 擁有 SELECT 和 INSERT 權(quán)限。
命令 GRANT 和 REVOKE 用于設(shè)置訪問權(quán)限。
/! [ command ]
返回到一個獨立的 Unix shell 或者執(zhí)行 Unix 命令 command。參數(shù)不會被進一步解釋,shell 將看到全部參數(shù)。
/?
獲得關(guān)于反斜杠 ("/") 命令的幫助信息。
命令行選項
如果配置好了,psql 理解標準的 Unix 短選項和 GNU 風格的長選項。后者不是在所有系統(tǒng)上都能獲得。
-a, --echo-all
在讀取行時想屏幕打印所有內(nèi)容。這個選項在腳本處理時比交互模式時更有用。這個選項等效于設(shè)置變量 ECHO 為 all。
-A, --no-align
切換為非對齊輸出模式。(缺省輸出模式是對齊的。)
-c, --command query
聲明 psql 將執(zhí)行一條查詢字串,query,然后退出.這一點在 shell 腳本里很有用。
query 必須是一條完全可以被后端分析的查詢字串(也就是說,它不包含psql 特有的特性),或者是一個反斜杠命令。這樣你就不會混合SQL 和 psql 專有命令。要想混合使用,你可以把字串定向到psql 里,象這樣:echo "/x // select * from foo;" | psql。
-d, --dbname dbname
聲明想要聯(lián)接的數(shù)據(jù)庫名稱.等效于在命令行行上把 dbname 聲明為第一個無選項參數(shù).
-e, --echo-queries
聲明要聯(lián)接的數(shù)據(jù)庫名.等效于把變量 ECHO 設(shè)置為 queries。
-E, --echo-hidden
回顯由 /d 和其他反斜杠命令生成的實際查詢。如果你希望在你自己的程序里包含類似的功能,你就可以使用這個選項。這等效于在psql 里設(shè)置變量 ECHO_HIDDEN。
-f, --file filename
使用 filename 作為查詢的語句源而不是交互式讀入查詢。在處理完文件后,psql 結(jié)束。這個選項在很多方面等效于內(nèi)部命令 /i。
使用這個選項與用 psql < filename 有微小的區(qū)別。通常,兩者都回按照你預(yù)期那樣運行,但是使用 -f 打開了一些很好的特性,比如帶行號的錯誤信息。而且,使用這個選項還有可能有減小啟動負荷的機會。另一方面,如果你把所有內(nèi)容手工輸入,使用 shell 輸入定向的方式(理論上)能保證生成和你已經(jīng)得到的完全一樣的輸出(譯注:重復(fù)運行命令)。
-F, --field-separator separator
使用 separator 作為域分隔符.等效于 /pset fieldsep 或 /f。
-h, --host hostname
聲明正在運行 postmaster 的主機名.如果沒有此選項,將使用本地的Unix域套接字進行通訊.
-H, --html
打開 HTML 格式輸出。等效于 /pset format html 或 /H 命令。
-l, --list
列出所有可用的數(shù)據(jù)庫,然后退出.其他非聯(lián)接選項將被忽略.類似于內(nèi)部命令 /list。
-o, --output filename
將所有查詢輸出定向到文件 filename。這個選項等效于命令 /o。
-p, --port port
聲明被 postmaster 用于偵聽的 TCP/IP 端口或使用的缺省本地Unix主控套接字文件句柄.缺省的是環(huán)境變量 PGPORT 的值,如果沒有設(shè)置的話是編譯是聲明的端口,通常是5432。
-P, --pset assignment
允許你在命令行上以 /pset 的風格設(shè)置打印選項。要注意的是你在這里用等號分割名稱和值,而不能用空格。因此要把輸出格式設(shè)置為 LaTeX,你可以敲入 -P format=latex。
-q
聲明 psql 將"安靜地"執(zhí)行處理任務(wù).缺省時psql將打印歡迎和許多其他輸出信息。如果使用了此選項,這些都不出現(xiàn)。這在和 -c 選項一起使用時很有效.在 psql 里,你可以通過設(shè)置 QUIET 變量實現(xiàn)同樣效果。
-R, --record-separator separator
使用 separator 做為記錄分隔符。等效于 /pset recordsep 命令。
-s, --single-step
進入單步模式運行。意味著每個查詢在發(fā)往后端之前都要提示用戶,用這個選項也可以取消執(zhí)行。此選項主要用于調(diào)試腳本。
-S, --single-line
進入單行運行模式,這時每個查詢都將由換行符結(jié)束,象分號那樣。
注意:注意這個模式是給那些堅持要這個特性的人的,我們不鼓勵你這么用。實際上,如果你在一行里混合使用SQL 和專有命令,執(zhí)行的順序?qū)Σ皇炀毜挠脩舳圆豢偸乔逦摹?
-t, --tuples-only
關(guān)閉打印列名稱和結(jié)果行計數(shù)腳注等信息。完全等效于 /t。
-T, --table-attr table_options
允許你聲明放在 HTML table 標記里的選項。參閱 /pset 獲取細節(jié)。
-u
讓 psql 在和數(shù)據(jù)庫聯(lián)接之提示輸入用戶的用戶名和口令。
我們不贊成使用這個選項,因為它在概念上有漏洞。(提示輸入非缺省用戶名和提示輸入后端要求的口令是完全兩碼事。)我們鼓勵你用-U 和 -W 選項取代。
-U, --username username
以用戶 username 代替缺省用戶與數(shù)據(jù)庫聯(lián)接。(當然,你必須有這么做的權(quán)限。)
-v, --variable, --set assignment
進行一次變量分配,象內(nèi)部命令 /set 那樣。注意,如果有變量名和值的話,你必須在命令行上用等號分隔它們。要重置一個變量,去掉等號。這個分配是在啟動的很早的階段進行的,所以為內(nèi)部使用保留的變量可能被再次覆蓋。
-V, --version
顯示 psql 版本。
-W, --password
要求 psql 在與一個數(shù)據(jù)庫聯(lián)接前提示輸入口令。這個選項將在整個會話過程中有效,即使你用專有命令 /connect 改變了所聯(lián)接的數(shù)據(jù)庫。
對于版本7.0,如果后端要求口令認證,psql 自動提出一個口令提示符。因為目前這個特性是以一個“hack”為基礎(chǔ),自動識別有可能神秘地失效,因此用這個選項強制一個提示符。如果沒有聲明口令提示符而后端要求口令認證,那么聯(lián)接企圖將失敗。
-x, --expanded
打開擴展行格式模式.等效于 /x。
-X, --no-psqlrc
不讀取啟動文件 ~/.psqlrc。
-?, --help
顯示關(guān)于 psql 命令行參數(shù)的幫助。
高級特性
變量
psql 提供類似通常 Unix 命令 shell 那樣的變量替換特性。這個特性是新引入的還不是很復(fù)雜,但是我們計劃在今后擴展它。變量只是簡單的名稱/值的對,這里的值可以是任何長度的任何值。要設(shè)置一個變量,使用psql 專有命令 /set:
testdb=> /set foo bar
把變量“foo” 設(shè)置為值“bar”。要檢索變量的內(nèi)容,在變量名前面放上冒號然后把它用在任意斜杠命令里:
testdb=> /echo :foo
bar
注意:/set 的參數(shù)服從和其他命令一樣的替換規(guī)則。因此你可以構(gòu)造有趣的引用,象 /set :foo 'something' 這樣,獲得分別象Perl 或 PHP那樣有名的“軟鏈接”(“soft links”)或“變量 變量”(“variable variables”)。不幸的是(或者 萬幸的?),用這些構(gòu)造不能做任何有用的事情。另一方面,/set bar :foo 是一個非常有效的拷貝變量的方法。
如果你不帶第二個參數(shù)調(diào)用 /set,那么只是設(shè)置這個變量而沒有值。要重置(或刪除)一個變量,使用命令 /unset。
psql 的內(nèi)部變量可以包括任意順序,任意數(shù)量的字母,數(shù)字和下劃線。有一些常用變量被psql 另眼相待。它們是一些選項設(shè)置,這些選項在運行時可以通過改變變量的值或者改變一些應(yīng)用的表現(xiàn)狀態(tài)而改變。盡管你可以把這些變量用于其他用途,但是我們不鼓勵這么做,因為程序的特性可能會很快變得非常奇怪。通常,所有特殊對待的變量都是由大寫字母組成(可能還有數(shù)字和下劃線)。為了保證和未來的最大限度的兼容性,請避免使用這樣的變量。下面是一個所有特殊對待的變量列表。
DBNAME
你正在聯(lián)接著的數(shù)據(jù)庫名稱。每次你與一個數(shù)據(jù)庫聯(lián)結(jié)都會設(shè)置這個值(包括程序啟動),但是可以刪除。
ECHO
如果置為“all”,輸入的或者來自一個腳本的所有行在分析或執(zhí)行前都寫到標準輸出。要在程序啟動時聲明這些,使用-a 開關(guān)。如果設(shè)置為“queries”,psql 只是在查詢發(fā)送給后端之前打印出來。實現(xiàn)這個功能的命令行選項是-e。
ECHO_HIDDEN
當設(shè)置了這個變量并且一個反斜杠命令查詢數(shù)據(jù)庫時,首先顯示查詢。這樣你可以學習PostgreSQL 內(nèi)部的東西并且在你自己的程序里提供類似功能。如果你設(shè)置該變量的值為“noexec”,查詢只是顯示出來但是實際上不發(fā)送到后端和執(zhí)行。
ENCODING
當前的客戶端多字節(jié)編碼方式。如果你沒有設(shè)置使用多字節(jié)字符,這個變量將總是包含“SQL_ASCII”。
HISTCONTROL
如果這個變量設(shè)置為 ignorespace,以空格開始的行將不會進入歷史列表。如果設(shè)置為變量 ignoredups,與以前歷史記錄里匹配的行也不會進入歷史記錄。值 ignoreboth 是上面兩個的結(jié)合。如果刪除此變量或者其值為任何與上面的值不同的東西,所有交互模式讀入的行都被保存入歷史列表。
注意:這個特性是無恥地從 bash 里剽竊來的。(譯注:老兄,太客氣了吧,要不freesoft有何意義?!:)
HISTSIZE
存在命令歷史里的命令的個數(shù)。缺省值是 500。
注意:這個特性是無恥地從 bash 里剽竊來的。:-)
HOST
當前你正聯(lián)接的數(shù)據(jù)庫服務(wù)器主機。這是在每次你與數(shù)據(jù)庫聯(lián)接時(包括程序啟動)設(shè)置的,但是可以刪除。
IGNOREEOF
如果刪除此變量,向一個交互的 psql 會話發(fā)送一個 EOF 字符(通常是 Control-D)將終止應(yīng)用。如果設(shè)置為一個數(shù)字值,那么在應(yīng)用終止前該數(shù)值的 EOF 字符將被忽略。如果設(shè)置了此變量但是沒有數(shù)字值,缺省是 10。
注意:這個特性是無恥地從 bash 里剽竊來的。
LASTOID
最后影響的 oid 值,即為從一條 INSERT 或 lo_insert 命令返回的值。此變量只保證在下一條 SQL 命令的結(jié)果顯示之前有效。
LO_TRANSACTION
如果你使用 PostgreSQL 大對象接口存儲無法放進一條記錄里的特殊數(shù)據(jù),所有操作必須包含在一個事務(wù)塊里面。(參閱關(guān)于大對象接口的文檔獲取更多信息。)因為psql 在你調(diào)用它的內(nèi)部命令 /lo_export,/lo_import,/lo_unlink 之一時無法跟蹤你是否有一個正在處理的事務(wù),所以它必須采取一些任意的動作。這個動作可能是回卷任何正在處理的事務(wù),或者提交這樣的事務(wù),或者什么也不做。對于后面一種情況,你必須提交你自己的 BEGIN TRANSACTION/COMMIT 塊否則結(jié)果將是不可預(yù)料的(通常導致在任何情況下希望的動作都不會發(fā)生)。
要選擇你希望做的事,你可以把此變量設(shè)置為“rollback”,“commit”或“nothing”之一。缺省是回卷事務(wù)。如果你只是希望裝載一個或者少數(shù)幾個對象,這個方法很好。但是如果你希望傳輸許多大對象,我們建議給所有命令提供一個顯式的事務(wù)塊。
ON_ERROR_STOP
缺省時,如果非交互的腳本碰到一個錯誤,象一條錯誤的SQL 查詢或者內(nèi)部專有命令,處理會繼續(xù)進行。這是psql 的傳統(tǒng)特性,但是有時候我們不太希望這樣。如果設(shè)置了這個變量,腳本處理將馬上停止。如果該腳本是從另外一個腳本調(diào)用的,那個腳本也會按同樣的方式停止。如果最外層的腳本不是從一次交互的psql 會話中調(diào)用的而是用 -f 選項調(diào)用的,psql 將返回錯誤代碼 3,以示這個情況與致命錯誤條件的區(qū)別(錯誤代碼 1)。
PORT
當前你正在聯(lián)接的數(shù)據(jù)庫服務(wù)器的端口。這是在每次你與數(shù)據(jù)庫聯(lián)接時(包括程序啟動)設(shè)置的,但是可以刪除。
PROMPT1, PROMPT2, PROMPT3
這些指明 psql 顯示的提示符看上去象什么。參閱下面的 "提示(符)" 。
QUIET
這個變量等效于命令行選項 -q。可能在交互模式下沒有什么用。
SINGLELINE
這個變量等效于設(shè)置命令行選項 -S。你可以在運行時刪除或設(shè)置它。
SINGLESTEP
這個變量等效于命令行選項 -s。
USER
當前你正用于聯(lián)接的數(shù)據(jù)庫用戶。這是在每次你與數(shù)據(jù)庫聯(lián)接時(包括程序啟動)設(shè)置的,但是可以刪除/重置。
SQL Interpolation
一個附加的 psql 變量的有用特性是你可以把它們替換(“改寫”)成正規(guī)的SQL 語句。這樣做的語法同樣還是變量名前面加一個冒號(:)。
testdb=> /set foo 'my_table'
testdb=> SELECT * FROM :foo;
將會查詢表 my_table。變量的值是逐字拷貝的,所以它甚至可以包含不對稱的引號或反斜杠命令。你必須保證你輸入的東西是有意義的。變量替換將不會在引起來的SQL 語句里面發(fā)生。
利用這個功能的一個時髦的應(yīng)用是通過使用一個隨后的語句中最后插入的OID 建立一個外鍵(scenario ?)。另一個可能用到這個機制的地方是把一個文件的內(nèi)容拷貝到一個域里面去。首先把文件裝載到一個變量然后想上面那樣處理。
testdb=> /set content '/'' `cat my_file.txt` '/''
testdb=> INSERT INTO my_table VALUES (:content);
這樣處理的一個可能問題是 my_file.txt 可能包含單引號。這些需要被轉(zhuǎn)意以免在處理第三行時不會導致語法錯誤。可以使用程序sed 來做這個處理:
testdb=> /set content `sed -e "s/'///////'/g" < my_file.txt`
觀察正確數(shù)量的反斜杠(6)!你可以這樣解釋它:在psql 分析完這行后,它把 sed -e "s/'////'/g" < my_file.txt 傳遞給 shell。shell 將對雙引號里的東西做其處理然后用參數(shù) -e 和 s/'///'/g 執(zhí)行 sed。當sed 分析這些時它將把雙反斜杠替換為單個反斜杠然后進行替換。可能有時候你認為所有 Unix 命令使用同一個轉(zhuǎn)意字符是個好事。但具有諷刺意味的事實是你可能不得不轉(zhuǎn)意所有反斜杠,因為SQL 文本常量同樣也慘遭這種解釋。這種情況下你可能最好在外部準備文件。
因為冒號也可以合法的出現(xiàn)在查詢里,便有下面規(guī)則的應(yīng)用:如果沒有設(shè)置變量,字符序列“冒號+名稱”不會被改變。在任何情況下你都可以用反斜杠轉(zhuǎn)意冒號以保護它免于被解釋。(變量的冒號語法是SQL 用于嵌入查詢語言的標準,如 ecpg。用于數(shù)組片段和類型轉(zhuǎn)換的冒號語法是PostgreSQL 擴展,因此有沖突。)
提示(符)
psql 使用的提示符可以根據(jù)你的喜好客戶化。三個變量 PROMPT1,PROMPT2 和 PROMPT3 包含描述提示符的外觀的字串和特殊轉(zhuǎn)意序列。Prompt 1 是 psql 請求一個新查詢時的使用的正常提示符。Prompt 2 是在一個查詢輸入期待更多輸入時(因為查詢沒有用一個分號結(jié)束或者引號沒有關(guān)閉)顯示的提示符。Prompt 3 在你運行一個 SQL COPY 命令和等待你在終端上鍵入記錄時使用。
相應(yīng)的提示符變量的值是按字面打印的,除非碰到一個百分號(“%”)。這時某些其他的文本被替換,替換為何物取決于下一個字符。已定義的替換是:
%M
數(shù)據(jù)庫服務(wù)器的主機名(或者是“l(fā)ocalhost”如果使用的是 Unix 域套接字)。
%m
數(shù)據(jù)庫服務(wù)器的主機名刪去第一個點后面的部分剩下的東西。(譯注:短域名)
%>
數(shù)據(jù)庫服務(wù)器正在偵聽的端口號。
%n
你聯(lián)接使用的用戶名(不是你的本地系統(tǒng)用戶名)。
%/
當前數(shù)據(jù)庫名稱。
%~
類似 %/,但如果數(shù)據(jù)庫是你的缺省數(shù)據(jù)庫輸出是“~” (波浪線(tilde))。
%#
如果當前用戶是數(shù)據(jù)庫超級用戶,使用“#”,否則用“>”。
%R
對于 prompt 1 通常是“=”,但是如果是單行模式則是“^”,而如果會話與數(shù)據(jù)庫斷開(如果 /connect 失敗可能發(fā)生)是“!”。對于 prompt 2 該序列被“-”,“*”,一個單引號或者一個雙引號代替,這取決于psql 是否等待更多的輸入(因為查詢沒有終止,或著正在一個 /* ... */ 注釋里面,或者因為你在引號里面)。對于 prompt 3 該序列不解釋成任何東西。
%digits
如果 digits 以 0x 開頭,那么其余字符被解釋成一個十六進制數(shù)字并且替換為對應(yīng)(十六進制碼)的字符。如果第一個數(shù)字是 0 ,該字符被解釋成一個八進制數(shù)字并且替換為對應(yīng)的(八進制碼)的字符。否則認為是一個十進制數(shù)字。
%:name:
psql 變量 name 的值。參閱 "變量" 節(jié)獲取細節(jié)。
%`command`
command 的輸出,類似于通常的反勾號(“back-tick”)替換。
要在提示符里插入百分號,鍵入 %%。缺省提示符等效于 '%/%R%# ' 用于 prompts 1 和 2,以及 '>> ' 用于 prompt 3。
注意:這個特性是無恥地從 tcsh 里剽竊來的。
雜項
psql 正常結(jié)束時向 shell 返回 0,發(fā)生自身致命錯誤(用光內(nèi)存,文件沒有找到)時返回 1,與后端聯(lián)接出錯和會話不是交互的時候返回 2,如果在一個腳本里面發(fā)生錯誤或者變量 ON_ERROR_STOP 被設(shè)置了返回 3。
在啟動之前,psql 試圖讀取并執(zhí)行文件 $HOME/.psqlrc 里的命令。這個特性可以用來按口味設(shè)置客戶端或者服務(wù)器(用 /set 和 SET 命令)。
GNU readline
psql 為了編輯和檢索命令行的方便支持 readline 和歷史庫。命令歷史存放在你的家目錄的一個叫 .psql_history 的文件里,并且當 psql 啟動的時候會裝載進來。Tab-補齊同樣也被支持,盡管該補齊邏輯并不是一個SQL 分析器必備的。如果可能,psql 會自動制作成使用這些特性。如果因某些原因你不喜歡 tab 補齊,你可以把下面幾行放在你的家目錄的一個叫 .inputrc 的文件里關(guān)閉這個特性:
$if psql
set disable-completion on
$endif
(這不是 psql 的特性,是 readline 的。參考它的文檔獲取更多細節(jié)。)
如果你安裝了行讀(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 行讀庫可以從 GNU 計劃的 FTP 服務(wù)器 ftp://ftp.gnu.org 得到。
例子
注意:本節(jié)只是顯示了 psql 少數(shù)幾個例子。如果你希望學習 SQL 或者熟悉 Postgres,你可能愿意閱讀一下包含在這個版本里的教程。
第一個例子演示了如何把一個查詢分成多個行進行輸入。注意提示符的變化。
testdb=> CREATE TABLE my_table (
testdb-> first integer not null default 0,
testdb-> second text
testdb-> );
CREATE
現(xiàn)在再看看表定義:
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=>
假設(shè)你用數(shù)據(jù)填充了表并且想看一眼:
peter@localhost testdb=> SELECT * FROM my_table;
first | second
-------+--------
1 | one
2 | two
3 | three
4 | four
(4 rows)
注意 int4 列是怎樣右對齊的以及 text 列是如何左對齊的。你可以用 /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
附錄
毛病和聲明
一些 psql 的早期版本允許第一個參數(shù)(單字母)直接跟在命令后面。出于兼容性原因,這個特性仍然在某些程度上被支持,但是我不準備在這里詳細解釋,因為我不鼓勵這樣使用。不過如果你收到莫名其妙的信息,想想這個用法。例如
testdb=> /foo
Field separator is "oo".
可能不是你想要的東西。
psql 只能與同版本的服務(wù)器平穩(wěn)地工作。這不意味著其他組合會完全失敗,但是可能有微小的或者不那么微小的問題。
在一個“拷貝入”(數(shù)據(jù)發(fā)送給服務(wù)器)過程中按下 Control-C 并不顯示出最典型的特征。如果你收到一條類似于下面這樣的信息“PQexec: you gotta get out of a COPY state yourself”,只需要輸入 /c - - 重置聯(lián)接即可。