psql — PostgreSQL 互動式終端
psql
[選項
...] [dbname
[username
]]
psql 是一個基於終端的 PostgreSQL 前端。它讓您可以互動式地輸入查詢,將它們發送到 PostgreSQL,並查看查詢結果。或者,輸入可以來自檔案或來自命令列引數。此外,psql 提供了許多元指令和各種類似 shell 的功能,以方便編寫指令碼和自動執行各種任務。
-a
--echo-all
#將所有非空輸入行讀取到標準輸出時印出。(這不適用於互動式讀取的行。) 這相當於將變數 ECHO
設定為 all
。
-A
--no-align
#切換到未對齊的輸出模式。(預設輸出模式為 aligned
。) 這相當於 \pset format unaligned
。
-b
--echo-errors
#將失敗的 SQL 指令印到標準錯誤輸出。這相當於將變數 ECHO
設定為 errors
。
-c command
--command=command
#指定 psql 要執行給定的指令字串 command
。這個選項可以重複,並以任何順序與 -f
選項結合。當指定 -c
或 -f
時,psql 不會從標準輸入讀取指令;而是會在依序處理完所有 -c
和 -f
選項後終止。
command
必須是一個可以被伺服器完全解析的指令字串 (即,它不包含任何 psql 特定的功能),或者是一個單一的反斜線指令。因此,您不能混合SQL和 psql 在 -c
選項中的元指令。為了實現這一點,您可以使用重複的 -c
選項或將字串傳送到 psql 中,例如
psql -c '\x' -c 'SELECT * FROM foo;'
或
echo '\x \\ SELECT * FROM foo;' | psql
(\\
是分隔符元指令。)
每個SQL傳遞給 -c
的指令字串都會作為單一請求傳送到伺服器。因此,即使該字串包含多個SQL指令,伺服器也會將其作為單一交易執行,除非該字串包含明確的 BEGIN
/COMMIT
指令,將其劃分為多個交易。(有關伺服器如何處理多查詢字串的更多詳細資訊,請參閱 第 53.2.2.1 節。)
如果不想在一個交易中執行多個指令,請使用重複的 -c
指令,或將多個指令傳送到 psql 的標準輸入,可以使用如上所示的 echo,也可以透過 shell 的 here-document,例如
psql <<EOF \x SELECT * FROM foo; EOF
--csv
#切換到CSV(逗號分隔值) 輸出模式。這相當於 \pset format csv
。
-d dbname
--dbname=dbname
#指定要連接的資料庫名稱。這相當於在命令列上將 dbname
指定為第一個非選項引數。dbname
可以是 連接字串。如果是這樣,連接字串參數將覆蓋任何衝突的命令列選項。
-e
--echo-queries
#將發送到伺服器的所有 SQL 指令也複製到標準輸出。這相當於將變數 ECHO
設定為 queries
。
-E
--echo-hidden
#印出 \d
和其他反斜線指令產生的實際查詢。您可以使用它來研究 psql 的內部操作。這相當於將變數 ECHO_HIDDEN
設定為 on
。
-f filename
--file=filename
#從檔案 filename
讀取指令,而非從標準輸入讀取。這個選項可以重複使用,並且可以和 -c
選項以任何順序組合。當指定 -c
或 -f
時,psql 不會從標準輸入讀取指令;而是在依序處理完所有 -c
和 -f
選項後終止。除此之外,這個選項大致上等同於中繼指令 \i
。
如果 filename
是 -
(連字號),則會讀取標準輸入,直到遇到 EOF 指示符或 \q
中繼指令。這可以用於將互動式輸入與來自檔案的輸入混合。但請注意,在這種情況下不會使用 Readline (就像指定了 -n
一樣)。
使用此選項與撰寫 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
類似。
使用此選項時,psql 將連線到資料庫 postgres
,除非在命令列上指定了不同的資料庫 (選項 -d
或非選項引數,可能透過服務項目,但不能透過環境變數)。
-L filename
--log-file=filename
#除了正常的輸出目標外,還將所有查詢輸出寫入檔案 filename
中。
-n
--no-readline
#不使用 Readline 進行行編輯,也不使用指令歷史記錄 (請參閱下方標題為「Command-Line Editing」的部分)。
-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 應該安靜地工作。預設情況下,它會列印歡迎訊息和各種資訊輸出。如果使用此選項,則不會發生任何這些情況。這在使用 -c
選項時很有用。這等同於將變數 QUIET
設定為 on
。
-R separator
--record-separator=separator
#使用 separator
作為未對齊輸出的記錄分隔符號。這等同於 \pset recordsep
。
-s
--single-step
#以單步模式執行。這表示在將每個指令傳送到伺服器之前都會提示使用者,並提供取消執行的選項。使用此選項來偵錯指令碼。
-S
--single-line
#以單行模式執行,其中換行符號會終止 SQL 指令,就像分號一樣。
提供此模式是為了滿足堅持使用它的人,但不一定鼓勵您使用它。特別是,如果您在同一行混合SQL和中繼指令,執行順序對於沒有經驗的使用者來說可能並不總是清楚。
-t
--tuples-only
#關閉欄位名稱和結果列計數頁尾等的列印。這等同於 \t
或 \pset tuples_only
。
-T table_options
--table-attr=table_options
#指定要放置在HTML table
標籤中的選項。有關詳細訊息,請參閱 \pset tableattr
。
-U username
--username=username
#以使用者 username
的身分連線到資料庫,而不是預設使用者。(當然,您必須具有這樣做的權限。)
-v assignment
--set=assignment
--variable=assignment
#執行變數賦值,就像 \set
中繼指令一樣。請注意,您必須在命令列上使用等號分隔名稱和值 (如果有的話)。要取消設定變數,請省略等號。要設定具有空值的變數,請使用等號,但省略值。這些賦值是在命令列處理期間完成的,因此反映連線狀態的變數稍後會被覆寫。
-V
--version
#列印 psql 版本並結束。
-w
--no-password
#永遠不要顯示密碼提示。如果伺服器需要密碼驗證,而且密碼無法從其他來源取得,例如 .pgpass
檔案,則連線嘗試將會失敗。這個選項在批次作業和腳本中非常有用,因為沒有使用者可以輸入密碼。
請注意,這個選項會在整個會話期間保持設定,因此會影響 meta-command \connect
的使用以及初始連線嘗試。
-W
--password
#強制 psql 在連線到資料庫之前提示輸入密碼,即使密碼不會被使用。
如果伺服器需要密碼驗證,而且密碼無法從其他來源取得,例如 .pgpass
檔案,則無論如何 psql 都會提示輸入密碼。然而,psql 會浪費一次連線嘗試來確定伺服器是否需要密碼。在某些情況下,輸入 -W
可以避免額外的連線嘗試。
請注意,這個選項會在整個會話期間保持設定,因此會影響 meta-command \connect
的使用以及初始連線嘗試。
-x
--expanded
#開啟展開的表格格式模式。這等同於 \x
或 \pset expanded
。
-X
--no-psqlrc
#不要讀取啟動檔案(系統範圍的 psqlrc
檔案或使用者的 ~/.psqlrc
檔案)。
-z
--field-separator-zero
#將未對齊輸出的欄位分隔符號設定為空位元組。這等同於 \pset fieldsep_zero
。
-0
--record-separator-zero
#將未對齊輸出的記錄分隔符號設定為空位元組。這對於與 xargs -0
等程式介接非常有用。這等同於 \pset recordsep_zero
。
-1
--single-transaction
#這個選項只能與一個或多個 -c
和/或 -f
選項結合使用。它會使 psql 在第一個此類選項之前發出 BEGIN
命令,並在最後一個選項之後發出 COMMIT
命令,從而將所有命令包裝到單個事務中。如果任何命令失敗,且變數 ON_ERROR_STOP
已設定,則會改為傳送 ROLLBACK
命令。這確保所有命令都成功完成,或者不應用任何變更。
如果命令本身包含 BEGIN
、COMMIT
或 ROLLBACK
,則此選項將不會產生預期的效果。此外,如果無法在事務塊內執行個別命令,則指定此選項將導致整個事務失敗。
-?
--help[=topic
]
#顯示關於 psql 的說明並退出。可選的 topic
參數(預設為 options
)選擇要說明 psql 的哪個部分:commands
描述 psql 的反斜線命令;options
描述可以傳遞給 psql 的命令列選項;variables
顯示關於 psql 配置變數的說明。
如果 psql 正常結束,則向 shell 返回 0;如果發生其自身的致命錯誤(例如,記憶體不足、找不到檔案),則返回 1;如果到伺服器的連線出現問題,且會話不是互動式的,則返回 2;如果腳本中發生錯誤,且變數 ON_ERROR_STOP
已設定,則返回 3。
psql 是一個常規的 PostgreSQL 客戶端應用程式。為了連線到資料庫,您需要知道目標資料庫的名稱、伺服器的主機名稱和端口號,以及您想要作為哪個資料庫使用者連線。可以使用命令列選項將這些參數告知 psql,即分別為 -d
、-h
、-p
和 -U
。如果找到不屬於任何選項的參數,它將被解釋為資料庫名稱(如果已給出資料庫名稱,則為資料庫使用者名稱)。並非所有這些選項都是必需的;有一些有用的預設值。如果您省略主機名稱,psql 將通過 Unix 域套接字連線到本地主機上的伺服器,或者通過 TCP/IP 連線到 Windows 上的 localhost
。預設端口號在編譯時確定。由於資料庫伺服器使用相同的預設值,因此在大多數情況下您不必指定端口。預設資料庫使用者名稱是您的作業系統使用者名稱。一旦確定了資料庫使用者名稱,它就會被用作預設資料庫名稱。請注意,您不能僅以任何資料庫使用者名稱連線到任何資料庫。您的資料庫管理員應該已告知您關於您的存取權限。
當預設值不太正確時,您可以通過將環境變數 PGDATABASE
、PGHOST
、PGPORT
和/或 PGUSER
設定為適當的值來節省一些打字時間。(有關其他環境變數,請參閱第 32.15 節。)擁有一個 ~/.pgpass
檔案也很方便,可以避免經常輸入密碼。有關更多資訊,請參閱第 32.16 節。
指定連線參數的另一種方式是在 conninfo
字串或URI中,它用於代替資料庫名稱。這種機制使您可以對連線進行非常廣泛的控制。例如
$psql "service=myservice sslmode=require"
$psql postgresql://dbmaster:5433/mydb?sslmode=require
通過這種方式,您還可以將LDAP用於連線參數查找,如第 32.18 節中所述。有關所有可用連線選項的更多資訊,請參閱第 32.1.2 節。
如果因為任何原因(例如:權限不足、伺服器未在目標主機上執行等)而無法建立連線,psql 將會傳回錯誤並終止。
如果標準輸入和標準輸出都是終端機,則 psql 會將用戶端編碼設定為 「auto」,這會從地區設定(Unix 系統上的 LC_CTYPE
環境變數)中偵測適當的用戶端編碼。如果此方法沒有如預期般運作,可以使用環境變數 PGCLIENTENCODING
來覆寫用戶端編碼。
在正常操作下,psql 會提供一個提示符號,其中包含 psql 目前連線的資料庫名稱,後面接著字串 =>
。例如:
$ psql testdb
psql (17.2)
Type "help" for help.
testdb=>
在提示符號下,使用者可以輸入SQL指令。通常,輸入行在到達指令終止分號時會傳送到伺服器。行尾不會終止指令。因此,為了清楚起見,指令可以分散在多行上。如果指令已傳送並執行且沒有錯誤,則指令的結果會顯示在螢幕上。
如果不受信任的使用者可以存取未採用安全架構使用模式的資料庫,請先從 search_path
中移除可公開寫入的架構。可以將 options=-csearch_path=
新增至連線字串,或在其他 SQL 指令之前發出 SELECT pg_catalog.set_config('search_path', '', false)
。此考量並非 psql 獨有,它適用於執行任意 SQL 指令的每個介面。
每當執行指令時,psql 也會輪詢由 LISTEN
和 NOTIFY
產生的非同步通知事件。
雖然 C 樣式的區塊註解會傳遞到伺服器以進行處理和移除,但 SQL 標準註解會由 psql 移除。
在 psql 中輸入的任何以未引用的反斜線開頭的內容都是 psql 中繼指令,由 psql 本身處理。這些指令使 psql 對於管理或腳本編寫更有用。中繼指令通常稱為斜線或反斜線指令。
psql 指令的格式是反斜線,後接指令動詞,然後是任何引數。引數與指令動詞以及彼此之間以任意數量的空白字元分隔。
若要在引數中包含空白,可以使用單引號將其引起來。若要在引數中包含單引號,請在單引號文字中寫入兩個單引號。單引號中包含的任何內容都還會受到 C 樣式替換的影響,包括 \n
(換行符號)、\t
(Tab 鍵)、\b
(退格鍵)、\r
(歸位鍵)、\f
(換頁鍵)、\
digits
(八進位) 和 \x
digits
(十六進位)。在單引號文字中,反斜線後面的任何其他字元都會引用該單個字元,無論它是什麼。
如果未引用的冒號 (:
) 後面接著 psql 變數名稱出現在引數中,則會將其替換為變數的值,如以下SQL 插值中所述。此處描述的 :'
和 variable_name
':"
形式也適用。variable_name
":{?
語法允許測試是否定義了變數。它會被替換為 TRUE 或 FALSE。使用反斜線逸出冒號可以防止其被替換。variable_name
}
在引數中,以反引號 (`
) 括起來的文字會被視為傳遞到 shell 的命令列。命令的輸出(移除任何尾隨換行符)會替換反引號文字。在反引號括起來的文字中,不會發生特殊的引號或其他處理,除了 :
的外觀(其中 variable_name
variable_name
是 psql 變數名稱)會被替換為變數的值。此外,:'
的外觀會被替換為適當引用的變數值,以成為單個 shell 命令引數。(後一種形式幾乎總是更可取,除非你非常確定變數中的內容。)由於歸位符號和換行符號字元無法在所有平台上安全地引用,因此當此類字元出現在值中時,variable_name
':'
形式會印出錯誤訊息且不會替換變數值。variable_name
'
某些指令將SQL識別碼(例如表名稱)作為引數。這些引數遵循SQL的語法規則:未引用的字母會強制轉換為小寫,而雙引號 ("
) 可保護字母免受大小寫轉換的影響,並允許將空白納入識別碼中。在雙引號內,成對的雙引號會縮減為結果名稱中的單個雙引號。例如,FOO"BAR"BAZ
會被解釋為 fooBARbaz
,而 "A weird"" name"
變成 A weird" name
。
引數的剖析會在行尾或找到另一個未引用的反斜線時停止。未引用的反斜線會被視為新中繼指令的開頭。特殊序列 \\
(兩個反斜線)標記引數的結尾並繼續剖析SQL指令(如果有的話)。這樣SQL和 psql 指令就可以在一行上自由混合。但在任何情況下,中繼指令的引數都不能超出行的結尾。
許多中繼指令作用於當前查詢緩衝區。這只是一個緩衝區,用於保存已鍵入但尚未傳送到伺服器執行的任何 SQL 指令文字。這將包括先前的輸入行以及同一行上中繼指令之前出現的任何文字。
定義了以下中繼指令:
\a
#如果當前表輸出格式未對齊,則會切換為對齊。如果它未對齊,則會設定為未對齊。保留此指令是為了向後相容性。請參閱 \pset
以獲得更通用的解決方案。
\bind
[ parameter
] ... #設定下一個查詢執行的查詢參數,並傳遞指定的參數以用於任何參數佔位符 ($1
等)。
範例
INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g
這也適用於除了 \g
之外的查詢執行指令,例如 \gx
和 \gset
。
此命令會啟用延伸查詢協定(請參閱第 53.1.2 節),這與一般 psql 操作不同,後者使用簡單查詢協定。因此,此命令可用於從 psql 測試延伸查詢協定。(即使查詢沒有參數,且此命令指定零個參數,也會使用延伸查詢協定。)此命令僅影響下一個執行的查詢;之後的所有查詢預設會使用簡單查詢協定。
\c
或 \connect [ -reuse-previous=on|off
] [ dbname
[ username
] [ host
] [ port
] | conninfo
]
#與 PostgreSQL 伺服器建立新的連線。要使用的連線參數可以使用位置語法(一個或多個資料庫名稱、使用者名稱、主機和埠)指定,也可以使用 conninfo
連線字串指定,詳情請參閱第 32.1.1 節。如果未提供任何引數,則會使用與之前相同的參數建立新的連線。
將 dbname
、username
、host
或 port
指定為 -
相當於省略該參數。
新的連線可以重複使用先前連線的連線參數;不僅包括資料庫名稱、使用者名稱、主機和埠,還包括其他設定,例如 sslmode
。預設情況下,參數會在位置語法中重複使用,但在給定 conninfo
字串時則不會。傳遞第一個引數 -reuse-previous=on
或 -reuse-previous=off
會覆寫該預設值。如果重複使用參數,則任何未明確指定為位置參數或在 conninfo
字串中的參數,都將取自現有連線的參數。例外情況是,如果使用位置語法將 host
設定從其先前的值變更,則現有連線參數中存在的任何 hostaddr
設定都將被刪除。此外,只有在使用者、主機和埠設定未變更的情況下,才會重複使用現有連線使用的任何密碼。當命令既未指定也未重複使用特定參數時,將使用 libpq 預設值。
如果成功建立新的連線,則會關閉先前的連線。如果連線嘗試失敗(使用者名稱錯誤、拒絕存取等),如果 psql 處於互動模式,則會保留先前的連線。但是,當執行非互動式指令碼時,舊的連線會關閉並報告錯誤。這可能會或可能不會終止指令碼;如果沒有,所有資料庫存取命令都會失敗,直到另一個 \connect
命令成功執行。選擇這種區別是為了方便使用者避免拼寫錯誤,另一方面也是為了確保指令碼不會意外地對錯誤的資料庫執行操作的安全機制。請注意,每當 \connect
命令嘗試重複使用參數時,重複使用的值是上次成功連線的值,而不是隨後進行的任何失敗嘗試的值。但是,如果發生非互動式 \connect
失敗,則不允許稍後重複使用任何參數,因為指令碼可能會期望重複使用失敗的 \connect
中的值。
範例
=> \c mydb myuser host.dom 6432 => \c service=foo => \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable" => \c -reuse-previous=on sslmode=require -- changes only sslmode => \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title
]
#設定任何表標題,這些表會印為查詢的結果,或取消設定任何此類標題。此命令等同於 \pset title
。(此命令的名稱源自 “caption”,因為它之前僅用於設定HTML表格中的標題。)title
\cd [ directory
]
#將目前工作目錄變更為 directory
。若沒有引數,則變更為目前使用者的主目錄。
若要列印您的目前工作目錄,請使用 \! pwd
。
\conninfo
#輸出有關目前資料庫連線的資訊。
\copy { table
[ ( column_list
) ] } from
{ 'filename'
| program 'command'
| stdin | pstdin } [ [ with ] ( option
[, ...] ) ] [ where condition
]
\copy { table
[ ( column_list
) ] | ( query
) } to
{ 'filename'
| program 'command'
| stdout | pstdout } [ [ with ] ( option
[, ...] ) ]
#執行前端(客戶端)複製。這是一項執行SQL COPY
命令的操作,但不是由伺服器讀取或寫入指定的檔案,而是由 psql 讀取或寫入檔案,並在伺服器和本機檔案系統之間傳輸資料。這表示檔案可存取性和權限是本機使用者的權限,而不是伺服器的權限,並且不需要 SQL 超級使用者權限。
當指定 program
時,command
由 psql 執行,並且從或傳輸到 command
的資料在伺服器和客戶端之間傳輸。同樣,執行權限是本機使用者的權限,而不是伺服器的權限,並且不需要 SQL 超級使用者權限。
對於 \copy ... from stdin
,資料列從發出命令的相同來源讀取,直到讀取 \.
或串流到達EOF這個選項在 SQL 腳本檔案中內嵌填入表格時很有用。對於 \copy ... to stdout
,輸出會傳送到與 psql 命令輸出相同的地方,並且不會印出 COPY
命令的狀態 (因為它可能會與資料列混淆)。若要讀取/寫入 psql 的標準輸入或輸出,而不論目前的命令來源或 count
\o
選項為何,請寫入 from pstdin
或 to pstdout
。
此命令的語法與SQL COPY
命令相似。 除了資料來源/目的地之外的所有選項都與 COPY
相同。 因此,特殊的剖析規則適用於 \copy
meta-command。 與大多數其他 meta-command 不同,整行的剩餘部分始終被視為 \copy
的引數,並且不會在引數中執行變數內插或反引號擴充。
獲得與 \copy ... to
相同結果的另一種方法是使用SQL COPY ... TO STDOUT
命令,並以 \g
或 filename
\g |
終止它。 與 program
\copy
不同,此方法允許命令跨越多行;此外,可以使用變數內插和反引號擴充。
這些操作不如使用檔案或程式資料來源或目的地的SQL COPY
命令有效率,因為所有資料都必須通過 client/server 連線。 對於大量資料,COPY
SQL命令可能更可取。 此外,由於這種傳遞方法,在CSV模式下的 \copy ... from
會錯誤地將單獨一行上的 \.
資料值視為輸入結束標記。
\copyright
#顯示 PostgreSQL 的著作權和發布條款。
\crosstabview [ colV
[ colH
[ colD
[ sortcolH
] ] ] ]
#執行當前查詢緩衝區(如 \g
)並在交叉表網格中顯示結果。 查詢必須返回至少三列。 由 colV
識別的輸出欄成為垂直標頭,而由 colH
識別的輸出欄成為水平標頭。colD
識別要在網格中顯示的輸出欄。sortcolH
識別水平標頭的可選排序欄。
每個欄位規格可以是欄位編號(從 1 開始)或欄位名稱。 通常的 SQL 區分大小寫和引號規則適用於欄位名稱。 如果省略,則 colV
被視為欄位 1,而 colH
被視為欄位 2。colH
必須與 colV
不同。 如果未指定 colD
,則查詢結果中必須恰好有三列,並且既不是 colV
也不是 colH
的欄位被視為 colD
。
垂直標頭,顯示為最左邊的欄位,包含在欄位 colV
中找到的值,其順序與查詢結果相同,但已刪除重複項。
水平標頭,顯示為第一行,包含在欄位 colH
中找到的值,並刪除了重複項。 預設情況下,這些值以與查詢結果相同的順序顯示。 但是,如果給出了可選的 sortcolH
參數,它會識別一個欄位,該欄位的值必須是整數數字,並且來自 colH
的值將根據相應的 sortcolH
值排序後顯示在水平標頭中。
在交叉表網格內部,對於 colH
的每個不同的值 x
和 colV
的每個不同的值 y
,位於交點 (x,y)
的儲存格包含 colD
欄位的值,該值位於 colH
的值為 x
且 colV
的值為 y
的查詢結果列中。 如果沒有這樣的列,則儲存格為空。 如果有多個這樣的列,則會報告錯誤。
\d[S+] [ pattern
]
#對於每個符合 pattern
的關係(表格、檢視表、具體化檢視表、索引、序列或外部表格)或複合類型,顯示所有欄位、它們的類型、表格空間(如果不是預設的)以及任何特殊屬性,例如 NOT NULL
或預設值。 也會顯示相關的索引、約束、規則和觸發器。 對於外部表格,也會顯示相關的外部伺服器。(「符合 pattern」的定義如下面的Patterns中。)
對於某些關係類型,\d
會顯示每個欄位的其他資訊:序列的欄位值、索引的索引表示式以及外部表格的外部資料包裝器選項。
命令形式 \d+
相同,除了顯示更多資訊:顯示與表格欄位相關聯的任何註解,以及表格中是否存在 OID、檢視表的定義(如果關係是檢視表)、非預設的 副本識別 設定,以及關係具有存取方法時的 存取方法 名稱。
預設情況下,僅顯示使用者建立的物件;提供 pattern 或 S
修飾符以包含系統物件。
如果 \d
在沒有 pattern
引數的情況下使用,則相當於 \dtvmsE
,它將顯示所有可見表格、檢視表、具體化檢視表、序列和外部表格的列表。 這純粹是一種方便措施。
\da[S] [ pattern
]
#列出彙總函式,以及它們的傳回類型和它們運算的資料類型。 如果指定了 pattern
,則僅顯示名稱符合 pattern 的彙總函式。 預設情況下,僅顯示使用者建立的物件;提供 pattern 或 S
修飾符以包含系統物件。
\dA[+] [ pattern
]
#列出存取方法。 如果指定了 pattern
,則僅顯示名稱符合 pattern 的存取方法。 如果在命令名稱後附加 +
,則會列出每個存取方法及其關聯的處理函式和描述。
\dAc[+] [access-method-pattern
[input-type-pattern
]]
#列出運算子類別(參閱第 36.16.1 節)。如果指定了 access-method-pattern
,則僅列出與名稱符合該模式的存取方法相關聯的運算子類別。如果指定了 input-type-pattern
,則僅列出與名稱符合該模式的輸入類型相關聯的運算子類別。如果將 +
附加到命令名稱,則每個運算子類別都會與其相關聯的運算子族和擁有者一起列出。
\dAf[+] [access-method-pattern
[input-type-pattern
]]
#列出運算子族(參閱第 36.16.5 節)。如果指定了 access-method-pattern
,則僅列出與名稱符合該模式的存取方法相關聯的運算子族。如果指定了 input-type-pattern
,則僅列出與名稱符合該模式的輸入類型相關聯的運算子族。如果將 +
附加到命令名稱,則每個運算子族都會與其擁有者一起列出。
\dAo[+] [access-method-pattern
[operator-family-pattern
]]
#列出與運算子族相關聯的運算子(參閱第 36.16.2 節)。如果指定了 access-method-pattern
,則僅列出與名稱符合該模式的存取方法相關聯的運算子族的成員。如果指定了 operator-family-pattern
,則僅列出名稱符合該模式的運算子族的成員。如果將 +
附加到命令名稱,則每個運算子都會與其排序運算子族(如果它是排序運算子)一起列出。
\dAp[+] [access-method-pattern
[operator-family-pattern
]]
#列出與運算子族相關聯的支援函數(參閱第 36.16.3 節)。如果指定了 access-method-pattern
,則僅列出與名稱符合該模式的存取方法相關聯的運算子族的函數。如果指定了 operator-family-pattern
,則僅列出名稱符合該模式的運算子族的函數。如果將 +
附加到命令名稱,則函數會以冗長的方式顯示,並包含其實際參數清單。
\db[+] [ pattern
]
#列出表空間。如果指定了 pattern
,則僅顯示名稱符合該模式的表空間。如果將 +
附加到命令名稱,則每個表空間都會與其相關聯的選項、磁碟大小、權限和描述一起列出。
\dc[S+] [ pattern
]
#列出字元集編碼之間的轉換。如果指定了 pattern
,則僅列出名稱符合該模式的轉換。預設情況下,僅顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果將 +
附加到命令名稱,則每個物件都會與其相關聯的描述一起列出。
\dconfig[+] [ pattern
]
#列出伺服器組態參數及其值。如果指定了 pattern
,則僅列出名稱符合該模式的參數。如果沒有 pattern
,則僅列出設定為非預設值的參數。(使用 \dconfig *
查看所有參數。)如果將 +
附加到命令名稱,則每個參數都會與其資料類型、可以設定參數的內容以及存取權限(如果已授予非預設存取權限)一起列出。
\dC[+] [ pattern
]
#列出類型轉換。如果指定了 pattern
,則僅列出來源或目標類型符合該模式的轉換。如果將 +
附加到命令名稱,則每個物件都會與其相關聯的描述一起列出。
\dd[S] [ pattern
]
#顯示 constraint
、operator class
、operator family
、rule
和 trigger
類型物件的描述。所有其他註解都可以透過這些物件類型各自的反斜線命令來檢視。
\dd
顯示符合 pattern
的物件的描述,如果未提供引數,則顯示適當類型的可見物件的描述。但在這兩種情況下,僅列出具有描述的物件。預設情況下,僅顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。
物件的描述可以使用 COMMENT
SQL命令建立。
\dD[S+] [ pattern
]
#列出網域。如果指定了 pattern
,則僅顯示名稱符合該模式的網域。預設情況下,僅顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果將 +
附加到命令名稱,則每個物件都會與其相關聯的權限和描述一起列出。
\ddp [ pattern
]
#列出預設存取權限設定。會針對每個角色(以及適用時的結構描述)顯示一個項目,這些角色的預設權限設定已從內建預設值變更。如果指定了 pattern
,則僅列出角色名稱或結構描述名稱符合該樣式的項目。
可以使用 ALTER DEFAULT PRIVILEGES
指令設定預設存取權限。權限顯示的含義在 第 5.8 節中進行了說明。
\dE[S+] [ pattern
]
\di[S+] [ pattern
]
\dm[S+] [ pattern
]
\ds[S+] [ pattern
]
\dt[S+] [ pattern
]
\dv[S+] [ pattern
]
#在這組指令中,字母 E
、i
、m
、s
、t
和 v
分別代表外部資料表 (foreign table)、索引 (index)、實體化檢視 (materialized view)、序列 (sequence)、資料表 (table) 和檢視 (view)。您可以按任意順序指定任何或所有這些字母,以取得這些類型的物件清單。例如,\dti
列出資料表和索引。如果在指令名稱後附加 +
,則每個物件都會列出其持久性狀態(永久、暫時或未記錄)、磁碟上的物理大小以及相關聯的描述(如果有的話)。如果指定了 pattern
,則僅列出名稱符合該樣式的物件。預設情況下,僅顯示使用者建立的物件;提供樣式或 S
修飾符以包括系統物件。
\des[+] [ pattern
]
#列出外部伺服器(助記詞:“external servers”)。如果指定了 pattern
,則僅列出名稱符合該樣式的伺服器。如果使用 \des+
形式,則會顯示每個伺服器的完整描述,包括伺服器的存取權限、類型、版本、選項和描述。
\det[+] [ pattern
]
#列出外部資料表(助記詞:“external tables”)。如果指定了 pattern
,則僅列出資料表名稱或結構描述名稱符合該樣式的項目。如果使用 \det+
形式,也會顯示通用選項和外部資料表描述。
\deu[+] [ pattern
]
#列出使用者對應(助記詞:“external users”)。如果指定了 pattern
,則僅列出使用者名稱符合該樣式的對應。如果使用 \deu+
形式,則會顯示有關每個對應的額外資訊。
\deu+
也可能顯示遠端使用者的使用者名稱和密碼,因此應注意不要洩漏它們。
\dew[+] [ pattern
]
#列出外部資料包裝函式(助記詞:“external wrappers”)。如果指定了 pattern
,則僅列出名稱符合該樣式的外部資料包裝函式。如果使用 \dew+
形式,也會顯示外部資料包裝函式的存取權限、選項和描述。
\df[anptwS+] [ pattern
[ arg_pattern
... ] ]
#列出函數,以及它們的結果資料類型、引數資料類型和函數類型,這些函數類型分類為 “agg” (aggregate,彙總)、“normal” (一般)、“procedure” (程序)、“trigger” (觸發程序) 或 “window” (視窗)。若要僅顯示特定類型函數,請將相應的字母 a
、n
、p
、t
或 w
新增至指令。如果指定了 pattern
,則僅顯示名稱符合該樣式的函數。任何額外的引數都是類型名稱樣式,它們會比對函數的第一個、第二個等等引數的類型名稱。(比對的函數可以具有比您指定的更多的引數。為避免這種情況,請寫一個破折號 -
作為最後一個 arg_pattern
。)預設情況下,僅顯示使用者建立的物件;提供樣式或 S
修飾符以包括系統物件。如果使用 \df+
形式,則會顯示有關每個函數的額外資訊,包括揮發性 (volatility)、平行安全 (parallel safety)、擁有者 (owner)、安全性分類 (security classification)、存取權限、語言、內部名稱(僅適用於 C 和內部函數)和描述。可以使用 \sf
查看特定函數的原始碼。
\dF[+] [ pattern
]
#列出文字搜尋組態。如果指定了 pattern
,則僅顯示名稱符合該樣式的組態。如果使用 \dF+
形式,則會顯示每個組態的完整描述,包括底層文字搜尋剖析器和每個剖析器符記類型的字典清單。
\dFd[+] [ pattern
]
#列出文字搜尋字典。如果指定了 pattern
,則僅顯示名稱符合該樣式的字典。如果使用 \dFd+
形式,則會顯示有關每個選定字典的額外資訊,包括底層文字搜尋範本和選項值。
\dFp[+] [ pattern
]
#列出文字搜尋剖析器。如果指定了 pattern
,則只會顯示名稱符合該樣式的剖析器。如果使用 \dFp+
的形式,則會顯示每個剖析器的完整描述,包括底層函式和已識別的符記類型清單。
\dFt[+] [ pattern
]
#列出文字搜尋範本。如果指定了 pattern
,則只會顯示名稱符合該樣式的範本。如果使用 \dFt+
的形式,則會顯示有關每個範本的其他資訊,包括底層函式名稱。
\dg[S+] [ pattern
]
#列出資料庫角色。(由於 「使用者」和 「群組」 的概念已統一為 「角色」,因此此命令現在等同於 \du
。) 預設情況下,只會顯示使用者建立的角色;提供 S
修飾符以包含系統角色。如果指定了 pattern
,則只會列出名稱符合該樣式的角色。如果使用 \dg+
的形式,則會顯示有關每個角色的其他資訊;目前這會新增每個角色的註解。
\dl[+]
#這是 \lo_list
的別名,它會顯示大型物件的清單。 如果將 +
附加到命令名稱,則會列出每個大型物件及其相關聯的權限(如果有的話)。
\dL[S+] [ pattern
]
#列出程序語言。如果指定了 pattern
,則只會列出名稱符合該樣式的語言。 預設情況下,只會顯示使用者建立的語言;提供 S
修飾符以包含系統物件。 如果將 +
附加到命令名稱,則會列出每種語言及其呼叫處理程式、驗證器、存取權限以及它是否為系統物件。
\dn[S+] [ pattern
]
#列出綱要 (命名空間)。如果指定了 pattern
,則只會列出名稱符合該樣式的綱要。 預設情況下,只會顯示使用者建立的物件;提供樣式或 S
修飾符以包含系統物件。 如果將 +
附加到命令名稱,則會列出每個物件及其關聯的權限和描述(如果有的話)。
\do[S+] [ pattern
[ arg_pattern
[ arg_pattern
] ] ]
#列出具有其運算元和結果類型的運算子。如果指定了 pattern
,則只會列出名稱符合該樣式的運算子。如果指定了一個 arg_pattern
,則只會列出其右引數類型名稱符合該樣式的前置運算子。如果指定了兩個 arg_pattern
,則只會列出其引數類型名稱符合這些樣式的二元運算子。(或者,為一元運算子的未使用引數寫入 -
。)預設情況下,只會顯示使用者建立的物件;提供樣式或 S
修飾符以包含系統物件。如果將 +
附加到命令名稱,則會顯示有關每個運算子的其他資訊,目前僅為底層函式的名稱。
\dO[S+] [ pattern
]
#列出定序。如果指定了 pattern
,則只會列出名稱符合該樣式的定序。 預設情況下,只會顯示使用者建立的物件;提供樣式或 S
修飾符以包含系統物件。 如果將 +
附加到命令名稱,則會列出每個定序及其關聯的描述(如果有的話)。 請注意,僅顯示可用於目前資料庫編碼的定序,因此結果在同一安裝的不同資料庫中可能會有所不同。
\dp[S] [ pattern
]
#列出具有其關聯存取權限的表格、檢視表和序列。如果指定了 pattern
,則只會列出名稱符合該樣式的表格、檢視表和序列。 預設情況下,僅顯示使用者建立的物件;提供樣式或 S
修飾符以包含系統物件。
\dP[itn+] [ pattern
]
#列出分割的關聯。如果指定了 pattern
,則只會列出名稱符合該樣式的項目。 可以將修飾符 t
(表格) 和 i
(索引) 附加到命令,從而篩選要列出的關聯類型。 預設情況下,會列出分割的表格和索引。
如果使用修飾符 n
(“巢狀”),或者指定了樣式,則會包含非根分割的關聯,並且會顯示一個欄位來顯示每個分割的關聯的父項。
如果將 +
附加到命令名稱,則還會顯示每個關聯的分割區大小總和,以及關聯的描述。如果 n
與 +
結合使用,則會顯示兩個大小:一個包括直接連接的葉節點分割區的總大小,另一個顯示所有分割區的總大小,包括間接連接的子分割區。
\drds [ role-pattern
[ database-pattern
] ]
#列出已定義的組態設定。這些設定可以是角色專用、資料庫專用,或兩者皆是。role-pattern
和 database-pattern
分別用於選擇要列出的特定角色和資料庫。如果省略,或指定 *
,則會列出所有設定,包括那些非角色專用或非資料庫專用的設定。
可以使用 ALTER ROLE
和 ALTER DATABASE
指令來定義每個角色和每個資料庫的組態設定。
\drg[S] [ pattern
]
#列出每個授予的角色成員資格的資訊,包括已分配的選項(ADMIN
、INHERIT
和/或 SET
)和授予者。有關角色成員資格的資訊,請參閱 GRANT
指令。
預設情況下,僅顯示授予使用者建立角色的權限;提供 S
修飾符以包含系統角色。如果指定了 pattern
,則僅列出授予那些名稱與 pattern 比對之角色的權限。
\dRp[+] [ pattern
]
#列出複製發布。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的發布。如果將 +
附加到指令名稱,也會顯示與每個發布相關聯的表和結構描述。
\dRs[+] [ pattern
]
#列出複製訂閱。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的訂閱。如果將 +
附加到指令名稱,則會顯示訂閱的其他屬性。
\dT[S+] [ pattern
]
#列出資料類型。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的類型。如果將 +
附加到指令名稱,則會列出每個類型的內部名稱和大小、如果它是 enum
類型,則會列出允許的值,以及相關聯的權限。預設情況下,僅顯示使用者建立的物件;提供 pattern 或 S
修飾符以包含系統物件。
\du[S+] [ pattern
]
#列出資料庫角色。(由於 「使用者」 和 「群組」 的概念已統一為 「角色」,因此此指令現在等同於 \dg
。) 預設情況下,僅顯示使用者建立的角色;提供 S
修飾符以包含系統角色。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的角色。如果使用 \du+
形式,則會顯示有關每個角色的其他資訊;目前這會新增每個角色的註解。
\dx[+] [ pattern
]
#列出已安裝的擴充功能。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的擴充功能。如果使用 \dx+
形式,則會列出屬於每個比對擴充功能的所有物件。
\dX [ pattern
]
#列出擴充的統計資訊。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的擴充統計資訊。
每一種擴充統計資訊的狀態都會顯示在以其統計資訊種類命名的欄位中(例如 Ndistinct)。defined
表示建立統計資訊時已要求它,而 NULL 表示未要求。如果您想知道是否已執行 ANALYZE
以及規劃器是否可以使用統計資訊,則可以使用 pg_stats_ext
。
\dy[+] [ pattern
]
#列出事件觸發器。如果指定了 pattern
,則僅列出那些名稱與 pattern 比對的事件觸發器。如果將 +
附加到指令名稱,則會列出每個物件及其相關聯的描述。
\e
或 \edit
[ filename
] [ line_number
]
#如果指定了 filename
,則會編輯該檔案;在編輯器結束後,該檔案的內容會複製到目前的查詢緩衝區。如果未提供 filename
,則會將目前的查詢緩衝區複製到暫存檔,然後以相同方式編輯。或者,如果目前的查詢緩衝區是空的,則會將最近執行的查詢複製到暫存檔,然後以相同方式編輯。
如果您編輯檔案或先前的查詢,並且在未修改檔案的情況下退出編輯器,則會清除查詢緩衝區。否則,會根據 psql 的正常規則重新剖析查詢緩衝區的新內容,將整個緩衝區視為單行。任何完整的查詢都會立即執行;也就是說,如果查詢緩衝區包含或以分號結尾,則會執行到該點的所有內容,並從查詢緩衝區中移除。查詢緩衝區中剩餘的任何內容都會重新顯示。鍵入分號或 \g
來傳送它,或鍵入 \r
以透過清除查詢緩衝區來取消它。
將緩衝區視為單行主要會影響 meta-commands:meta-command 之後的任何內容都將被視為 meta-command 的引數,即使它跨越多行。(因此,您無法以這種方式製作使用 meta-command 的指令碼。請改用 \i
。)
如果指定了行號,psql 會將游標定位在檔案或查詢緩衝區的指定行上。請注意,如果提供了單個全數字引數,psql 會假設它是行號,而不是檔案名稱。
有關如何設定和自訂編輯器,請參閱下方的 環境。
\echo text
[ ... ]
#將評估的引數列印到標準輸出,以空格分隔,後接換行符號。這對於在指令碼的輸出中穿插資訊很有用。例如
=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999
如果第一個引數是不帶引號的 -n
,則不會寫入尾隨的換行符號(也不會寫入第一個引數)。
如果您使用 \o
指令來重新導向查詢輸出,您可能會希望使用 \qecho
來取代此指令。另請參閱 \warn
。
\ef [ function_description
[ line_number
] ]
#此指令會提取並編輯指定函式或程序的定義,其形式為 CREATE OR REPLACE FUNCTION
或 CREATE OR REPLACE PROCEDURE
指令。編輯方式與 \edit
相同。如果您在未儲存的情況下離開編輯器,則該語句會被捨棄。如果您儲存並離開編輯器,如果您在其中加入分號,更新後的指令會立即執行。否則會重新顯示;輸入分號或 \g
以傳送它,或輸入 \r
以取消。
目標函式可以僅通過名稱指定,也可以通過名稱和引數指定,例如 foo(integer, text)
。如果具有相同名稱的函式不止一個,則必須給出引數類型。
如果未指定函式,則會顯示空白的 CREATE FUNCTION
範本以進行編輯。
如果指定了行號,psql 將把游標定位在函式主體的指定行上。(請注意,函式主體通常不會從檔案的第一行開始。)
與大多數其他 meta-command 不同,行的整個剩餘部分始終被視為 \ef
的引數,並且引數中既不執行變數內插,也不執行反引號擴充。
有關如何設定和自訂編輯器,請參閱下方的 環境。
\encoding [ encoding
]
#設定用戶端字元集編碼。如果沒有引數,此指令會顯示目前的編碼。
\errverbose
#以最大詳細程度重複最近的伺服器錯誤訊息,就像將 VERBOSITY
設定為 verbose
,並將 SHOW_CONTEXT
設定為 always
。
\ev [ view_name
[ line_number
] ]
#此指令會提取並編輯指定視窗的定義,其形式為 CREATE OR REPLACE VIEW
指令。編輯方式與 \edit
相同。如果您在未儲存的情況下離開編輯器,則該語句會被捨棄。如果您儲存並離開編輯器,如果您在其中加入分號,更新後的指令會立即執行。否則會重新顯示;輸入分號或 \g
以傳送它,或輸入 \r
以取消。
如果未指定視窗,則會顯示空白的 CREATE VIEW
範本以進行編輯。
如果指定了行號,psql 將把游標定位在視窗定義的指定行上。
與大多數其他 meta-command 不同,行的整個剩餘部分始終被視為 \ev
的引數,並且引數中既不執行變數內插,也不執行反引號擴充。
\f [ string
]
#設定未對齊查詢輸出的欄位分隔符號。預設值為垂直線 (|
)。它等效於 \pset fieldsep
。
\g [ (option
=value
[...]) ] [ filename
]
\g [ (option
=value
[...]) ] [ |command
]
#將目前的查詢緩衝區傳送到伺服器以執行。
如果 \g
後面出現括號,它們會包圍一個以空格分隔的 option
=
value
格式選項子句清單,它們的解譯方式與 \pset
option
value
指令相同,但僅在此查詢期間生效。在此清單中,=
符號周圍不允許有空格,但在選項子句之間則需要空格。如果省略 =
value
,則以與 \pset
option
相同的方式變更具名的 option
,而沒有明確的 value
。
如果給定了 filename
或 |
command
引數,則查詢的輸出會寫入指定檔案或以管道傳送到給定的 shell 命令,而不是像往常一樣顯示它。僅當查詢成功傳回零個或多個元組時,才會寫入檔案或命令,如果查詢失敗或是不傳回資料的 SQL 命令,則不會寫入。
如果目前的查詢緩衝區為空,則會重新執行最近傳送的查詢。除了該行為之外,不帶任何引數的 \g
本質上等同於分號。帶有引數時,\g
提供了一種 “one-shot” 的替代方案,可取代 \o
指令,並且還允許對通常由 \pset
設定的輸出格式選項進行單次調整。
當最後一個引數以 |
開頭時,行的整個剩餘部分將被視為要執行的 command
,並且其中既不執行變數內插,也不執行反引號擴充。行的其餘部分只是按字面傳遞到 shell。
\gdesc
#顯示目前查詢緩衝區結果的描述(即欄位名稱和資料類型)。查詢實際上並未執行;但是,如果它包含某種語法錯誤,則將以正常方式報告該錯誤。
如果目前的查詢緩衝區為空,則會改為描述最近傳送的查詢。
\getenv psql_var
env_var
#取得環境變數 env_var
的值,並將其賦值給 psql 變數 psql_var
。如果 env_var
未在 psql 程序的環境中定義,則 psql_var
不會變更。範例
=>\getenv home HOME
=>\echo :home
/home/postgres
\gexec
#將目前的查詢緩衝區傳送到伺服器,然後將查詢輸出的每一列(如果有的話)的每一欄視為要執行的 SQL 語句。例如,要在 my_table
的每一欄上建立索引
=>SELECT format('create index on my_table(%I)', attname)
->FROM pg_attribute
->WHERE attrelid = 'my_table'::regclass AND attnum > 0
->ORDER BY attnum
->\gexec
CREATE INDEX CREATE INDEX CREATE INDEX CREATE INDEX
產生的查詢會依照資料列傳回的順序執行,若同一列有多個欄位,則依從左至右的順序執行。 NULL 欄位會被忽略。產生的查詢會完全按照字面送至伺服器進行處理,因此不能包含 psql 的 meta-指令,也不能包含 psql 變數參考。若有任何個別查詢失敗,除非設定了 ON_ERROR_STOP
,否則剩餘查詢的執行會繼續。每個查詢的執行都會受到 ECHO
處理。(使用 \gexec
時,通常建議將 ECHO
設定為 all
或 queries
。)查詢記錄、單步模式、計時和其他查詢執行功能也會應用於每個產生的查詢。
如果目前的查詢緩衝區是空的,則會重新執行最近一次送出的查詢。
\gset [ prefix
]
#將目前的查詢緩衝區傳送到伺服器,並將查詢的輸出儲存到 psql 變數中(請參閱下方 變數)。要執行的查詢必須只傳回一個資料列。資料列的每個欄位會儲存到一個單獨的變數中,該變數的名稱與欄位相同。例如:
=>SELECT 'hello' AS var1, 10 AS var2
->\gset
=>\echo :var1 :var2
hello 10
如果您指定了 prefix
,該字串將會附加到查詢的欄位名稱之前,以建立要使用的變數名稱。
=>SELECT 'hello' AS var1, 10 AS var2
->\gset result_
=>\echo :result_var1 :result_var2
hello 10
如果欄位結果為 NULL,則會取消設定對應的變數,而不是設定它。
如果查詢失敗或未傳回一個資料列,則不會變更任何變數。
如果目前的查詢緩衝區是空的,則會重新執行最近一次送出的查詢。
\gx [ (option
=value
[...]) ] [ filename
]
\gx [ (option
=value
[...]) ] [ |command
]
#\gx
等同於 \g
,但它會強制將此查詢設定為擴展輸出模式,就像在 \pset
選項列表中包含 expanded=on
一樣。另請參閱 \x
。
\h
or \help
[ command
]
#提供指定SQL指令的語法說明。如果未指定 command
,psql 將列出所有可用語法說明的指令。如果 command
是星號 (*
),則會顯示所有SQL指令的語法說明。
與大多數其他 meta-指令不同,整行的剩餘部分始終被視為 \help
的參數,並且不會在參數中執行變數內插或反引號擴展。
為了簡化輸入,由多個單字組成的指令不必引用。 因此,輸入 \help alter table
是可以的。
\H
or \html
#開啟HTML查詢輸出格式。如果HTML格式已開啟,則會切換回預設的對齊文字格式。此指令是為了相容性和便利性而設計的,但請參閱 \pset
以了解設定其他輸出選項。
\i
or \include
filename
#從檔案 filename
讀取輸入,並將其作為在鍵盤上輸入來執行。
如果 filename
是 -
(連字號),則會讀取標準輸入,直到出現 EOF 指示或 \q
meta-指令。這可用於將互動式輸入與來自檔案的輸入穿插在一起。請注意,只有在最外層層級啟用的情況下,才會使用 Readline 行為。
如果您想在螢幕上看到讀取的行,則必須將變數 ECHO
設定為 all
。
\if
expression
\elif
expression
\else
\endif
#這組指令實作了可巢狀的條件區塊。一個條件區塊必須以 \if
開頭,並以 \endif
結尾。在它們之間可以有任意數量的 \elif
子句,並且可以選擇性地在後面加上單個 \else
子句。普通查詢和其他類型的反斜線指令可以(並且通常會)出現在組成條件區塊的指令之間。
\if
和 \elif
指令讀取它們的參數,並將它們評估為布林運算式。如果運算式產生 true
,則處理會正常繼續;否則,會跳過行,直到到達匹配的 \elif
、\else
或 \endif
。一旦 \if
或 \elif
測試成功,則不會評估同一區塊中稍後 \elif
指令的參數,而是將其視為 false。只有在先前沒有匹配的 \if
或 \elif
成功時,才會處理 \else
後面的行。
與任何其他反斜線指令一樣,\if
或 \elif
指令的 expression
參數會受到變數內插和反引號擴展的影響。之後,它會像 on/off 選項變數的值一樣進行評估。因此,有效值是以下其中之一的不明確大小寫不敏感匹配項:true
、false
、1
、0
、on
、off
、yes
、no
。例如,t
、T
和 tR
都將被視為 true
。
無法正確評估為 true 或 false 的運算式會產生警告,並被視為 false。
跳過的行會正常解析以識別查詢和反斜線指令,但查詢不會傳送到伺服器,並且除了條件指令(\if
、\elif
、\else
、\endif
)之外的反斜線指令會被忽略。只會檢查條件指令的有效巢狀結構。跳過的行中的變數參考不會展開,並且也不會執行反引號擴展。
指定條件區塊的所有反斜線命令必須出現在同一個原始碼檔案中。如果在所有本機 \if
區塊關閉之前,就已到達主要輸入檔案或 \include
檔案的 EOF,則 psql 將會引發錯誤。
以下範例:
-- check for the existence of two separate records in the database and store -- the results in separate psql variables SELECT EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer, EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee \gset \if :is_customer SELECT * FROM customer WHERE customer_id = 123; \elif :is_employee \echo 'is not a customer but is an employee' SELECT * FROM employee WHERE employee_id = 456; \else \if yes \echo 'not a customer or employee' \else \echo 'this will never print' \endif \endif
\ir
或 \include_relative
filename
#\ir
命令與 \i
類似,但解析相對檔案名稱的方式不同。在互動模式下執行時,這兩個命令的行為相同。但是,從腳本調用時,\ir
會根據腳本所在的目錄來解譯檔案名稱,而不是目前的工作目錄。
\l[+]
或 \list[+] [ pattern
]
#列出伺服器中的資料庫,並顯示其名稱、擁有者、字元集編碼和存取權限。如果指定了 pattern
,則僅列出名稱與模式相符的資料庫。如果在命令名稱後面附加 +
,則還會顯示資料庫大小、預設表格空間和描述。(大小資訊僅適用於目前使用者可以連線的資料庫。)
\lo_export loid
filename
#讀取具有以下 OID 的大型物件OID loid
從資料庫,並將其寫入 filename
。 請注意,這與伺服器功能 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
回應指出大型物件收到物件 ID 152801,可用於將來存取新建立的大型物件。 為了便於閱讀,建議始終將人類可讀的註解與每個物件相關聯。 OID 和註解都可以使用 \lo_list
命令檢視。
請注意,此命令與伺服器端 lo_import
略有不同,因為它作為本機檔案系統上的本機使用者,而不是伺服器的使用者和檔案系統。
\lo_list[+]
#顯示目前儲存在資料庫中的所有 PostgreSQL 大型物件的清單,以及為其提供的任何註解。 如果在命令名稱後面附加 +
,則會列出每個大型物件及其相關的權限(如果有的話)。
\lo_unlink loid
#刪除具有OID loid
的大型物件從資料庫中。
使用 \lo_list
找出大型物件的OID.
\o
或 \out [ filename
]
\o
或 \out [ |command
]
#安排將未來的查詢結果儲存到檔案 filename
,或將未來的結果傳送到 shell 命令 command
。 如果未指定任何引數,則查詢輸出會重設為標準輸出。
如果引數以 |
開頭,則該行的其餘部分將被視為要執行的 command
,並且不會在其中執行變數內插或反引號擴充。 該行的其餘部分只會按字面傳遞到 shell。
「查詢結果」包括從資料庫伺服器獲得的所有表格、命令回應和通知,以及查詢資料庫的各種反斜線命令的輸出(例如 \d
);但不包括錯誤訊息。
若要在查詢結果之間穿插文字輸出,請使用 \qecho
。
\p
或 \print
#將目前的查詢緩衝區列印到標準輸出。 如果目前的查詢緩衝區為空,則改為列印最近執行的查詢。
\password [ username
]
#變更指定使用者的密碼(預設情況下為目前使用者)。 此命令會提示輸入新密碼、對其進行加密,並將其作為 ALTER ROLE
命令傳送到伺服器。 這可確保新密碼不會以明文顯示在命令歷史記錄、伺服器日誌或其他位置。
\prompt [ text
] name
#提示使用者提供文字,並將其指派給變數 name
。 可以指定選用的提示字串 text
。(對於多字提示,請用單引號將文字括起來。)
預設情況下,\prompt
使用終端機進行輸入和輸出。 但是,如果使用了 -f
命令列開關,則 \prompt
會使用標準輸入和標準輸出。
\pset [ option
[ value
] ]
#此命令設定影響查詢結果表格輸出的選項。option
指示要設定的選項。value
的語意因所選選項而異。對於某些選項,省略 value
會導致選項被切換或取消設定,如特定選項下所述。如果未提及此類行為,則省略 value
只會導致顯示目前的設定。
不帶任何引數的 \pset
會顯示所有列印選項的目前狀態。
可調整的列印選項為:
border
#value
必須是一個數字。 一般來說,數字越大,表格的邊框和線條就越多,但詳細資訊取決於特定格式。在HTML格式中,這將直接轉譯為 border=...
屬性。在大多數其他格式中,只有值 0(無邊框)、1(內部分隔線)和 2(表格框架)有意義,並且高於 2 的值將被視為與 border = 2
相同。latex
和 latex-longtable
格式還允許值 3 在資料列之間新增分隔線。
columns
#設定 wrapped
格式的目標寬度,以及判斷輸出是否夠寬以需要分頁程式或在展開的自動模式中切換到垂直顯示的寬度限制。零(預設值)會使目標寬度受環境變數 COLUMNS
控制,如果未設定 COLUMNS
,則受偵測到的螢幕寬度控制。此外,如果 columns
為零,則 wrapped
格式僅影響螢幕輸出。如果 columns
不為零,則檔案和管道輸出也會被換行到該寬度。
csv_fieldsep
#指定要在CSVcsv
輸出格式中使用的欄位分隔符。如果分隔符號字元出現在欄位的值中,則該欄位會被雙引號括起來輸出,遵循標準的CSVRFC 4180 規則。預設值為逗號。
expanded
(或 x
) #如果指定了 value
,則它必須是 on
或 off
,這將啟用或停用展開模式,或是 auto
。如果省略了 value
,則該命令會在開啟和關閉設定之間切換。當啟用展開模式時,查詢結果會顯示在兩欄中,欄位名稱在左側,資料在右側。如果資料無法以正常的「水平」模式顯示在螢幕上,則此模式非常有用。在自動設定中,只要查詢輸出有多個欄位且寬度超過螢幕,就會使用展開模式;否則,就會使用常規模式。自動設定僅在 `aligned` 和 `wrapped` 格式中有效。在其他格式中,它的行為始終如同展開模式已關閉。
fieldsep
#指定要在未對齊輸出格式中使用的欄位分隔符。這樣,例如,可以建立以 Tab 分隔的輸出,而其他程式可能更喜歡這種輸出。若要將 Tab 設定為欄位分隔符,請鍵入 \pset fieldsep '\t'
。預設欄位分隔符為 '|'
(垂直線)。
fieldsep_zero
#將在未對齊輸出格式中使用的欄位分隔符設定為零位元組。
footer
#如果指定了 value
,則它必須是 on
或 off
,這將啟用或停用表格頁尾((
計數)的顯示。如果省略了 n
rows)value
,則該命令會開啟或關閉頁尾顯示。
format
#將輸出格式設定為 aligned
、asciidoc
、csv
、html
、latex
、latex-longtable
、troff-ms
、unaligned
或 wrapped
之一。允許使用唯一的縮寫。
aligned
格式是標準的、人類可讀的、格式良好的文字輸出;這是預設值。
unaligned
格式在一行上寫入行的所有欄位,並以目前有效的欄位分隔符分隔。這對於建立可能打算被其他程式讀取的輸出非常有用,例如,以 Tab 分隔或以逗號分隔的格式。但是,如果欄位分隔符號字元出現在欄位的值中,則不會對其進行特殊處理;因此CSVcsv
格式可能更適合用於此類目的。
csv
格式 使用逗號分隔欄位值,並應用 RFC 4180 中描述的引用規則。此輸出與伺服器的 COPY
命令的 CSV 格式相容。除非 tuples_only
參數為 on
,否則會產生帶有欄位名稱的標題行。不列印標題和頁尾。每行都以系統相關的行尾字元終止,對於類 Unix 系統,通常是單個換行符 (\n
);對於 Microsoft Windows,則是回車符和換行符序列 (\r\n
)。可以使用 \pset csv_fieldsep
選擇逗號以外的欄位分隔符。
wrapped
格式類似於 aligned
,但會跨行換行寬資料值,以使輸出適合目標欄位寬度。目標寬度如 columns
選項下所述。請注意,如果欄位標題所需的總寬度超過目標,psql 將不會嘗試換行欄位標題;因此,wrapped
格式的行為與 aligned
相同。
asciidoc
、html
、latex
、latex-longtable
和 troff-ms
格式會輸出旨在包含在使用各自標記語言的文件中的表格。它們不是完整的文件!這在HTML中可能不是必需的,但在 LaTeX 中,您必須有一個完整的文檔包裝器。latex
格式使用 LaTeX 的 tabular
環境。latex-longtable
格式需要 LaTeX 的 longtable
和 booktabs
軟體包。
linestyle
#將邊框線繪製樣式設定為 ascii
、old-ascii
或 unicode
之一。允許使用唯一的縮寫。(這意味著一個字母就足夠了。)預設設定為 ascii
。此選項僅影響 aligned
和 wrapped
輸出格式。
ascii
樣式使用純ASCII字元。資料中的換行符在右邊界使用 +
符號顯示。當 wrapped
格式在沒有換行符的情況下將資料從一行換到下一行時,點 (.
) 會顯示在第一行的右邊界中,並再次顯示在下一行的左邊界中。
old-ascii
樣式使用純ASCII字元,使用 PostgreSQL 8.4 及更早版本中使用的格式樣式。資料中的換行符使用 :
符號代替左側欄位分隔符顯示。當資料在沒有換行符的情況下從一行換到下一行時,;
符號會用於代替左側欄位分隔符。
unicode
樣式使用 Unicode 方塊繪製字元。資料中的換行符在右邊界使用回車符號顯示。當資料在沒有換行符的情況下從一行換到下一行時,省略符號會顯示在第一行的右邊界中,並再次顯示在下一行的左邊界中。
當 border
設定大於零時,linestyle
選項還會決定用於繪製邊框線的字元。純ASCII字元在任何地方都可以使用,但 Unicode 字元在識別它們的顯示器上看起來更好。
null
#設定要列印的字串以代替 Null 值。預設是不列印任何內容,這很容易被誤認為是空字串。例如,有人可能更喜歡 \pset null '(null)'
。
numericlocale
#如果指定了 value
,則必須是 on
或 off
,這將啟用或停用使用符合地區設定的字元來分隔小數點左側的數字群組。如果省略了 value
,則該命令會在一般和符合地區設定的數字輸出之間切換。
pager
#控制是否使用分頁程式來顯示查詢和 psql 的說明輸出。當 pager
選項為 off
時,不會使用分頁程式。當 pager
選項為 on
時,會在適當的情況下使用分頁程式,也就是當輸出到終端且無法容納在螢幕上時。 pager
選項也可以設定為 always
,這會導致分頁程式用於所有終端輸出,無論其是否適合螢幕。\pset pager
如果沒有 value
,則會在開啟和關閉分頁程式之間切換。
如果設定了環境變數 PSQL_PAGER
或 PAGER
,則要分頁的輸出會通過管道傳送到指定的程式。否則,將使用平台相依的預設程式(例如 more
)。
當使用 \watch
命令重複執行查詢時,會使用環境變數 PSQL_WATCH_PAGER
來尋找分頁程式,這只在 Unix 系統上。 由於它可能會混淆傳統的分頁程式,因此需要單獨配置,但可用於將輸出發送到理解 psql 輸出格式的工具(例如 pspg --stream
)。
pager_min_lines
#如果 pager_min_lines
設定為大於頁面高度的數字,則除非至少有這麼多行的輸出要顯示,否則不會呼叫分頁程式。預設設定為 0。
recordsep
#指定在不對齊輸出格式中使用的記錄(行)分隔符。預設值為換行符號。
recordsep_zero
#將不對齊輸出格式中使用的記錄分隔符設定為零位元組。
tableattr
(或 T
) #在HTML格式中,這指定要放置在 table
標籤內的屬性。例如,這可以是 cellpadding
或 bgcolor
。請注意,您可能不想在此處指定 border
,因為 \pset border
已經處理了它。如果未提供 value
,則會取消設定表格屬性。
在 latex-longtable
格式中,這控制包含左對齊資料類型之每個欄位的比例寬度。它被指定為一個以空白分隔的值列表,例如,'0.2 0.2 0.6'
。未指定的輸出欄位使用最後指定的值。
title
(或 C
) #為隨後列印的任何表格設定表格標題。這可用於為您的輸出提供描述性標籤。如果未提供 value
,則會取消設定標題。
tuples_only
(或 t
) #如果指定了 value
,則必須是 on
或 off
,這將啟用或停用僅顯示元組模式。如果省略了 value
,則該命令會在一般和僅顯示元組輸出之間切換。常規輸出包括額外的資訊,例如欄標題、標題和各種頁尾。在僅顯示元組模式下,僅顯示實際的表格資料。
unicode_border_linestyle
#將 unicode
線條樣式的邊框繪製樣式設定為 single
或 double
。
unicode_column_linestyle
#將 unicode
線條樣式的欄位繪製樣式設定為 single
或 double
。
unicode_header_linestyle
#將 unicode
線條樣式的標頭繪製樣式設定為 single
或 double
。
xheader_width
#將展開輸出的標頭最大寬度設定為 full
(預設值)、column
、page
或 integer value
。
full
:展開的標頭不會被截斷,並且將與最寬的輸出線一樣寬。
column
:將標頭行截斷為第一欄的寬度。
page
:將標頭行截斷為終端寬度。
integer value
:指定標頭行的確切最大寬度。
這些不同格式的外觀範例可以在下方的 範例中看到。
有幾個用於 \pset
的捷徑命令。 請參閱 \a
、\C
、\f
、\H
、\t
、\T
和 \x
。
\q
或 \quit
#退出 psql 程式。在腳本檔案中,只會終止該腳本的執行。
\qecho text
[ ... ]
#此命令與 \echo
相同,不同之處在於輸出將被寫入查詢輸出通道,如 \o
所設定。
\r
或 \reset
#重設(清除)查詢緩衝區。
\s [ filename
]
#將 psql 的命令列歷史記錄列印到 filename
。如果省略 filename
,則歷史記錄將被寫入標準輸出(如果合適,則使用分頁程式)。如果 psql 在建置時未支援 Readline,則此命令不可用。
\set [ name
[ value
[ ... ] ] ]
#將 psql 變數 name
設定為 value
,或者,如果給定多個值,則設定為所有值的串連。如果僅給定一個參數,則該變數將被設定為空字串值。要取消設定變數,請使用 \unset
命令。
不帶任何參數的 \set
會顯示所有目前已設定的 psql 變數的名稱和值。
有效的變數名稱可以包含字母、數字和底線。 有關詳細資訊,請參閱下方的 變數。變數名稱區分大小寫。
某些變數是特殊的,因為它們控制 psql 的行為或自動設定為反映連線狀態。 這些變數記錄在下方的 變數中。
這個指令與SQL指令 SET
無關。
\setenv name
[ value
]
#設定環境變數 name
為 value
,如果沒有提供 value
,則取消設定環境變數。範例:
testdb=>\setenv PAGER less
testdb=>\setenv LESS -imx4F
\sf[+] function_description
#此指令會擷取並顯示指定函式或程序的定義,形式為 CREATE OR REPLACE FUNCTION
或 CREATE OR REPLACE PROCEDURE
指令。定義會列印到目前查詢輸出通道,由 \o
設定。
目標函式可以僅通過名稱指定,也可以通過名稱和引數指定,例如 foo(integer, text)
。如果具有相同名稱的函式不止一個,則必須給出引數類型。
如果在指令名稱後面加上 +
,則輸出行的編號會從函式主體的第 1 行開始。
與大多數其他 meta-command 不同,整行剩餘的部分始終被視為 \sf
的參數,並且不會在參數中執行變數內插或反引號擴展。
\sv[+] view_name
#此指令會擷取並顯示指定檢視表的定義,形式為 CREATE OR REPLACE VIEW
指令。定義會列印到目前查詢輸出通道,由 \o
設定。
如果在指令名稱後面加上 +
,則輸出行的編號會從 1 開始。
與大多數其他 meta-command 不同,整行剩餘的部分始終被視為 \sv
的參數,並且不會在參數中執行變數內插或反引號擴展。
\t
#切換輸出欄位名稱標題和列數頁尾的顯示。此指令等同於 \pset tuples_only
,為方便起見而提供。
\T table_options
#指定要放置在HTML輸出格式的 table
標籤內的屬性。此指令等同於 \pset tableattr
。table_options
\timing [ on
| off
]
#使用參數時,開啟或關閉顯示每個 SQL 陳述式所花費的時間。不帶參數時,在開啟和關閉之間切換顯示。顯示的時間以毫秒為單位;超過 1 秒的間隔也以分鐘:秒格式顯示,如果需要,還會新增小時和天數字段。
\unset name
#取消設定(刪除)psql 變數 name
。
大多數控制 psql 行為的變數都無法取消設定;相反地,\unset
指令會被解釋為將它們設定為其預設值。請參閱下方的 變數。
\w
或 \write
filename
\w
或 \write
|
command
#將目前的查詢緩衝區寫入檔案 filename
或將其傳送到 shell 命令 command
。如果目前的查詢緩衝區為空,則會改為寫入最近執行的查詢。
如果引數以 |
開頭,則該行的其餘部分將被視為要執行的 command
,並且不會在其中執行變數內插或反引號擴充。 該行的其餘部分只會按字面傳遞到 shell。
\warn text
[ ... ]
#此指令與 \echo
相同,不同之處在於輸出將寫入 psql 的標準錯誤通道,而不是標準輸出。
\watch [ i[nterval]=seconds
] [ c[ount]=times
] [ m[in_rows]=rows
] [ seconds
]
#重複執行目前的查詢緩衝區(如 \g
所做的那樣),直到中斷,或查詢失敗,或達到執行次數限制(如果給定),或查詢不再傳回最少列數。在每次執行之間等待指定的秒數(預設為 2)。為了向後相容,可以使用或不使用 interval=
前綴來指定 seconds
。每個查詢結果都顯示一個標頭,其中包括 \pset title
字串(如果有的話)、查詢開始的時間以及延遲間隔。
如果目前的查詢緩衝區是空的,則會重新執行最近一次送出的查詢。
\x [ on
| off
| auto
]
#設定或切換展開表格格式模式。因此,它等同於 \pset expanded
。
\z[S] [ pattern
]
#列出表格、檢視表和序列及其相關的存取權限。如果指定了 pattern
,則只會列出名稱與模式相符的表格、檢視表和序列。預設情況下,只會顯示使用者建立的物件;提供模式或 S
修飾詞以包含系統物件。
這是 \dp
(“顯示權限”)的別名。
\! [ command
]
#不帶引數時,跳至子 shell;psql 會在子 shell 結束時恢復。帶引數時,執行 shell 命令 command
。
與大多數其他 meta-command 不同,整行剩餘的部分始終被視為 \!
的參數,並且不會在參數中執行變數內插或反引號擴展。該行的其餘部分只是按字面傳遞給 shell。
\? [ topic
]
#顯示說明資訊。可選的 topic
參數(預設為 commands
)選擇要說明 psql 的哪個部分:commands
描述 psql 的反斜線指令;options
描述可以傳遞給 psql 的命令列選項;variables
顯示有關 psql 組態變數的說明。
\;
#反斜線-分號與先前的指令不同,它不是 meta-command;相反地,它只會導致將分號新增到查詢緩衝區,而無需任何進一步的處理。
通常,psql 會在達到命令結尾的分號時立即將 SQL 命令傳送到伺服器,即使目前行中還有更多輸入。因此,例如,輸入
select 1; select 2; select 3;
會導致三個 SQL 指令個別傳送到伺服器,並且每個指令的結果會在繼續執行下一個指令之前顯示。不過,以 \;
形式輸入的分號不會觸發指令處理,因此它之前的指令和它之後的指令會有效地組合在一起,並以單一請求傳送到伺服器。例如:
select 1\; select 2\; select 3;
當遇到未經過反斜線處理的分號時,會導致將三個 SQL 指令以單一請求發送到伺服器。伺服器將以單一交易執行此類請求,除非字串中包含明確的 BEGIN
/COMMIT
指令將其劃分為多個交易。(有關伺服器如何處理多查詢字串的更多詳細資訊,請參閱第 53.2.2.1 節。)
各種 \d
指令接受一個 pattern
參數,用於指定要顯示的物件名稱。在最簡單的情況下,模式只是物件的確切名稱。模式中的字元通常會摺疊為小寫,就像 SQL 名稱一樣;例如,\dt FOO
將顯示名為 foo
的資料表。與 SQL 名稱一樣,在模式周圍加上雙引號會停止摺疊為小寫。如果您需要在模式中包含實際的雙引號字元,請在雙引號序列中將其寫成一對雙引號;同樣,這符合 SQL 引號識別符的規則。例如,\dt "FOO""BAR"
將顯示名為 FOO"BAR
的資料表(而不是 foo"bar
)。與 SQL 名稱的正常規則不同,您可以僅在模式的一部分周圍加上雙引號,例如 \dt FOO"FOO"BAR
將顯示名為 fooFOObar
的資料表。
每當完全省略 pattern
參數時,\d
指令會顯示目前結構描述搜尋路徑中可見的所有物件 — 這等效於使用 *
作為模式。(如果物件的包含結構描述位於搜尋路徑中,並且在搜尋路徑中沒有相同種類和名稱的物件出現在較早的位置,則稱該物件為可見的。這相當於聲明物件可以通過名稱引用,而無需明確的結構描述限定。)若要查看資料庫中的所有物件,而不考慮可見性,請使用 *.*
作為模式。
在模式中,*
匹配任何字元序列(包括沒有字元),而 ?
匹配任何單個字元。(此表示法可與 Unix shell 檔案名稱模式相比較。)例如,\dt int*
顯示名稱以 int
開頭的資料表。但在雙引號內,*
和 ?
會失去這些特殊含義,並且只會按字面匹配。
包含點 (.
) 的關係模式被解釋為結構描述名稱模式,後跟物件名稱模式。例如,\dt foo*.*bar*
顯示資料表名稱包含 bar
且位於結構描述名稱以 foo
開頭的結構描述中的所有資料表。當沒有點出現時,該模式僅匹配目前結構描述搜尋路徑中可見的物件。同樣,雙引號內的點會失去其特殊含義,並且只會按字面匹配。包含兩個點 (.
) 的關係模式被解釋為資料庫名稱,後跟結構描述名稱模式,後跟物件名稱模式。資料庫名稱部分將不被視為模式,並且必須與目前連線的資料庫的名稱匹配,否則將引發錯誤。
包含點 (.
) 的結構描述模式被解釋為資料庫名稱,後跟結構描述名稱模式。例如,\dn mydb.*foo*
顯示結構描述名稱包含 foo
的所有結構描述。資料庫名稱部分將不被視為模式,並且必須與目前連線的資料庫的名稱匹配,否則將引發錯誤。
進階使用者可以使用諸如字元類別的正規表示式表示法,例如 [0-9]
以匹配任何數字。所有正規表示式特殊字元都按照第 9.7.3 節中指定的運作方式運作,除了上面提到的作為分隔符的 .
、轉換為正規表示式表示法 .*
的 *
、轉換為 .
的 ?
以及按字面匹配的 $
之外。您可以通過根據需要編寫 ?
表示 .
、(
表示 R
+|)
或 R
*(
表示 R
|)
來模擬這些模式字元。R
?$
不需要作為正規表示式字元,因為模式必須匹配整個名稱,這與正規表示式的通常解釋不同(換句話說,$
會自動附加到您的模式)。如果您不希望模式被錨定,請在開頭和/或結尾編寫 *
。請注意,在雙引號內,所有正規表示式特殊字元都會失去其特殊含義,並且只會按字面匹配。此外,正規表示式特殊字元在運算符名稱模式中也會按字面匹配(即,\do
的引數)。
psql 提供了類似於常見 Unix 命令 shell 的變數替換功能。變數只是名稱/值對,其中值可以是任何長度的任何字串。名稱必須由字母(包括非拉丁字母)、數字和底線組成。
若要設定變數,請使用 psql 元指令 \set
。例如:
testdb=> \set foo bar
將變數 foo
設定為值 bar
。若要檢索變數的內容,請在名稱前面加上冒號,例如
testdb=> \echo :foo
bar
這適用於常規 SQL 指令和元指令;在下面的SQL 內插中有更多詳細資訊。
如果您在沒有第二個引數的情況下呼叫 \set
,則該變數會設定為空字串值。若要取消設定(即刪除)變數,請使用指令 \unset
。若要顯示所有變數的值,請在沒有任何引數的情況下呼叫 \set
。
\set
命令的參數遵循與其他命令相同的替換規則。因此,您可以建構有趣的參照,例如 \set :foo 'something'
,並獲得 “軟連結” 或 “變數變數”,如同 Perl 或 PHP 中著名的用法。遺憾的是(或者幸運的是?),使用這些結構無法做任何有用的事情。另一方面,\set bar :foo
是一種完全有效複製變數的方法。
許多這些變數會被 psql 特別處理。它們代表某些選項設定,可以在執行時透過變更變數的值來更改,或者在某些情況下代表 psql 的可變狀態。按照慣例,所有經過特殊處理的變數名稱都由全大寫的 ASCII 字母(以及可能的數字和底線)組成。為了確保未來最大的相容性,請避免將此類變數名稱用於您自己的目的。
控制 psql 行為的變數通常無法取消設定或設定為無效值。允許使用 \unset
命令,但它被解釋為將變數設定為其預設值。沒有第二個參數的 \set
命令被解釋為將變數設定為 on
,對於接受該值的控制變數而言,而對於其他變數則會被拒絕。此外,接受 on
和 off
值的控制變數也將接受布林值的其他常見拼寫,例如 true
和 false
。
經過特殊處理的變數如下:
AUTOCOMMIT
#當 on
(預設值)時,每個 SQL 命令在成功完成後都會自動提交。若要在此模式下延遲提交,您必須輸入 BEGIN
或 START TRANSACTION
SQL 命令。當 off
或未設定時,SQL 命令不會提交,直到您明確發出 COMMIT
或 END
命令。自動提交關閉模式的工作方式是為您隱式發出 BEGIN
,就在任何尚未處於交易區塊中,且本身不是 BEGIN
或其他交易控制命令,也不是無法在交易區塊內執行的命令(例如 VACUUM
)之前的任何命令之前。
在自動提交關閉模式下,您必須透過輸入 ABORT
或 ROLLBACK
來明確放棄任何失敗的交易。另請記住,如果您在未提交的情況下退出會話,您的工作將會遺失。
自動提交開啟模式是 PostgreSQL 的傳統行為,但自動提交關閉更接近 SQL 規範。如果您更喜歡自動提交關閉,您可能希望在系統範圍的 psqlrc
檔案或您的 ~/.psqlrc
檔案中設定它。
COMP_KEYWORD_CASE
#決定完成 SQL 關鍵字時要使用的字母大小寫。如果設定為 lower
或 upper
,則完成的單字將分別為小寫或大寫。如果設定為 preserve-lower
或 preserve-upper
(預設值),則完成的單字將與已輸入的單字的大小寫相同,但未輸入任何內容時完成的單字將分別為小寫或大寫。
DBNAME
#您目前連接的資料庫名稱。每次您連接到資料庫(包括程式啟動)時都會設定此變數,但可以變更或取消設定。
ECHO
#如果設定為 all
,則所有非空的輸入行都會在讀取時列印到標準輸出。(這不適用於以互動方式讀取的行。)若要在程式啟動時選擇此行為,請使用開關 -a
。如果設定為 queries
,psql 會在將每個查詢傳送到伺服器時將其列印到標準輸出。選擇此行為的開關是 -e
。如果設定為 errors
,則只有失敗的查詢才會顯示在標準錯誤輸出上。此行為的開關是 -b
。如果設定為 none
(預設值),則不會顯示任何查詢。
ECHO_HIDDEN
#當此變數設定為 on
且反斜線命令查詢資料庫時,會首先顯示查詢。此功能可協助您研究 PostgreSQL 內部結構,並在您自己的程式中提供類似的功能。(若要在程式啟動時選擇此行為,請使用開關 -E
。)如果您將此變數設定為值 noexec
,則只會顯示查詢,但實際上不會將其傳送到伺服器並執行。預設值為 off
。
ENCODING
#目前的客戶端字元集編碼。每次您連接到資料庫(包括程式啟動)時,以及當您使用 \encoding
變更編碼時,都會設定此變數,但可以變更或取消設定。
ERROR
#如果上一個 SQL 查詢失敗,則為 true
,如果成功,則為 false
。另請參閱 SQLSTATE
。
FETCH_COUNT
#如果此變數設定為大於零的整數值,則 SELECT
查詢的結果會以該數量的行分組擷取和顯示,而不是在顯示之前收集整個結果集的預設行為。因此,無論結果集的大小如何,都只會使用有限的記憶體。啟用此功能時,通常會使用 100 到 1000 的設定。請記住,當使用此功能時,查詢可能會在已經顯示某些行之後失敗。
雖然您可以將任何輸出格式與此功能一起使用,但預設的 aligned
格式往往看起來很糟糕,因為每組 FETCH_COUNT
行將被單獨格式化,導致行組之間的欄寬不同。其他輸出格式效果更好。
HIDE_TABLEAM
#如果此變數設定為 true
,則不會顯示表格的存取方法詳細資訊。這主要用於迴歸測試。
HIDE_TOAST_COMPRESSION
#如果此變數設定為 true
,則不會顯示欄位壓縮方法的詳細資訊。這主要用於迴歸測試。
HISTCONTROL
#如果此變數設為 ignorespace
,則以空格開頭的行不會被加入到歷史紀錄列表中。如果設為 ignoredups
,則與前一個歷史紀錄行匹配的行不會被加入。如果設為 ignoreboth
,則會合併這兩個選項。如果設為 none
(預設值),則所有在互動模式下讀取的行都會被儲存到歷史紀錄列表中。
此功能是厚顏無恥地從 Bash 抄襲而來。
HISTFILE
#將用於儲存歷史紀錄列表的檔案名稱。如果未設定,則檔案名稱取自 PSQL_HISTORY
環境變數。如果該變數也未設定,則預設值為 ~/.psql_history
,或 Windows 上的 %APPDATA%\postgresql\psql_history
。例如,將
\set HISTFILE ~/.psql_history-:DBNAME
放入 ~/.psqlrc
中會使 psql 為每個資料庫維護一個單獨的歷史紀錄。
此功能是厚顏無恥地從 Bash 抄襲而來。
HISTSIZE
#命令歷史紀錄中要儲存的最大命令數 (預設為 500)。如果設定為負值,則不套用限制。
此功能是厚顏無恥地從 Bash 抄襲而來。
HOST
#您目前連接的資料庫伺服器主機。每次連接到資料庫時 (包括程式啟動時) 都會設定此值,但可以變更或取消設定。
IGNOREEOF
#如果設定為 1 或更小,則將EOF字元 (通常是 Control+D) 發送到 psql 的互動式會話將終止應用程式。如果設定為更大的數值,則必須輸入那麼多連續的EOF字元才能使互動式會話終止。如果變數設定為非數值,則會將其解釋為 10。預設值為 0。
此功能是厚顏無恥地從 Bash 抄襲而來。
LASTOID
#最後一個受影響的 OID 的值,如從 INSERT
或 \lo_import
命令返回的值。此變數僅保證在下一個SQL命令的結果顯示之後才有效。自版本 12 以來的 PostgreSQL 伺服器不再支援 OID 系統欄位,因此,當目標伺服器為這些伺服器時,INSERT
之後 LASTOID 將始終為 0。
LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE
#目前 psql 會話中最近一次失敗查詢的主要錯誤訊息和相關聯的 SQLSTATE 代碼,如果在目前會話中未發生錯誤,則為空字串和 00000
。
ON_ERROR_ROLLBACK
#當設定為 on
時,如果交易區塊中的語句產生錯誤,則會忽略該錯誤,並且交易繼續。當設定為 interactive
時,僅在互動式會話中忽略此類錯誤,而不是在讀取腳本檔案時。當設定為 off
(預設值) 時,交易區塊中產生錯誤的語句會中止整個交易。錯誤回滾模式的工作方式是在交易區塊中的每個命令之前發出隱式的 SAVEPOINT
,然後在命令失敗時回滾到儲存點。
ON_ERROR_STOP
#預設情況下,命令處理在發生錯誤後繼續。當此變數設定為 on
時,處理將立即停止。在互動模式下,psql 將返回到命令提示字元;否則,psql 將退出,返回錯誤代碼 3,以將此情況與使用錯誤代碼 1 報告的致命錯誤情況區分開來。在任何一種情況下,任何目前正在運行的腳本 (頂層腳本,如果有的話,以及它可能調用的任何其他腳本) 都將立即終止。如果頂層命令字串包含多個 SQL 命令,則處理將在目前命令處停止。
PORT
#您目前連接的資料庫伺服器埠。每次連接到資料庫時 (包括程式啟動時) 都會設定此值,但可以變更或取消設定。
PROMPT1
PROMPT2
PROMPT3
#這些指定 psql 發出的提示符號的外觀。請參閱下面的 提示符號。
QUIET
#將此變數設定為 on
等同於命令列選項 -q
。在互動模式下可能不是很有用。
ROW_COUNT
#最後一個 SQL 查詢返回或影響的列數,如果查詢失敗或未報告列數,則為 0。
SERVER_VERSION_NAME
SERVER_VERSION_NUM
#伺服器的版本號,以字串形式表示,例如 9.6.2
、10.1
或 11beta1
,以及數字形式表示,例如 90602
或 100001
。每次連接到資料庫時 (包括程式啟動時) 都會設定這些值,但可以變更或取消設定。
SHELL_ERROR
#如果最後一個 shell 命令失敗,則為 true
;如果成功,則為 false
。這適用於透過 \!
、\g
、\o
、\w
和 \copy
元命令調用的 shell 命令,以及反引號 (`
) 擴展。請注意,對於 \o
,此變數會在下一個 \o
命令關閉輸出管道時更新。另請參閱 SHELL_EXIT_CODE
。
SHELL_EXIT_CODE
#上次 shell 命令所回傳的結束狀態。0–127 代表程式結束碼,128–255 表示因訊號終止,而 -1 表示啟動程式失敗或無法收集其結束狀態。這適用於透過 \!
、\g
、\o
、\w
和 \copy
Meta 命令,以及反引號 (`
) 擴展所調用的 shell 命令。請注意,對於 \o
,此變數會在下一個 \o
命令關閉輸出管道時更新。另請參閱 SHELL_ERROR
。
SHOW_ALL_RESULTS
#當此變數設定為 off
時,只會顯示合併查詢 (\;
) 的最後一個結果,而不是全部顯示。預設值為 on
。設定為 off 是為了與舊版本的 psql 相容。
SHOW_CONTEXT
#此變數可以設定為 never
、errors
或 always
等值,以控制是否在來自伺服器的訊息中顯示 CONTEXT
欄位。預設值為 errors
(表示 context 將顯示在錯誤訊息中,但不顯示在通知或警告訊息中)。當 VERBOSITY
設定為 terse
或 sqlstate
時,此設定無效。(另請參閱 \errverbose
,用於取得您剛剛收到的錯誤的詳細版本。)
SINGLELINE
#將此變數設定為 on
等同於指令行選項 -S
。
SINGLESTEP
#將此變數設定為 on
等同於指令行選項 -s
。
SQLSTATE
#與上次 SQL 查詢失敗相關的錯誤代碼(請參閱附錄 A),如果成功則為 00000
。
USER
#您目前連線到的資料庫使用者。每次連線到資料庫時(包括程式啟動時)都會設定此值,但可以變更或取消設定。
VERBOSITY
#此變數可以設定為 default
、verbose
、terse
或 sqlstate
等值,以控制錯誤報告的詳細程度。(另請參閱 \errverbose
,用於取得您剛剛收到的錯誤的詳細版本。)
VERSION
VERSION_NAME
VERSION_NUM
#這些變數在程式啟動時設定,以分別反映 psql 的版本,以詳細字串、簡短字串(例如,9.6.2
、10.1
或 11beta1
)和數字(例如,90602
或 100001
)表示。它們可以被更改或取消設定。
psql 變數的一個主要特性是您可以將它們替換(“內插”)到常規的SQL語句,以及 Meta 命令的參數中。此外,psql 提供了確保用作 SQL 字面值和識別符的變數值被正確引用的工具。在不使用任何引號的情況下內插值的語法是在變數名稱前加上冒號 (:
)。例如,
testdb=>\set foo 'my_table'
testdb=>SELECT * FROM :foo;
將查詢 my_table
表。請注意,這可能不安全:變數的值會被逐字複製,因此它可能包含不平衡的引號,甚至反斜線命令。您必須確保它在您放置的地方有意義。
當一個值要用作 SQL 字面值或識別符時,最安全的做法是安排對其進行引用。要將變數的值引用為 SQL 字面值,請寫一個冒號,後跟單引號中的變數名稱。要將該值引用為 SQL 識別符,請寫一個冒號,後跟雙引號中的變數名稱。這些結構可以正確處理嵌入在變數值中的引號和其他特殊字元。先前的範例可以更安全地寫成這樣
testdb=>\set foo 'my_table'
testdb=>SELECT * FROM :"foo";
變數內插將不會在引用的SQL字面值和識別符內執行。因此,諸如 ':foo'
之類的結構無法從變數的值產生引用的字面值(如果它確實有效,那將是不安全的,因為它無法正確處理嵌入在值中的引號)。
此機制的一個用例是將檔案的內容複製到表格欄位中。首先將檔案載入到一個變數中,然後將該變數的值內插為引用的字串
testdb=>\set content `cat my_file.txt`
testdb=>INSERT INTO my_table VALUES (:'content');
(請注意,如果 my_file.txt
包含 NUL 位元組,這仍然不起作用。psql 不支援變數值中嵌入的 NUL 位元組。)
由於冒號在 SQL 命令中是合法出現的,因此除非目前已設定指定的變數,否則不會替換對內插的明顯嘗試(即 :name
、:'name'
或 :"name"
)。在任何情況下,您都可以使用反斜線來跳脫冒號,以防止其被替換。
:{?
特殊語法會根據變數是否存在傳回 TRUE 或 FALSE,因此始終會被替換,除非冒號使用反斜線跳脫。name
}
變數的冒號語法是標準的SQL對於嵌入式查詢語言,例如 ECPG。用於陣列切片和類型轉換的冒號語法是 PostgreSQL 擴展,有時會與標準用法衝突。用於將變數的值作為 SQL 字面值或識別符跳脫的冒號引用語法是 psql 擴展。
psql 發出的提示可以根據您的喜好進行自訂。三個變數 PROMPT1
、PROMPT2
和 PROMPT3
包含字串和特殊跳脫序列,這些字串和特殊跳脫序列描述了提示的外觀。提示 1 是 psql 請求新命令時發出的正常提示。提示 2 在命令輸入期間需要更多輸入時發出,例如,因為命令沒有以分號終止或引號未關閉。當您正在執行SQL COPY FROM STDIN
命令並且您需要在終端機上輸入列值時,會發出提示 3。
選定的提示變數的值會被逐字列印,除非遇到百分比符號 (%
)。根據下一個字元,將替換為某些其他文字。定義的替換包括
%M
#資料庫伺服器的完整主機名稱(含網域名稱),如果連線是透過 Unix 網域 socket,則為 [local]
,如果 Unix 網域 socket 不在編譯時的預設位置,則為 [local:
。/dir/name
]
%m
#資料庫伺服器的主機名稱,在第一個點處截斷,如果連線是透過 Unix 網域套接字,則顯示為 [local]
。
%>
#資料庫伺服器正在監聽的埠號。
%n
#資料庫連線的使用者名稱。(此值的擴展可能會在資料庫連線期間,因執行 SET SESSION AUTHORIZATION
指令而改變。)
%/
#目前資料庫的名稱。
%~
#與 %/
類似,但如果資料庫是您的預設資料庫,則輸出為 ~
(波浪符號)。
%#
#如果連線使用者是資料庫超級使用者,則顯示 #
,否則顯示 >
。(此值的擴展可能會在資料庫連線期間,因執行 SET SESSION AUTHORIZATION
指令而改變。)
%p
#目前連線的後端處理程序的 ID。
%R
#在提示符號 1 中,通常為 =
,但如果連線處於條件區塊的非作用中分支中,則為 @
;如果在單行模式下,則為 ^
;如果連線已與資料庫斷開(如果 \connect
失敗,可能會發生這種情況),則為 !
。 在提示符號 2 中,%R
會被一個字元取代,該字元取決於 psql 預期更多輸入的原因:如果指令尚未終止,則為 -
;如果有未完成的 /* ... */
註解,則為 *
;如果有未完成的引號字串,則為單引號;如果有未完成的引號識別符,則為雙引號;如果有未完成的美元引號字串,則為美元符號;如果有未配對的左括號,則為 (
。 在提示符號 3 中,%R
不會產生任何內容。
%x
#交易狀態:當不在交易區塊中時,為空字串;在交易區塊中時,為 *
;在失敗的交易區塊中時,為 !
;當交易狀態不確定時(例如,因為沒有連線),則為 ?
。
%l
#目前陳述式中的行號,從 1
開始。
%
digits
#將替換為具有指定八進位碼的字元。
%:
name
:
#psql 變數 name
的值。 有關詳細信息,請參閱上面的變數。
%`
command
`
#command
的輸出,類似於一般的 “反引號” 替換。
%[
... %]
#提示符號可以包含終端控制字元,例如,更改提示文字的顏色、背景或樣式,或更改終端視窗的標題。 為了使 Readline 的行編輯功能正常工作,這些非列印控制字元必須用 %[
和 %]
括起來以指定為不可見。 可以在提示符號中出現多個這些配對。 例如
testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
在與 VT100 相容且具有彩色功能的終端機上,產生粗體 (1;
) 黃色底黑字 (33;40
) 的提示符號。
%w
#與 PROMPT1
最近輸出的寬度相同的空白。 這可以用作 PROMPT2
設定,以便多行陳述式與第一行對齊,但沒有可見的第二提示符號。
若要在提示符號中插入百分比符號,請寫入 %%
。 預設的提示符號是提示符號 1 和 2 的 '%/%R%x%# '
,提示符號 3 的 '>> '
。
此功能厚顏無恥地抄襲自 tcsh。
如果可用,psql 會使用 Readline 或 libedit 函式庫,以便於進行行編輯和擷取。 命令歷史記錄會在 psql 結束時自動儲存,並在 psql 啟動時重新載入。 輸入向上箭頭或 control-P 以擷取先前的行。
您也可以使用 Tab 鍵完成來填寫許多(但絕非全部)內容中部分輸入的關鍵字和 SQL 物件名稱。 例如,在指令的開頭,輸入 ins
並按下 TAB 鍵將會填入 insert into
。 然後,輸入表格或結構描述名稱的幾個字元並按下 TAB
鍵將會填寫未完成的名稱,或者在有多個可能完成的情況下提供可能完成的選單。(根據使用的函式庫,您可能需要多次按下 TAB
鍵才能取得選單。)
SQL 物件名稱的 Tab 鍵完成需要將查詢傳送到伺服器以尋找可能的相符項。 在某些情況下,這可能會干擾其他操作。 例如,在 BEGIN
之後,如果在發出 Tab 鍵完成查詢的間隙發出 SET TRANSACTION ISOLATION LEVEL
,則為時已晚。 如果您完全不想要 Tab 鍵完成,您可以將此內容放入您主目錄中名為 .inputrc
的檔案中,以永久關閉它
$if psql set disable-completion on $endif
(這不是 psql 功能,而是 Readline 功能。 請閱讀其文件以取得更多詳細資訊。)
-n
(--no-readline
) 命令列選項也可用於在單次執行 psql 時停用 Readline 的使用。 這會防止 Tab 鍵完成、使用或記錄命令列歷史記錄,以及編輯多行指令。 當您需要複製並貼上包含 TAB
字元的文字時,它特別有用。
COLUMNS
#如果 \pset columns
為零,則控制 wrapped
格式的寬度,以及決定寬輸出是否需要分頁程式或是否應在展開的自動模式下切換到垂直格式的寬度。
PGDATABASE
PGHOST
PGPORT
PGUSER
#預設連線參數(請參閱第 32.15 節)。
PG_COLOR
#指定是否在診斷訊息中使用顏色。 可能的值為 always
、auto
和 never
。
PSQL_EDITOR
EDITOR
VISUAL
#\e
、\ef
和 \ev
指令使用的編輯器。 這些變數依列出的順序檢查;使用設定的第一個變數。 如果沒有設定任何變數,則預設是在 Unix 系統上使用 vi
,在 Windows 系統上使用 notepad.exe
。
PSQL_EDITOR_LINENUMBER_ARG
#當 \e
、\ef
或 \ev
與行號參數一起使用時,此變數指定用於將起始行號傳遞給使用者編輯器的命令列參數。 對於 Emacs 或 vi 等編輯器,這是一個加號。 如果選項名稱和行號之間需要空格,請在變數的值中包含一個尾隨空格。 範例:
PSQL_EDITOR_LINENUMBER_ARG='+' PSQL_EDITOR_LINENUMBER_ARG='--line '
在 Unix 系統上,預設值為 +
(對應於預設編輯器 vi
,並且適用於許多其他常見編輯器);但在 Windows 系統上沒有預設值。
PSQL_HISTORY
#命令歷史記錄檔的替代位置。 執行波浪符號 (~
) 展開。
PSQL_PAGER
PAGER
#如果查詢的結果不適合在螢幕上顯示,則會通過此命令傳送它們。 典型值為 more
或 less
。 可以通過將 PSQL_PAGER
或 PAGER
設置為空字串,或通過調整 \pset
命令的 pager 相關選項來禁用 pager 的使用。 這些變數會依列出的順序檢查;使用第一個被設定的變數。 如果它們都沒有設定,則在大多數平台上預設使用 more
,但在 Cygwin 上預設使用 less
。
PSQL_WATCH_PAGER
#使用 \watch
命令重複執行查詢時,預設不使用 pager。 可以通過在 Unix 系統上將 PSQL_WATCH_PAGER
設置為 pager 命令來更改此行為。 如果使用選項 --stream
啟動,則 pspg
pager(不是 PostgreSQL 的一部分,但在許多開放原始碼軟體發行版中可用)可以顯示 \watch
的輸出。
PSQLRC
#使用者 .psqlrc
檔案的替代位置。 執行波浪符號 (~
) 展開。
SHELL
#由 \!
命令執行的命令。
TMPDIR
#用於儲存暫存檔的目錄。 預設值為 /tmp
。
此工具與大多數其他 PostgreSQL 工具一樣,也使用 libpq 支援的環境變數(請參閱第 32.15 節)。
psqlrc
和 ~/.psqlrc
#除非傳遞了 -X
選項,否則 psql 會嘗試從系統範圍的啟動檔案 (psqlrc
) 和使用者的個人啟動檔案 (~/.psqlrc
) 讀取和執行命令,在連接到資料庫之後但在接受一般命令之前。 這些檔案可用於設置用戶端和/或伺服器,通常使用 \set
和 SET
命令。
系統範圍的啟動檔案名為 psqlrc
。 預設情況下,它會在安裝的 “系統配置” 目錄中尋找,通過運行 pg_config --sysconfdir
可以最可靠地識別該目錄。 通常,此目錄相對於包含 PostgreSQL 可執行檔的目錄,會是 ../etc/
。 可以通過 PGSYSCONFDIR
環境變數顯式設定要查找的目錄。
使用者的個人啟動檔案名為 .psqlrc
,並在其調用使用者的 home 目錄中尋找。 在 Windows 上,個人啟動檔案改名為 %APPDATA%\postgresql\psqlrc.conf
。 無論哪種情況,都可以通過設定 PSQLRC
環境變數來覆蓋此預設檔案路徑。
系統範圍的啟動檔案和使用者的個人啟動檔案都可以通過附加破折號和 PostgreSQL 的主要或次要版本識別碼到檔名,從而使其成為特定於 psql 版本的,例如 ~/.psqlrc-17
或 ~/.psqlrc-17.2
。 最特定的版本匹配檔案將優先於非版本特定的檔案讀取。 這些版本後綴是在如上所述確定檔案路徑後添加的。
.psql_history
#命令列歷史記錄儲存在檔案 ~/.psql_history
中,或者在 Windows 上儲存在 %APPDATA%\postgresql\psql_history
中。
歷史記錄檔的位置可以通過 HISTFILE
psql 變數或 PSQL_HISTORY
環境變數顯式設定。
psql 最好與相同或較舊的主要版本的伺服器一起使用。 如果伺服器的版本比 psql 本身更新,則反斜線命令特別容易失敗。 但是,\d
系列的反斜線命令應該可以使用版本追溯到 9.2 的伺服器,但不一定可以使用比 psql 本身更新的伺服器。 運行 SQL 命令和顯示查詢結果的通用功能也應該適用於較新主要版本的伺服器,但在所有情況下都無法保證。
如果您想使用 psql 連接到多個不同主要版本的伺服器,建議您使用最新版本的 psql。 或者,您可以保留每個主要版本的 psql 副本,並確保使用與相應伺服器匹配的版本。 但實際上,這種額外的複雜性應該沒有必要。
在 PostgreSQL 9.6 之前,-c
選項意味著 -X
(--no-psqlrc
);現在已不再如此。
在 PostgreSQL 8.4 之前,psql 允許單字母反斜線命令的第一個參數在命令之後立即開始,而沒有中間的空白字元。 現在,需要一些空白字元。
psql 被建置為 “主控台應用程式”。 由於 Windows 主控台視窗使用的編碼與系統的其餘部分不同,因此在使用 psql 中的 8 位字元時必須特別小心。 如果 psql 檢測到有問題的主控台代碼頁,它將在啟動時警告您。 要更改主控台代碼頁,需要做兩件事:
通過輸入 cmd.exe /c chcp 1252
設定代碼頁。(1252 是適用於德語的代碼頁;將其替換為您的值。)如果您使用 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 "public.my_table"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
first | integer | | not null | 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 csv
Output format is csv. peter@localhost testdb=>\pset tuples_only
Tuples only is on. peter@localhost testdb=>SELECT second, first FROM my_table;
one,1 two,2 three,3 four,4 peter@localhost testdb=>\pset format unaligned
Output format is unaligned. peter@localhost testdb=>\pset fieldsep '\t'
Field separator is " ". 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
此外,這些輸出格式選項可以透過使用 \g
,只針對單一查詢進行設定
peter@localhost testdb=>SELECT * FROM my_table
peter@localhost testdb->\g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
以下是一個使用 \df
指令的範例,只尋找名稱符合 int*pl
且第二個參數類型為 bigint
的函式
testdb=> \df int*pl * bigint
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
pg_catalog | int28pl | bigint | smallint, bigint | func
pg_catalog | int48pl | bigint | integer, bigint | func
pg_catalog | int8pl | bigint | bigint, bigint | func
(3 rows)
在適當的情況下,查詢結果可以使用 \crosstabview
指令以交叉表方式呈現
testdb=>SELECT first, second, first > 2 AS gt2 FROM my_table;
first | second | gt2 -------+--------+----- 1 | one | f 2 | two | f 3 | three | t 4 | four | t (4 rows) testdb=>\crosstabview first second
first | one | two | three | four -------+-----+-----+-------+------ 1 | f | | | 2 | | f | | 3 | | | t | 4 | | | | t (4 rows)
第二個範例顯示了一個乘法表,其中行以反向數字順序排序,而列則以獨立的升序數字順序排列。
testdb=>SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
testdb->row_number() over(order by t2.first) AS ord
testdb->FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb->\crosstabview "A" "B" "AxB" ord
A | 101 | 102 | 103 | 104 ---+-----+-----+-----+----- 4 | 404 | 408 | 412 | 416 3 | 303 | 306 | 309 | 312 2 | 202 | 204 | 206 | 208 1 | 101 | 102 | 103 | 104 (4 rows)
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清之處,請使用此表單來回報文件問題。