psql語法

guyuanli發表於2015-03-12


psql

Name

psql --  PostgreSQL 互動終端

Synopsis

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 的內部操作。 這等效於在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。

-L filename
--log filename

除了正常的輸出源之外,把所有查詢輸出記錄到檔案 filename

-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 將安靜地執行處理任務。 預設時psql將列印歡迎和許多其他輸出資訊。 如果使用了此選項,這些都不出現。這在和 -c 選項一起使用時很有效。在 psql 裡,你可以透過設定 QUIET 變數實現同樣效果。

-R separator
--record-separator separator

使用 separator 做為非對齊輸出的記錄分隔符。 等效於\pset recordsep命令。

-s
--single-step

進入單步模式執行。意味著每個查詢在發往伺服器之前都要提示使用者, 用這個選項也可以取消執行。此選項主要用於除錯指令碼。

-S
--single-line

進入單行執行模式,這時每個命令都將由換行符結束,象分號那樣。

注意注意這個模式是給那些堅持要這個特性的人的,我們不鼓勵你這麼用。 實際上,如果你在一行裡混合使用 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 在與一個資料庫聯接前提示輸入口令。

如果伺服器要求口令認證,psql 自動提出一個口令提示符。不過,目前是否需要輸入口令的判斷並不完全可靠, 因此用這個選項強制一個提示符。 如果沒有發出口令提示符而伺服器要求口令認證,那麼聯接企圖將失敗。

這個選項將在整個會話過程中有效,即使你用元命令 \connect 改變了所聯接的資料庫。

-x
--expanded

開啟擴充套件表格式模式。等效於命令 \x。

-X,
--no-psqlrc

不讀取啟動檔案(系統的 psqlrc 或者你的 ~/.psqlrc 都不讀取)。

-?
--help

顯示關於psql命令列引數的幫助然後退出。

退出狀態

如果正常結束,那麼 psql 向 shell 返回 0, 如果自身發生致命錯誤,則返回 1(記憶體用盡,未找到檔案等), 如果和資料庫的連線失效而且會話不再活躍則返回 2, 如果指令碼中發生錯誤並且設定了 ON_ERROR_STOP 則返回 3。

用法

與一個資料庫聯接

psql 是一個普通的 PostgreSQL 客戶端應用。為了與一個資料庫聯接,你需要知道你的目標資料庫, 伺服器的主機名和埠號以及你希望以哪個使用者的身份進行聯接等資訊。 我們可以透過命令列引數告訴 psql 這些資訊,分別是 -d, -h,-p,和 -U。 如果有個引數不屬於任何選項開關, 那麼它會被解釋成資料庫名(或者是使用者名稱——如果資料庫名稱已經給出了。)。 不是所有這些選項都是必須的,有預設存在。 如果你省略主機名, psql 將透過 Unix 域套接字與本地主機的伺服器相聯, 或者在沒有 unix 域套接字的機器上,透過 TCP/IP 與 localhost 連線。 預設的埠號是編譯時確定的。因為資料庫伺服器使用同樣的預設值, 所以在大多數設定下,你可能不需要宣告埠號。預設的使用者名稱是你的 Unix 使用者名稱,與資料庫同名。 要注意的是你不能用任意使用者名稱與任何資料庫相聯。你的資料庫管理員應該告訴你你的訪問許可權。

如果預設不太正確,那麼你可以透過設定幾個環境變數 PGDATABASE, PGHOST,PGPORT 和/或 PGUSER 為對應的值的方法節約幾次敲擊。 (其它的環境變數的資訊,參閱 。) 另外,用一個 ~/.pgpass 檔案來避免輸入密碼也是很方便的。 參閱  獲取更多資訊。

如果因為任何原因而無法與資料庫相聯(例如,許可權不夠,伺服器沒有執行等), psql 將返回一個錯誤並退出。

輸入 SQL 命令

通常狀況下,psql 提供一個帶有 psql 正在與之聯接的接資料庫名的,字尾 =>的提示符。例如,

$ psql testdb

Welcome to psql 8.1, the PostgreSQL interactive terminal.

 

Type:  \copyright for distribution terms

       \h for help with SQL commands

       \? for help with psql 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(八進位制), \0xdigits(十六進位制)。

如果一個不帶引號的引數以冒號(:)開頭, 它會被當作一個psql 變數,並且該變數的值會最終成為真正的引數值。 (譯註:類似 ecpg 和 pl/pgsql 的變數用法。)

用“反勾號” ("backticks" `) 包圍的內容被當作一個命令列傳入 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 title. (這條命令的名稱源於 "caption",因為以前只是用於在一個 HTML 表裡面設定標題。)

\connect (或者 \c)[ dbname [ username ] ]

與一個新的資料庫建立一個聯接,使用/不用一個使用者名稱。 前面的聯接將關閉。如果 dbname 是 -,那麼就假設是當前資料庫名稱。

如果省略 username,則假設是當前使用者名稱。

作為一條特殊規則,不帶任何引數執行\connect 將以預設使用者身份與預設資料庫連線(正如你不帶任何引數執行 psql 一樣。)

如果聯接失敗(使用者名稱錯,訪問拒絕等),那麼將保留前面的聯接--當且僅當在 psql 處於互動模式下如此。 如果執行的是非互動的指令碼,處理會馬上停止,並返回一個錯誤。 選擇這樣的區別是一方面為使用者使用方便考慮,另一方面為保證指令碼不會碰巧操作了錯誤的資料庫的安全機制考慮的。

\copy table [ ( column_list ) ] { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list ] [ force not null column_list ] ]

執行前端(客戶端)複製。這是一個執行 SQL  命令的操作, 不同的是 SQL COPY 是伺服器在讀寫指明的檔案,而 psql 讀寫檔案並作為本地的檔案系統和伺服器之間的路由取出或寫入資料。 這意味著檔案訪問性和許可權都是本地使用者的,而不是伺服器的,因此不需要 SQL 超級使用者許可權。

這條命令的語法是模擬 SQL  命令的。 要注意的是由此而來,有一些特殊的分析規則應用於 \copy 命令。 尤其是變數替換規則和反斜槓代換規則不起作用。

\copy table from stdin | stdout 分別基於命令輸入和輸出讀/寫。所有行都從發出命令的同一個源讀取,直到讀到了 \. 或者流達到 EOF。 輸出傳送到和命令輸出相同的位置。要從 psql 的標準輸入或者輸出讀/寫, 使用pstdin 或者 pstdout。這個選項用於把和 SQL 指令碼嵌在一起的檔案填充表很有用。

提示此操作不象 SQL COPY 命令這樣高效, 因為所有資料必須透過客戶端/伺服器聯接。對於大資料量的操作,另一種方法更可行。

\copyright

顯示 PostgreSQL 的版權和版本資訊。

\d [ pattern ]
\d+ [ pattern ]

對於每個匹配pattern的關係(表,檢視,索引或者序列), 顯示所有列,它們的型別,表空間(如果不是預設的)和任何特殊屬性,象NOT NULL或預設等--只要存在。 如果實際上這個關係是一個表,任何已定義的索引,主鍵,唯一約束相關的索引,規則,約束,和觸發器也同樣顯示出來, 如果關係是一個檢視,還顯示檢視的定義。 ("匹配模式"在下面定義。)

從 \d+ 來的命令也是一樣的,只不過顯示更多資訊:任何與表的列關聯的註解也都會顯示, 還有就是表中出現的 OID。

注意如果如果不帶任何pattern呼叫 \d, 等效於 \dtvs,將顯示一個所有表,檢視和序列的列表。 這完全是出於方便的考慮。

\da [ pattern ]

列出所有可用聚集函式,以及它們操作的資料型別。如果宣告瞭 pattern,那麼只顯示匹配(正規表示式)的聚集函式。

\db [ pattern ]
\db+ [ pattern ]

列出所有可用的表空間。如果宣告瞭 pattern, 那麼只顯示那些匹配模式的表空間。如果在命令名上附加了 +,那麼每個物件都和與之相關的許可權一起列出。

\dc [ pattern ]

列出所有字符集之間的可用轉換。如果宣告瞭 pattern, 則只列出那些匹配模式的轉換。

\dC

列出所有型別轉換。

\dd [ pattern ]

顯示所有匹配 pattern 的描述,如果沒有給出引數,顯示所有可視物件。 但是不管怎樣,只有那些有描述內容的物件才顯示出來。 ("物件"包括聚集,函式,運算子,型別, 關係(表,檢視,索引,序列,大物件),規則和觸發器。)例如:

=> \dd version

                     Object descriptions

   Schema   |  Name   |  Object  |      Description

------------+---------+----------+---------------------------

 pg_catalog | version | function | PostgreSQL version string

(1 row)

可以用  SQL 命令生成對物件的描述。

\dD [ pattern ]

列出所有可用域。如果宣告瞭 pattern,那麼只顯示匹配的域。

\df [ pattern ]
\df+ [ pattern ]

列出所有可用函式,以及它們的引數和返回的資料型別。如果宣告瞭 pattern,那麼只顯示匹配(正規表示式)的函式。如果使用了 \df+ 的形式,每個函式的附加資訊,包括語言和描述也會顯示出來。

注意要查詢接受或者返回特定型別的函式,使用你的分頁器的搜尋功能來滾動 \df 的輸出。

為了減少混亂,\df 並不顯示資料型別的 I/O 函式。 這樣是透過忽略那些接受或者返回型別 cstring 的函式實現的。

\dg [ pattern ]

列出所有資料庫組。如果宣告瞭 pattern, 只顯示那些匹配模式的名字。

\distvS [ pattern ]

這不是實際的命令名稱:字母 i,s, t,v,S 分別代表索引(index), 序列(sequence),表(table),檢視(view)和系統表(system table)。 你可以以任意順序宣告任意或者所有這些字母獲得這些物件的一個列表。 字幕 S 把列表限制於系統物件;如果沒有 S,則只顯示非系統物件。 如果在命令名上附加了 +,那麼還會列出和每個物件相關聯的描述,如果有的話。

如果宣告瞭 pattern,那麼只列出匹配模式的物件。

\dl

這是 \lo_list的別名,顯示一個大物件的列表。

\dn [ pattern ]
\dn+ [ pattern ]

列出所有可用模式(名字空間)。如果宣告瞭 pattern (一個正規表示式),那麼只列出匹配模式的模式名。不顯示非本地的臨時模式。 如果在命令名上附加了 +,那麼每個物件都和與之相關的許可權和註釋一起列出(如果有的話)。

\do [ pattern ]

列出所有可用運算子,以及它們的運算元和返回的資料型別。 如果宣告瞭 pattern,那麼只顯示匹配模式的運算子。

\dp [ pattern ]

生成一列可用的表和它們相關的許可權。 如果宣告瞭 pattern, 那麼只列出名字可以匹配模式的表。

命令 GRANT 和 REVOKE 用於設定訪問許可權。 參閱  獲取更多資訊。

\dT [ pattern ]
\dT+ [ pattern ]

列出所有資料型別或只顯示那些匹配 pattern的。這條命令的 \dT+ 形式顯示更多資訊。

\du [ pattern ]

列出所有已配置使用者或者只列出那些匹配 pattern 的使用者。

\edit (or \e) [ filename ]

如果宣告瞭 filename, 則編輯此檔案並且在編輯器退出後將其內容複製回查詢緩衝區。 如果沒有給出引數,則把當前查詢緩衝區內容複製到一個臨時檔案然後以相同方式編輯。

然後根據一般的psql規則重新分析查詢緩衝區, 這時整個緩衝區當作一個單行。(因此你無法用這個方法制作“指令碼”,用 \i 做指令碼。) 這還意味著如果該查詢以分號結尾(或者包含分號),它就會馬上被執行。否則它只是在查詢緩衝區裡等待。

提示psql 搜尋環境變數 PSQL_EDITOR,EDITOR 和 VISUAL(以此順序)查詢要用到哪個編輯器。如果上面的都沒有設定,那麼在 Unix 系統上使用 vi,在 Windows 系統上用 notepad.exe。

\echo text [ ... ]

向標準輸出列印引數,用一個空格分隔並且最後跟著一個新行。 這個特性在顯示指令碼的輸出時會有用。例如:

=> \echo `date`

Tue Oct 26 21:40:57 CEST 1999

果第一個引數是一個無引號的 -n,那麼不會寫出結尾的新行。

提示如果你使用 \o 命令重定向你的查詢的輸出,你可能會用 \qecho取代這條命令。

\encoding [ encoding ]

設定客戶端字元編碼方式。不帶引數時,這條命令顯示當前的編碼方式。

\f [ string ]

為不對齊的查詢輸出設定域分隔符。預設時是豎條(|)。 參閱 \pset 獲取設定輸出選項的通用方法。

\g [ { filename | |command } ]

把當前的查詢輸入緩衝區的內容傳送給伺服器並且把查詢的輸出儲存到可選的 filename 或者把輸出定向到一個獨立的在執行 command 的 Unix shell。 單獨一個 \g 實際上等效於一個分號。一個帶有引數的\g 是"一次性"的 \o命令的代用品。

\help (或者 \h) [ command ]

給出指定 SQL 命令的語法幫助。如果沒有給出 command ,那麼 psql 將列出可獲得語法幫助的所有命令。如果 command 是一個星號("*"),則顯示所有 SQL 命令的語法幫助。

注意為簡化敲擊,包含多個單字的命令不需要引起。因此鍵入 \help alter table 是正確的。

\H

開啟 HTML 查詢輸出格式。如果 HTML 格式已經開啟,則切換回預設的對齊的文字格式。 這個命令是為了相容和方便,參閱 \pset 獲取設定其他輸出選項的內容。

\i filename

從檔案filename中讀取並把其內容當作從鍵盤輸入的那樣執行查詢。

注意如果你想在螢幕上看到讀入的行,你必須對所有行設定變數 ECHO 為 all。

\l (或 \list)
\l+ (或 \list+)

列出伺服器上所有資料庫的名字和它們的所有者以及字符集編碼。在命令名稱後面加一個 "+" 還可以看到對資料庫的描述。

\lo_export loid filename

從資料庫裡讀取 OID 為 loid 的大物件並把她寫到 filename裡。 注意這個功能與伺服器函式 lo_export 有些微小的區別, 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

響應表明此大物件得到一個物件標識 152801,如果你還想訪問該物件,就應該把這個物件標識記住。 因此,我們建議總是給每個物件關聯一個人類可讀的註解。 那樣就可以用 \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 描述要設定的選項是哪一個。value 的語意也取決於它。

可調節的列印選項有:

format

設定輸出格式為 unaligned,aligned,html, latex 或 troff-ms 之一。允許使用唯一的縮寫。 (這也意味著一個字母就夠了。)

"Unaligned" (不對齊)把一條記錄的所有欄位都輸出到一行, 用當前有效的域分隔符分隔。這主要用於生成那些要被其他程式讀取的輸出(tab分隔,逗號分隔)。 "Aligned" (對齊)模式是標準的,人類可讀的,格式化好了的文字輸出,也是預設。 "HTML" 和 "LaTeX" 模式把表輸出為可用於文件裡的對應標記語言。它們還不是完整的文件! (可能對於 HTML 變化還不是太大, 但是在 LaTeX 裡,你必須有一個完整的文件包裝器。)

border

第二個引數必須是一個數字。通常,數字越大,表就有越寬的邊界和越多的線, 但是這個引數取決於實際的格式。在HTML模式裡, 這個引數會直接翻譯成border=...屬性,在其他的模式裡, 只有值 0 (無邊界),1 (內部分隔線)和 2 (表框架)有意義。

expanded )(或者 x)

在正常和擴充套件格式之間切換。當開啟擴充套件格式時,查詢結果用兩列顯示, 欄位名稱在左,資料在右。這個選項隻影響正常查詢結果的顯示方式; psql 元命令的輸出總是使用正常的格式。 這個模式在資料無法放進通常的"水平"模式的螢幕時很有用。

所有四種輸出模式都支援擴充套件格式。

null

第二個引數是一個字串,用以代表欄位的值為 null 時的列印輸出。 預設是什麼都不打,這樣很容易和類似一個空字串混淆。 因此,我們可能選擇 \pset null '(null)'。

fieldsep

宣告在非對齊模式時的域分隔符。 這樣我們就可以建立其他程式希望的tab或逗號分隔的輸出。要設定 tab 域分隔符, 鍵入 \pset fieldsep '\t'。預設域分隔符是 '|' (一個豎條符號)。

footer

切換預設腳註 (x rows)。

recordsep

宣告在非對齊模式時的記錄分隔符。預設是換行符。

tuples_only (或者 t)

在完全顯示和只顯示記錄之間切換。 完全顯示將顯示象列頭,標題和各種腳註等資訊。 在這個模式下,只顯示記錄模式將只顯示實際的表資料。

title [ text ]

為任何隨後列印的表設定標題。 這個引數可以用於給你的輸出一個描述性標記。 如果不帶引數,重置標題。

tableattr (或者 T)[ text ]

允許你宣告放在 HTML table 標記裡的任何屬性。例如,可以是 cellpadding 或 bgcolor。注意你可能不需要在這裡宣告 border ,因為已經在 \pset border 裡用過了。

pager

控制查詢和psql幫助輸出的分頁器。如果設定了環境變數 PAGER, 輸出被定向到指定程式,否則使用系統預設(比如 more)。

如果關閉了分頁器,則不使用它,如果開啟了,程式只在需要的時候使用分頁器,也就是說, 輸出是到終端,而且那個表很可能無法與螢幕匹配。 (psql 在決定何時分頁時不是很完美。) \pset pager 開關分頁器。我們也可以把分頁器設定為 always,導致我們在任何情況下都使用分頁器。

可以在  節看到這些不同格式輸出的示例。

提示有很多用於\pset的快速命令。參閱 \a,\C,\H, \t,\T,和 \x。

注意無引數執行 \pset是錯誤的。 以後這樣呼叫將顯示當前列印選項狀態。

\q

退出psql程式。

\qecho text [ ... ]

這條命令等效於 \echo ,區別是所有輸出將寫入由 \o設定的輸出通道。

\r

重置(清空)查詢緩衝區。

\s [ filename ]

將命令列歷史列印出或是存放到 filename。 如果省略 filename, 歷史將輸出到標準輸出。這個選項只有在 psql 配置成使用 GNU Readline 庫後才生效。

注意在當前版本里,這個( GNU 歷史庫)不再是必須的了, 實際上,在程式結束時自動儲存命令列歷史。每次 psql 啟動都會裝載命令列歷史。

\set [ name [ value [ ... ] ] ]

設定內部變數 name 為 value 或著如果給出了多於一個值, 設定為所有這些值的聯接結果。如果沒有給出第二個引數,只設變數不設值。要重置一個變數,使用 \unset 命令。

有效的變數名可以包含字元,數字和下劃線。 參閱下面的  獲取細節。

儘管你可以設定任何變數為任意值, psql對一些變數特殊對待。它們在關於變數的節裡面有文件。

注意這條命令是完全和 SQL 命令  不一樣的。

\t

切換輸出的列/欄位名的資訊頭和行記數腳註。 這條命令等效於 \pset tuples_only,提供主要為了方便。

\T table_options

允許你在使用HTML輸出模式時宣告放在 table 標記裡的屬性。 這條命令等效於 \pset tableattr table_options

\w {filename | |command}

將當前查詢緩衝區輸出到檔案 filename 或者定向到 Unix 命令 command

\x

切換擴充套件行格式。等效於 \pset expanded。

\z [ pattern ]

生成一個帶有訪問許可權列表的資料庫中所有表,檢視和序列的列表。 如果給出任何pattern,則被當成一個規則表示式, 只顯示匹配的表,檢視和序列。

命令 GRANT 和 REVOKE 用於設定訪問許可權。 參閱  獲取更多資訊。

這是 \dp("顯示許可權")的別名。

\! [ command ]

返回到一個獨立的 Unix shell 或者執行 Unix 命令 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那樣有名的"軟連線(soft links)"或"變數 變數"。 不幸的是(或者 萬幸的?),用這些構造不能做任何有用的事情。另一方面, \set bar :foo 是一個非常有效的複製變數的方法。

如果你不帶第二個引數呼叫\set, 那麼只是設定這個變數而沒有值。 要重置(或刪除)一個變數,使用命令 \unset。

psql的內部變數可以包括任意順序, 任意數量的字母,數字和下劃線。 有一些常用變數被 psql 另眼相待。它們是一些選項設定, 這些選項在執行時可以透過改變變數的值或者改變一些應用的表現狀態而改變。 儘管你可以把這些變數用於其他用途,但是我們不鼓勵這麼做,因為程式的特性可能會很快變得非常奇怪。 通常,所有特殊對待的變數都是由大寫字母組成(可能還有數字和下劃線)。 為了保證和未來的最大限度的相容性,請避免使用這樣的變數。 下面是一個所有特殊對待的變數列表。

AUTOCOMMIT

如果是 on(預設),那麼每個 SQL 命令都在成功完成後自動提交。 要推遲這種模式下的提交,你必須輸入一個 BEGIN 或者 START TRANSACTION SQL 命令。 如果是 off 或者未設定,SQL 命令不會提交,知道你明確地發出COMMIT 或者 END。 關閉自動提交的模式是透過為你明確發出一個 BEGIN 實現的, 它是放在任何尚未在一個事務塊中並且自己不是 BEGIN 或者其它事務控制命令也不是那些不能在事務塊裡執行的命令 (比如 VACUUM)的前面。

注意在關閉自動提交的模式下,你必須明確放棄任何失敗的事務,方法是執行 ABORT 或者 ROLLBACK。 還要注意如果你不提交就退出會話,你的工作會丟失。

注意自動提交開啟方式是 PostgreSQL 傳統的行為, 但是關閉自動提交更接近 SQL 規範。如果你喜歡關閉自動提交,你應該在你的 .psqlrc 檔案裡設定它。

DBNAME

你正在聯接著的資料庫名稱。 每次你與一個資料庫聯結都會設定這個值(包括程式啟動),但是可以刪除。

ECHO

如果置為 all, 輸入的或者來自鍵盤或者一個指令碼的所有行在分析或執行前都寫到標準輸出。 要在程式啟動時宣告這些,使用 -a如果設定為 queries, psql 只是在查詢傳送給伺服器之前列印出來。 實現這個功能的命令列選項是-e。

ECHO_HIDDEN

當設定了這個變數並且一個反斜槓命令查詢資料庫時,首先顯示查詢。 這樣你可以學習 PostgreSQL 內部的東西並且在你自己的程式裡提供類似功能。如果你設定該變數的值為 "noexec",查詢只是顯示出來但是實際上不傳送到伺服器和執行。

ENCODING

當前的客戶端字符集編碼。

HISTCONTROL

如果這個變數設定為 ignorespace, 以空格開始的行將不會進入歷史列表。 如果設定為變數 ignoredups, 與以前歷史記錄裡匹配的行也不會進入歷史記錄。值 ignoreboth是上面兩個的結合。 如果刪除此變數或者其值為任何與上面的值不同的東西, 所有互動模式讀入的行都被儲存入歷史列表。

注意這個特性是無恥地從 Bash 裡剽竊來的。

HISTFILE

此檔案將用於儲存歷史列表。預設值是 ~/.psql_history。 比如,在 ~/.psqlrc 裡使用:

\set HISTFILE ~/.psql_history- :DBNAME

將令 psql 為每個資料庫維護一個獨立的歷史。

注意這個特性是從 Bash 裡偷學來的。

HISTSIZE

存在命令歷史裡的命令的個數。預設值是 500。

Note: 這個特性是無恥地從 Bash裡剽竊來的。

HOST

當前你正聯接的資料庫伺服器主機。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除。

IGNOREEOF

如果刪除此變數,向一個互動的 psql會話傳送一個 EOF (通常是 Control-D)將終止應用。如果設定為一個數字值,那麼在應用終止前該數值的 EOF 字元將被忽略。 如果設定了此變數但是沒有數字值,預設是 10。

注意這個特性是無恥地從 Bash 裡剽竊來的。

LASTOID

最後影響的oid值,即為從一條 INSERT 或 lo_insert 命令返回的值。 此變數只保證在下一條 SQL 命令的結果顯示之前有效。

ON_ERROR_ROLLBACK

如果是 on,如果一個事務塊裡的語句產生一個錯誤, 那麼這個錯誤被忽略而事務講繼續。如果是 interactive, 那麼這樣的錯誤只是在互動的會話裡忽略,而不是在從讀取指令碼檔案的時候。 如果是 off(預設),事務塊裡一個語句生成的錯誤將會回滾整個事務。 on_error_rollback-on 的模式是透過在一個事務塊的每個命令前為你隱含地發出一個 SAVEPONT 的方式工作的,在發生錯誤的時候回滾到該事務塊。

ON_ERROR_STOP

預設時,如果非互動的指令碼碰到一個錯誤,象一條錯誤的 SQL 命令或者內部元命令,處理會繼續進行。 這是 psql 的傳統特性, 但是有時候我們不太希望這樣。如果設定了這個變數,指令碼處理將馬上停止。 如果該指令碼是從另外一個指令碼呼叫的,那個指令碼也會按同樣的方式停止。 如果最外層的指令碼不是從一次互動的 psql 會話中呼叫的而是用 -f 選項呼叫的,psql 將返回錯誤程式碼 3,以示這個情況與致命錯誤條件的區別(錯誤程式碼 1)。

PORT

當前你正在聯接的資料庫伺服器的埠。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除。

PROMPT1
PROMPT2
PROMPT3

這些指明psql 顯示的提示符看上去象什麼。 參閱下面的 

QUIET

這個變數等效於命令列選項 -q。 可能在互動模式下沒有什麼用。

SINGLELINE

這個變數等效於設定命令列選項 -S。你可以在執行時刪除或設定它。

SINGLESTEP

這個變數等效於命令列選項 -s。

USER

當前你正用於聯接的資料庫使用者。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除/重置。

VERBOSITY

這個選項可以設定為值 default,verbose,或者 terse 以控制錯誤報告的冗餘行。

SQL 代換

一個附加的 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 命令裡,便有下面規則的應用: 如果沒有設定變數,字元序列 "冒號+名稱" 不會被改變。 在任何情況下你都可以用反斜槓逃逸冒號以保護它免於被解釋。 (變數的冒號語法是 SQL 用於嵌入查詢語言的標準,如 ECPG。用於陣列片段和型別轉換的冒號語法是 PostgreSQL 擴充套件,因此有衝突。)

提示符

psql使用的提示符可以根據你的喜好客戶化。三個變數 PROMPT1,PROMPT2,和 PROMPT3 包含描述提示符的外觀的字串和特殊逃逸序列。Prompt 1 是 psql 請求一個新命令時的使用的正常提示符。 Prompt 2 是在一個命令輸入期待更多輸入時(因為查詢沒有用一個分號結束或者引號沒有關閉)顯示的提示符。 Prompt 3 在你執行一個 SQL COPY 命令和等待你在終端上鍵入記錄時使用。

相應的提示符變數的值是按字面列印的,除非碰到一個百分號(%)。這時某些其他的文字被替換, 替換為何物取決於下一個字元。已定義的替換是:

%M

資料庫伺服器主機名全名(帶著域名),如果聯接是透過 Unix 域套接字進行的就是 [local], 或者如果 Unix 域套接字不是編譯的預設位置,就是 [local:/dir/name]。

%m

資料庫伺服器的主機名刪去第一個點後面的部分剩下的東西。 或者如果聯接是透過 Unix 域套接字,就是 [local]。

%>

資料庫伺服器正在偵聽的埠號。

%n

資料庫會話的使用者名稱。 (這個值的擴充套件可能在一個資料庫會話過程中因為 SET SESSION AUTHORIZATION 命令而改變。)

%/

當前資料庫名稱。

%~

類似 %/, 但如果資料庫是你的預設資料庫輸出是"~" (波浪線(tilde))。

%#

如果會話使用者是資料庫超級使用者,使用 "#",否則用">"。 (這個值的擴充套件可能在一個資料庫會話過程中因為 SET SESSION AUTHORIZATION 命令而改變。)

%R

對於 prompt 1 通常是 =,但是如果是單行模式則是 ^,而如果會話與資料庫斷開(如果 \connect 失敗可能發生)是 !。對於 prompt 2 該序列被 -,*,一個單引號,一個雙引號或者一個美元符代替,這取決於 psql是否等待更多的輸入(因為查詢沒有終止,或著正在一個 /* ... */註釋裡面,或者因為你在引號或者美元符擴充套件裡面)。對於 prompt 3 該序列不解釋成任何東西。

%x

事務狀態:如果不在事務塊裡,是一個空字串,如果在事務塊裡,是 *, 如果在一個失敗的事務塊裡是 !,或者無法判斷事務狀態時為 ? (比如,因為沒有連線)。

%digits

指定位元組值的字元被替換到該位置。

%:name:

psql變數name的值。參閱  節獲取細節。

%`command`

command的輸出, 類似於通常的"反勾號(back-tick)" 替換。

%[ ... %]

提示可以包含終端控制字元,這些字元可以改變顏色,北京,或者提示文字的風格, 或者改變終端視窗的標題。為了讓 Readline 的行編輯特性正確執行, 這些不可列印的控制字元必須設計成不可見的,方法是用 %[ 和 %] 包圍它們。 在提示符裡可能出現這些東西的多個配對。

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%#%] '

這樣的結果是在 VT100 相容的可顯示彩色的終端上的一個寬體(1;)黑底黃字(33;40)。

要在提示符裡插入百分號,鍵入%%。預設提示符等效於 '%/%R%# ' 用於 prompts 1 和 2,以及'>> ' 用於 prompt 3。

注意這個特性是無恥地從tcsh 裡剽竊來的。

命令列編輯

psql 為了編輯和檢索命令列的方便支援 Readline 和歷史庫。 命令歷史在 psql 退出的時候自動儲存,在 psql 啟動的時候裝載。 還支援 Tab 補齊,儘管該補齊邏輯並不是一個 SQL 分析器必備的。 如果因某些原因你不喜歡 tab 補齊,你可以把下面幾行放在你的家目錄的一個叫 .inputrc 的檔案裡關閉這個特性:

$if psql

set disable-completion on

$endif

(這不是psql 的特性, 是 Readline 的。參考它的文件獲取更多細節。)

環境

PAGER

如果查詢結果在一頁裡放不下,那麼它們被定向到這個命令。 典型的值是 more 或者 less。 預設的是平臺相關的。我們可以用 \pset 命令關閉分頁器。

PGDATABASE

預設資料庫

PGHOST
PGPORT
PGUSER

預設連線引數

PSQL_EDITOR
EDITOR
VISUAL

\e 命令使用的編輯器。這些變數是按照上面的順序檢查的;設定最早的最先使用。

SHELL

\! 命令執行的命令。

TMPDIR

儲存臨時檔案的目錄。預設是 /tmp。

檔案

  • 在啟動之前,psql 檢視讀取系統的 psqlrc 檔案和執行來自使用者家目錄的檔案 ~/.psqlrc 裡面的命令。 (在 Windows 裡,使用者的啟動檔名字叫 %APPDATA%\postgresql\psqlrc.conf。) 參閱 PREFIX/share/psqlrc.sample 獲取如何設定全系統的檔案的資訊。 可將它用於設定客戶端或者伺服器的風格(使用 \set和SET命令)。
  • 系統的 psqlrc 和使用者自己的 ~/.psqlrc 都可以透過在後面附著一個劃線和 PostgreSQL 版本號的方法變得與版本相關, 比如 ~/.psqlrc-8.1。 匹配版本相關的檔案比無版本的檔案優先讀取。
  • 命令列歷史儲存在 ~/.psql_history,或者在 Windows 裡是 %APPDATA%\postgresql\psql_history。

注意

  • 一些 psql的早期版本允許一個單字母的反斜槓命令(元命令)的第一個引數直接跟在命令後面, 而不用空白間隔。出於相容性原因,這個特性仍然在某些程度上被支援,但是我不準備在這裡詳細解釋,因為我不鼓勵這樣使用。 不過如果你收到莫名其妙的資訊,想想這個用法。例如

·         testdb=> \foo

Field separator is "oo".

可能不是你想要的東西。

  • psql 只能與同版本的伺服器平穩地工作。 這不意味著其他組合會完全失敗,但是可能有微小的或者不那麼微小的問題。 如果伺服器的版本不同,反斜槓命令是特別容易失效的。

Windows 使用者需要注意的地方

psql 是以一種"控制檯應用"的方式製作的。 因為 Windows 控制檯視窗和系統其它部分使用不同的編碼, 所以在 psql 裡使用 8 位字元的時候必須採取特殊的注意措施。 如果 psql 檢測到一個有問題的控制檯內碼表, 那麼它在啟動的時候會警告你。要修改控制檯內碼表,有兩件事是必須做的:

  • 透過輸入 cmd.exe /c chcp 1252 設定內碼表。(1252 是適用於德語的內碼表;換成合適你的數值。譯註:中文 GB2312 的內碼表是 936。) 如果你使用 Cygwin,你可以在 /etc/profile 裡面輸入這條命令。
  • 把控制檯字型設定為 "Lucida Console",因為光柵字型(點陣字型)不能在 ANSI 內碼表下工作。

例子

第一個例子演示瞭如何把一個查詢分成多個行進行輸入。注意提示符的變化:

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)

你可以用 \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

又見

環境變數(


Next

pg_restore

vacuumdb

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7490392/viewspace-1457505/,如需轉載,請註明出處,否則將追究法律責任。