psql — PostgreSQL 互動式終端
psql
[選項
...] [資料庫名
[使用者名稱
]]
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=命令
#指定 psql 將執行給定的命令字串 命令
。此選項可以重複並與 -f
選項以任意順序組合。當指定了 -c
或 -f
時,psql 不會從標準輸入讀取命令;而是在按順序處理完所有 -c
和 -f
選項後終止。
命令
必須是伺服器完全可解析的命令字串(即,它不包含 psql 特有的功能),或是一個單獨的反斜槓命令。因此,您不能在 -c
選項中混用SQL和 psql 元命令。要實現這一點,您可以使用重複的 -c
選項或將字串透過管道傳輸到 psql,例如
psql -c '\x' -c 'SELECT * FROM foo;'
或
echo '\x \\ SELECT * FROM foo;' | psql
(\\
是分隔符元命令)。
傳遞給 -c
的每個SQL傳遞給 -c
的命令字串作為單個請求傳送到伺服器。因此,即使字串包含多個SQL命令,伺服器也會將其作為單個事務執行,除非字串中包含顯式的 BEGIN
/COMMIT
命令將其分成多個事務。(有關伺服器如何處理多查詢字串的更多詳細資訊,請參閱第 54.2.2.1 節)。
如果不需要在單個事務中執行多個命令,請使用重複的 -c
命令或將多個命令提供給 psql 的標準輸入,可以使用上面所示的 echo,或者透過 shell 的 here-document,例如
psql <<EOF \x SELECT * FROM foo; EOF
--csv
#切換到CSV(逗號分隔值)輸出模式。這等同於 \pset format csv
。
-d 資料庫名
--dbname=資料庫名
#指定要連線的資料庫名稱。這等同於在命令列上將 資料庫名
指定為第一個非選項引數。資料庫名
可以是連線字串。如果是這樣,連線字串引數將覆蓋任何衝突的命令列選項。
-e
--echo-queries
#將所有傳送到伺服器的 SQL 命令也複製到標準輸出。這等同於將變數 ECHO
設定為 queries
。
-E
--echo-hidden
#回顯由 \d
和其他反斜槓命令生成的實際查詢。您可以使用此功能來研究 psql 的內部操作。這等同於將變數 ECHO_HIDDEN
設定為 on
。
-f 檔名
--file=檔名
#從檔案 檔名
而不是標準輸入讀取命令。此選項可以重複並與 -c
選項以任何順序組合。當指定 -c
或 -f
時,psql 不會從標準輸入讀取命令;而是在按順序處理完所有 -c
和 -f
選項後終止。除此之外,此選項大致等同於元命令 \i
。
如果 filename
是 -
(連字元),則讀取標準輸入直到 EOF 指示或 \q
元命令。這可以用於將互動式輸入與檔案輸入交錯。但是請注意,在這種情況下不使用 Readline(就像指定了 -n
一樣)。
使用此選項與編寫 psql <
略有不同。一般來說,兩者都會產生您預期的結果,但使用 filename
-f
啟用了一些很好的功能,例如帶有行號的錯誤訊息。使用此選項還可能略微減少啟動開銷。另一方面,使用 shell 輸入重定向的變體(理論上)保證產生與您手動輸入所有內容完全相同的輸出。
-F 分隔符
--field-separator=分隔符
#使用 separator
作為非對齊輸出的欄位分隔符。這等同於 \pset fieldsep
或 \f
。
-h 主機名
--host=主機名
#指定伺服器執行的機器的主機名。如果該值以斜槓開頭,則將其用作 Unix 域套接字的目錄。
-H
--html
#切換到HTML輸出模式。這等同於 \pset format html
或 \H
命令。
-l
--list
#列出所有可用資料庫,然後退出。其他非連線選項將被忽略。這類似於元命令 \list
。
使用此選項時,psql 將連線到資料庫 postgres
,除非在命令列上指定了不同的資料庫(選項 -d
或非選項引數,可能透過服務條目,但不透過環境變數)。
-L filename
--log-file=filename
#除了正常輸出目標外,還將所有查詢輸出寫入檔案 filename
。
-n
--no-readline
#不使用 Readline 進行行編輯,也不使用命令歷史(請參閱下面的“命令列編輯”一節)。
-o 檔名
--output=檔名
#將所有查詢輸出放入檔案 filename
。這等同於命令 \o
。
-p 埠
--port=埠
#指定伺服器正在監聽連線的 TCP 埠或本地 Unix 域套接字副檔名。預設為 PGPORT
環境變數的值,如果未設定,則預設為編譯時指定的埠,通常為 5432。
-P 賦值
--pset=賦值
#指定列印選項,其風格類似於 \pset
。請注意,此處您必須用等號而不是空格分隔名稱和值。例如,要將輸出格式設定為 LaTeX,您可以寫入 -P format=latex
。
-q
--quiet
#指定 psql 應該安靜地工作。預設情況下,它會列印歡迎訊息和各種資訊輸出。如果使用此選項,則不會發生這些情況。這對於 -c
選項很有用。這等同於將變數 QUIET
設定為 on
。
-R 分隔符
--record-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
的身份連線到資料庫,而不是預設使用者。(當然,您必須有這樣做的許可權。)
-v 賦值
--set=賦值
--variable=賦值
#執行變數賦值,類似於 \set
元命令。請注意,在命令列上,您必須用等號分隔名稱和值(如果有的話)。要取消設定變數,請省略等號。要將變數設定為空值,請使用等號,但省略值。這些賦值在命令列處理期間完成,因此反映連線狀態的變數將在以後被覆蓋。
-V
--version
#列印 psql 版本並退出。
-w
--no-password
#從不發出密碼提示。如果伺服器需要密碼認證,並且無法從其他來源(例如 .pgpass
檔案)獲取密碼,則連線嘗試將失敗。此選項在沒有使用者輸入密碼的批處理作業和指令碼中可能很有用。
請注意,此選項將在整個會話期間保持設定,因此它會影響元命令 \connect
的使用以及初始連線嘗試。
-W
--password
#強制 psql 在連線到資料庫之前提示輸入密碼,即使密碼不會被使用。
如果伺服器需要密碼認證,並且無法從其他來源(例如 .pgpass
檔案)獲取密碼,則 psql 無論如何都會提示輸入密碼。但是,psql 將浪費一次連線嘗試來 выяснить 伺服器需要密碼。在某些情況下,輸入 -W
以避免額外的連線嘗試是值得的。
請注意,此選項將在整個會話期間保持設定,因此它會影響元命令 \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[=主題
]
#顯示關於 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 域套接字連線到本地主機上的伺服器,或者在 Windows 上透過 TCP/IP 連線到 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 (18.0)
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
(製表符)、\b
(退格符)、\r
(回車符)、\f
(換頁符)、\
數字
(八進位制) 和 \x
數字
(十六進位制)。在單引號文字中,反斜槓前面的任何其他字元都會引用該單個字元,無論它是什麼。
如果在引數中出現未加引號的冒號(:
)後跟 psql 變數名,它將被變數的值替換,如下面SQL 插值所述。那裡描述的 :'
和 變數名
':"
形式也有效。變數名
":{?
語法允許測試變數是否已定義。它被替換為 TRUE 或 FALSE。用反斜槓轉義冒號可以保護它不被替換。變數名
}
在一個引數中,括在反引號(`
)中的文字被視為一條命令列,該命令列將傳遞給 shell。命令的輸出(刪除任何尾隨換行符)將替換反引號中的文字。在反引號中包含的文字中,不會發生特殊的引用或其他處理,除了 :
(其中 變數名
變數名
是 psql 變數名)的出現將被變數的值替換。此外,:'
的出現將被變數的值替換,該值經過適當引用以成為單個 shell 命令引數。(後一種形式幾乎總是首選,除非您非常確定變數中的內容。)由於回車符和換行符不能在所有平臺上安全引用,因此當這些字元出現在值中時,變數名
':'
形式會列印錯誤訊息,並且不替換變數值。變數名
'
有些命令接受一個SQL識別符號(例如表名)作為引數。這些引數遵循SQL的語法規則:未加引號的字母強制轉換為小寫,而雙引號("
)保護字母免於大小寫轉換,並允許在識別符號中包含空格。在雙引號內,成對的雙引號在結果名稱中減少為單個雙引號。例如,FOO"BAR"BAZ
被解釋為 fooBARbaz
,而 "A weird"" name"
變為 A weird" name
。
引數解析在行尾停止,或者當發現另一個未加引號的反斜槓時停止。未加引號的反斜槓被視為新元命令的開始。特殊序列 \\
(兩個反斜槓)標記引數的結束並繼續解析SQL命令(如果有的話)。這樣SQL和 psql 命令可以自由地在一行中混合使用。但在任何情況下,元命令的引數都不能超出行的末尾。
許多元命令作用於當前查詢緩衝區。這只是一個緩衝區,用於儲存已輸入但尚未傳送到伺服器執行的 SQL 命令文字。它將包括之前的輸入行以及在同一行中出現在元命令之前的任何文字。
許多元命令還允許附加 x
作為選項。這將導致結果以擴充套件模式顯示,就像使用了 \x
或 \pset expanded
一樣。
定義了以下元命令
\a
#如果當前表輸出格式未對齊,則切換為對齊。如果未對齊,則將其設定為未對齊。此命令保留是為了向後相容。有關更通用的解決方案,請參閱 \pset
。
\bind
[ 引數
] ... #設定下一次查詢執行的查詢引數,並將指定的引數傳遞給任何引數佔位符($1
等)。
示例:
INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g
這適用於除 \g
之外的查詢執行命令,例如 \gx
和 \gset
。
此命令導致使用擴充套件查詢協議(參見 第 54.1.2 節),這與使用簡單查詢協議的正常 psql 操作不同。因此,此命令可用於從 psql 測試擴充套件查詢協議。(即使查詢沒有引數並且此命令指定零引數,也使用擴充套件查詢協議。)此命令僅影響下一個執行的查詢;所有後續查詢將預設使用簡單查詢協議。
\bind_named
statement_name
[ parameter
] ... #\bind_named
等同於 \bind
,但它將現有預備語句的名稱作為第一個引數。空字串表示未命名的預備語句。
示例:
INSERT INTO tbls1 VALUES ($1, $2) \parse stmt1 \bind_named stmt1 'first value' 'second value' \g
此命令導致使用擴充套件查詢協議(參見 第 54.1.2 節),這與使用簡單查詢協議的正常 psql 操作不同。因此,此命令可用於從 psql 測試擴充套件查詢協議。
\c
或 \connect [ -reuse-previous=on|off
] [ dbname
[ username
] [ host
] [ port
] | conninfo
]
#建立與 PostgreSQL 伺服器的新連線。要使用的連線引數可以透過位置語法(一個或多個數據庫名稱、使用者、主機和埠)或使用 第 32.1.1 節 中詳細描述的 conninfo
連線字串來指定。如果沒有給定引數,則使用與以前相同的引數建立新連線。
將 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
。不帶引數時,更改為當前使用者的主目錄。有關如何查詢主目錄的詳細資訊,請參見 第 32.16 節。
要列印當前工作目錄,請使用 \! pwd
。
\close_prepared
prepared_statement_name
#關閉指定的預備語句。空字串表示未命名的預備語句。如果不存在具有此名稱的預備語句,則操作為空操作。
示例:
SELECT $1 \parse stmt1 \close_prepared stmt1
此命令導致使用擴充套件查詢協議,這與使用簡單查詢協議的正常 psql 操作不同。因此,此命令可用於從 psql 測試擴充套件查詢協議。
\conninfo
#輸出有關當前資料庫連線的資訊,如果使用 SSL,則包括與 SSL 相關的資訊。
請注意,Client User
欄位顯示連線時的使用者,而 Superuser
欄位指示當前使用者(在當前執行上下文中)是否具有超級使用者許可權。這些使用者通常相同,但它們可能不同,例如,如果當前使用者已透過 SET ROLE
命令更改。
\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
時,psql 執行 command
,資料在伺服器和客戶端之間路由,從 command
傳遞或傳遞給 command
。同樣,執行許可權是本地使用者的,而不是伺服器的,並且不需要 SQL 超級使用者許可權。
對於 \copy ... from stdin
,資料行從發出命令的同一源讀取,直到讀取到只包含 \.
的行或流到達檔案結束。此選項對於在 SQL 指令碼檔案中內聯填充表很有用。對於 \copy ... to stdout
,輸出傳送到與 psql 命令輸出相同的位置,並且不列印 COPY
命令狀態(因為它可能與資料行混淆)。要讀取/寫入 psql 的標準輸入或輸出,無論當前的命令源或 count
\o
選項如何,請寫入 from pstdin
或 to pstdout
。
此命令的語法與SQL COPY
命令的語法相似。除了資料來源/目標之外的所有選項都按照 COPY
的規定。因此,特殊的解析規則適用於 \copy
元命令。與大多數其他元命令不同,行的其餘部分始終被視為 \copy
的引數,並且引數中不執行變數插值和反引號擴充套件。
獲取與 \copy ... to
相同結果的另一種方法是使用SQL COPY ... TO STDOUT
命令並用 \g
或 filename
\g |
終止它。與 program
\copy
不同,此方法允許命令跨多行;此外,可以使用變數插值和反引號擴充套件。
這些操作不如使用檔案或程式資料來源或目標時的SQL COPY
命令高效,因為所有資料都必須透過客戶端/伺服器連線。對於大量資料,該SQL命令可能更受歡迎。
\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[Sx+] [ pattern
]
#對於與 pattern
匹配的每個關係(表、檢視、物化檢視、索引、序列或外部表)或複合型別,顯示所有列、它們的型別、表空間(如果不是預設值)以及任何特殊屬性,例如 NOT NULL
或預設值。還顯示相關的索引、約束、規則和觸發器。對於外部表,還顯示相關的外部伺服器。(“匹配模式”的定義見下面的 模式。)
對於某些型別的關係,\d
為每列顯示額外資訊:序列的列值、索引的索引表示式以及外部表的外部資料封裝器選項。
命令形式 \d+
相同,但顯示更多資訊:顯示與表列關聯的任何註釋,以及表中 OID 的存在,如果關係是檢視,則顯示檢視定義,非預設的 複製身份 設定以及如果關係具有訪問方法,則顯示 訪問方法 名稱。
預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。
如果 \d
不帶 pattern
引數使用,則等效於 \dtvmsE
,它將顯示所有可見表、檢視、物化檢視、序列和外部表的列表。這純粹是為了方便。
與許多其他命令一樣,如果在命令名稱後附加 x
,則結果以擴充套件模式顯示,但請注意,這僅適用於 \d
不帶 pattern
引數使用時,並且 x
修飾符不能緊跟在 \d
之後(因為 \dx
是一個不同的命令);x
修飾符只能出現在 S
或 +
修飾符之後。例如,\d+x
等效於 \dtvmsE+x
,並將以擴充套件模式顯示所有關係的列表。
\da[Sx] [ pattern
]
#列出聚合函式,以及它們的返回型別和它們操作的資料型別。如果指定了 pattern
,則只顯示名稱匹配模式的聚合。預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。
\dA[x+] [ pattern
]
#列出訪問方法。如果指定了 pattern
,則只顯示名稱匹配模式的訪問方法。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個訪問方法都與其關聯的處理函式和描述一起列出。
\dAc[x+] [access-method-pattern
[input-type-pattern
]]
#列出運算子類(參見 第 36.16.1 節)。如果指定了 access-method-pattern
,則只列出與名稱匹配該模式的訪問方法關聯的運算子類。如果指定了 input-type-pattern
,則只列出與名稱匹配該模式的輸入型別關聯的運算子類。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個運算子類都與其關聯的運算子族和所有者一起列出。
\dAf[x+] [access-method-pattern
[input-type-pattern
]]
#列出運算子族(參見 第 36.16.5 節)。如果指定了 access-method-pattern
,則只列出與名稱匹配該模式的訪問方法相關聯的運算子族。如果指定了 input-type-pattern
,則只列出與名稱匹配該模式的輸入型別相關聯的運算子族。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個運算子族都與其所有者一起列出。
\dAo[x+] [access-method-pattern
[operator-family-pattern
]]
#列出與運算子族關聯的運算子(參見 第 36.16.2 節)。如果指定了 access-method-pattern
,則只列出與名稱匹配該模式的訪問方法相關聯的運算子族的成員。如果指定了 operator-family-pattern
,則只列出與名稱匹配該模式的運算子族的成員。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個運算子都與其排序運算子族(如果它是排序運算子)一起列出,以及其底層函式是否防洩漏。
\dAp[x+] [access-method-pattern
[operator-family-pattern
]]
#列出與運算子族關聯的支援函式(參見 第 36.16.3 節)。如果指定了 access-method-pattern
,則只列出與名稱匹配該模式的訪問方法關聯的運算子族中的函式。如果指定了 operator-family-pattern
,則只列出與名稱匹配該模式的運算子族中的函式。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則函式將以詳細模式顯示,並帶有其實際引數列表。
\db[x+] [ pattern
]
#列出表空間。如果指定了 pattern
,則只顯示名稱匹配模式的表空間。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個表空間都與其關聯的選項、磁碟大小、許可權和描述一起列出。
\dc[Sx+] [ pattern
]
#列出字元集編碼之間的轉換。如果指定了 pattern
,則只列出名稱匹配該模式的轉換。預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個物件都與其關聯的描述一起列出。
\dconfig[x+] [ pattern
]
#列出伺服器配置引數及其值。如果指定了 pattern
,則只列出名稱匹配該模式的引數。如果沒有 pattern
,則只列出設定為非預設值的引數。(使用 \dconfig *
檢視所有引數。)如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個引數都與其資料型別、可以設定引數的上下文以及訪問許可權(如果已授予非預設訪問許可權)一起列出。
\dC[x+] [ pattern
]
#列出型別轉換。如果指定了 pattern
,則只列出源型別或目標型別匹配該模式的轉換。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則顯示每個轉換的附加資訊,包括其底層函式是否防洩漏以及轉換的描述。
\dd[Sx] [ pattern
]
#顯示型別為 constraint
、operator class
、operator family
、rule
和 trigger
的物件的描述。所有其他註釋可以透過這些物件型別各自的反斜槓命令檢視。
\dd
顯示與 pattern
匹配的物件的描述,如果未給出引數,則顯示適當型別的可見物件的描述。但在這兩種情況下,只列出具有描述的物件。預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。
可以使用 COMMENT
命令建立物件的描述。SQL命令。
\dD[Sx+] [ pattern
]
#列出域。如果指定了 pattern
,則只顯示名稱匹配模式的域。預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個物件都與其關聯的許可權和描述一起列出。
\ddp[x] [ pattern
]
#列出預設訪問許可權設定。對於每個預設許可權設定已從內建預設值更改的角色(以及適用的模式),都會顯示一個條目。如果指定了 pattern
,則只列出其角色名或模式名匹配該模式的條目。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。
ALTER DEFAULT PRIVILEGES
命令用於設定預設訪問許可權。許可權顯示的含義在 第 5.8 節 中解釋。
\dE[Sx+] [ pattern
]
\di[Sx+] [ pattern
]
\dm[Sx+] [ pattern
]
\ds[Sx+] [ pattern
]
\dt[Sx+] [ pattern
]
\dv[Sx+] [ pattern
]
#在此組命令中,字母 E
、i
、m
、s
、t
和 v
分別代表外部表、索引、物化檢視、序列、表和檢視。您可以指定其中任何或所有字母,按任意順序,以獲取這些型別的物件的列表。例如,\dti
列出表和索引。如果在命令名稱後附加 x
,則結果以擴充套件模式顯示。如果在命令名稱後附加 +
,則每個物件都與其持久狀態(永久、臨時或未記錄)、磁碟上的物理大小以及任何關聯的描述一起列出。如果指定了 pattern
,則只列出名稱匹配該模式的物件。預設情況下,只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。
\des[x+] [ pattern
]
#列出外部伺服器(助記:“外部伺服器”)。如果指定了pattern
,則只列出名稱與該模式匹配的伺服器。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個伺服器的完整描述,包括伺服器的訪問許可權、型別、版本、選項和描述。
\det[x+] [ pattern
]
#列出外部表(助記:“外部表”)。如果指定了pattern
,則只列出表名或模式名與該模式匹配的條目。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則還顯示通用選項和外部表描述。
\deu[x+] [ pattern
]
#列出使用者對映(助記:“外部使用者”)。如果指定了pattern
,則只列出使用者名稱與該模式匹配的對映。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個對映的附加資訊。
\deu+
可能還會顯示遠端使用者的使用者名稱和密碼,因此應注意不要洩露它們。
\dew[x+] [ pattern
]
#列出外部資料包裝器(助記:“外部包裝器”)。如果指定了pattern
,則只列出名稱與該模式匹配的外部資料包裝器。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則還顯示外部資料包裝器的訪問許可權、選項和描述。
\df[anptwSx+] [ pattern
[ arg_pattern
... ] ]
#列出函式,以及它們的返回資料型別、引數資料型別和函式型別,函式型別分類為“agg”(聚合)、“normal”(普通)、“procedure”(過程)、“trigger”(觸發器)或“window”(視窗)。要只顯示特定型別的函式,請向命令新增相應的字母a
、n
、p
、t
或w
。如果指定了pattern
,則只顯示名稱與該模式匹配的函式。任何附加引數都是型別名稱模式,它們將與函式的第一個、第二個等引數的型別名稱匹配。(匹配的函式可以擁有比您指定的更多引數。為了防止這種情況,請將破折號-
作為最後一個arg_pattern
寫入。)預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個函式的附加資訊,包括易變性、並行安全性、所有者、安全分類、是否防洩漏、訪問許可權、語言、內部名稱(僅適用於C和內部函式)以及描述。可以使用\sf
檢視特定函式的原始碼。
\dF[x+] [ pattern
]
#列出文字搜尋配置。如果指定了pattern
,則只顯示名稱與該模式匹配的配置。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個配置的完整描述,包括底層文字搜尋解析器和每個解析器令牌型別的字典列表。
\dFd[x+] [ pattern
]
#列出文字搜尋字典。如果指定了pattern
,則只顯示名稱與該模式匹配的字典。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個選定字典的附加資訊,包括底層文字搜尋模板和選項值。
\dFp[x+] [ pattern
]
#列出文字搜尋解析器。如果指定了pattern
,則只顯示名稱與該模式匹配的解析器。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個解析器的完整描述,包括底層函式和識別的令牌型別列表。
\dFt[x+] [ pattern
]
#列出文字搜尋模板。如果指定了pattern
,則只顯示名稱與該模式匹配的模板。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個模板的附加資訊,包括底層函式名稱。
\dg[Sx+] [ pattern
]
#列出資料庫角色。(由於“使用者”和“組”的概念已統一為“角色”,因此此命令現在等效於\du
。)預設情況下,只顯示使用者建立的角色;提供S
修飾符以包含系統角色。如果指定了pattern
,則只列出名稱與該模式匹配的角色。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個角色的附加資訊;目前,這會新增每個角色的註釋。
\dl[x+]
#這是\lo_list
的別名,顯示大型物件列表。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個大型物件都將列出其關聯的許可權(如果有)。
\dL[Sx+] [ pattern
]
#列出過程語言。如果指定了pattern
,則只列出名稱與該模式匹配的語言。預設情況下,只顯示使用者建立的語言;提供S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個語言都將列出其呼叫處理程式、驗證器、訪問許可權以及它是否為系統物件。
\dn[Sx+] [ pattern
]
#列出模式(名稱空間)。如果指定了pattern
,則只列出名稱與該模式匹配的模式。預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個物件都將列出其關聯的許可權和描述(如果有)。
\do[Sx+] [ pattern
[ arg_pattern
[ arg_pattern
] ] ]
#列出運算子及其運算元和結果型別。如果指定了pattern
,則只列出名稱與該模式匹配的運算子。如果指定了一個arg_pattern
,則只列出右引數型別名稱與該模式匹配的字首運算子。如果指定了兩個arg_pattern
,則只列出引數型別名稱與這些模式匹配的二元運算子。(或者,對於一元運算子的未使用引數,寫入-
。)預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個運算子的附加資訊,包括底層函式的名稱以及它是否防洩漏。
\dO[Sx+] [ pattern
]
#列出排序規則。如果指定了pattern
,則只列出名稱與該模式匹配的排序規則。預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個排序規則都將列出其關聯的描述(如果有)。請注意,只顯示當前資料庫編碼可用的排序規則,因此在同一安裝的不同資料庫中,結果可能會有所不同。
\dp[Sx] [ pattern
]
#列出表、檢視和序列及其關聯的訪問許可權。如果指定了pattern
,則只列出名稱與該模式匹配的表、檢視和序列。預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。
\dP[itnx+] [ pattern
]
#列出分割槽關係。如果指定了pattern
,則只列出名稱與該模式匹配的條目。修飾符t
(表)和i
(索引)可以附加到命令後,以過濾要列出的關係型別。預設情況下,列出分割槽表和索引。
如果使用修飾符n
(“巢狀”),或指定了模式,則包含非根分割槽關係,並顯示一列以顯示每個分割槽關係的父級。
如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則還顯示每個關係分割槽的大小總和,以及關係的描述。如果n
與+
結合使用,則顯示兩個大小:一個包括直接附加的葉分割槽的總大小,另一個顯示所有分割槽的總大小,包括間接附加的子分割槽。
\drds[x] [ role-pattern
[ database-pattern
] ]
#列出已定義的配置設定。這些設定可以是角色特定的、資料庫特定的,或兩者兼有。role-pattern
和database-pattern
分別用於選擇要列出的特定角色和資料庫。如果省略,或指定*
,則列出所有設定,包括那些不是角色特定的或資料庫特定的設定。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。
ALTER ROLE
和ALTER DATABASE
命令用於定義每個角色和每個資料庫的配置設定。
\drg[Sx] [ pattern
]
#列出有關每個已授予角色成員資格的資訊,包括分配的選項(ADMIN
、INHERIT
和/或SET
)和授權者。有關角色成員資格的資訊,請參閱GRANT
命令。
預設情況下,只顯示授予使用者建立的角色的許可權;提供S
修飾符以包含系統角色。如果指定了pattern
,則只列出授予名稱與該模式匹配的角色的許可權。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。
\dRp[x+] [ pattern
]
#列出複製釋出。如果指定了pattern
,則只列出名稱與該模式匹配的釋出。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則還顯示與每個釋出關聯的表和模式。
\dRs[x+] [ pattern
]
#列出複製訂閱。如果指定了pattern
,則只列出名稱與該模式匹配的訂閱。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示訂閱的附加屬性。
\dT[Sx+] [ pattern
]
#列出資料型別。如果指定了pattern
,則只列出名稱與該模式匹配的型別。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個型別都將列出其內部名稱和大小,如果它是enum
型別,則列出其允許值,以及其關聯的許可權。預設情況下,只顯示使用者建立的物件;提供模式或S
修飾符以包含系統物件。
\du[Sx+] [ pattern
]
#列出資料庫角色。(由於“使用者”和“組”的概念已統一為“角色”,因此此命令現在等效於\dg
。)預設情況下,只顯示使用者建立的角色;提供S
修飾符以包含系統角色。如果指定了pattern
,則只列出名稱與該模式匹配的角色。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則顯示每個角色的附加資訊;目前,這會新增每個角色的註釋。
\dx[x+] [ pattern
]
#列出已安裝的擴充套件。如果指定了pattern
,則只列出名稱與該模式匹配的擴充套件。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則列出屬於每個匹配擴充套件的所有物件。
\dX[x] [ pattern
]
#列出擴充套件統計資訊。如果指定了pattern
,則只列出名稱與該模式匹配的擴充套件統計資訊。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。
每種擴充套件統計資訊的狀態顯示在其統計資訊型別命名的列中(例如 Ndistinct)。defined
表示在建立統計資訊時已請求,NULL表示未請求。如果您想知道是否已執行ANALYZE
以及統計資訊是否可用於規劃器,可以使用pg_stats_ext
。
\dy[x+] [ pattern
]
#列出事件觸發器。如果指定了pattern
,則只列出名稱與該模式匹配的事件觸發器。如果命令名稱後附加了x
,則結果以擴充套件模式顯示。如果命令名稱後附加了+
,則每個物件都將列出其關聯的描述。
\e
或 \edit
[ filename
] [ line_number
]
#如果指定了filename
,則編輯該檔案;編輯器退出後,檔案內容將複製到當前查詢緩衝區中。如果沒有給出filename
,則當前查詢緩衝區將複製到一個臨時檔案,然後以相同方式編輯。或者,如果當前查詢緩衝區為空,則最近執行的查詢將複製到一個臨時檔案並以相同方式編輯。
如果您編輯檔案或以前的查詢,並且在不修改檔案的情況下退出編輯器,則查詢緩衝區將被清除。否則,查詢緩衝區的新內容將根據psql的正常規則重新解析,將整個緩衝區視為單行。任何完整的查詢都會立即執行;也就是說,如果查詢緩衝區包含或以分號結尾,則到該點為止的所有內容都將執行並從查詢緩衝區中移除。查詢緩衝區中剩餘的任何內容都將重新顯示。鍵入分號或\g
傳送它,或\r
透過清除查詢緩衝區來取消它。
將緩衝區視為單行主要影響元命令:元命令後緩衝區中的任何內容都將被視為元命令的引數,即使它跨多行。(因此,您不能以這種方式建立使用元命令的指令碼。為此請使用\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將把游標定位在函式體的指定行上。(請注意,函式體通常不是從檔案的第一行開始。)
與大多數其他元命令不同,行的其餘部分始終被視為\ef
的引數,並且在引數中不執行變數插值或反引號擴充套件。
有關如何配置和自定義編輯器的資訊,請參閱下面的環境。
\encoding [ encoding
]
#設定客戶端字元集編碼。如果沒有引數,此命令會顯示當前編碼。
\errverbose
#以最大詳細程度重複最近的伺服器錯誤訊息,就像VERBOSITY
設定為verbose
且SHOW_CONTEXT
設定為always
一樣。
\ev [ view_name
[ line_number
] ]
#此命令以CREATE OR REPLACE VIEW
命令的形式獲取並編輯命名檢視的定義。編輯方式與\edit
相同。如果您在不儲存的情況下退出編輯器,則該語句將被丟棄。如果您儲存並退出編輯器,如果您為其添加了分號,則更新的命令會立即執行。否則它會重新顯示;鍵入分號或\g
傳送它,或\r
取消。
如果未指定檢視,則會顯示一個空白的CREATE VIEW
模板供編輯。
如果指定了行號,psql將把游標定位在檢視定義的指定行上。
與大多數其他元命令不同,行的其餘部分始終被視為\ev
的引數,並且在引數中不執行變數插值或反引號擴充套件。
\f [ string
]
#設定未對齊查詢輸出的欄位分隔符。預設值為豎線(|
)。它等效於\pset fieldsep
。
\g [ (option
=value
[...]) ] [ filename
]
\g [ (option
=value
[...]) ] [ |command
]
#將當前查詢緩衝區傳送到伺服器執行。
如果在\g
之後出現括號,它們會圍繞一個以空格分隔的option
=
value
格式化選項子句列表,這些子句的解釋方式與\pset
option
value
命令相同,但僅在此查詢期間生效。在此列表中,等號=
周圍不允許有空格,但選項子句之間必須有空格。如果省略=
value
,則命名option
的更改方式與\pset
option
沒有明確value
時相同。
如果給出了filename
或|
command
引數,則查詢的輸出將寫入指定檔案或透過管道傳輸到給定shell命令,而不是像往常一樣顯示。只有當查詢成功返回零個或多個元組時才寫入檔案或命令,如果查詢失敗或是非資料返回的SQL命令則不寫入。
如果當前查詢緩衝區為空,則重新執行最近傳送的查詢。除了此行為外,不帶任何引數的\g
本質上等同於一個分號。帶引數的\g
提供了\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 元命令,也不能包含 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
,不同之處在於它強制對該查詢使用擴充套件輸出模式,就像 expanded=on
包含在 \pset
選項列表中一樣。另請參見 \x
。
\h
或 \help
[ command
]
#提供有關指定SQL命令的語法幫助。如果未指定 command
,則 psql 將列出所有可用的語法幫助命令。如果 command
是星號 (*
),則顯示所有SQL命令的語法幫助。
與大多數其他元命令不同,行的其餘部分始終被視為 \help
的引數,並且在引數中不執行變數插值或反引號擴充套件。
為了簡化輸入,由多個單片語成的命令無需加引號。因此,輸入 \help alter table
是可以的。
\H
或 \html
#開啟HTML查詢輸出格式。如果HTML格式已開啟,則會切換回預設的對齊文字格式。此命令用於相容性和便利性,但有關設定其他輸出選項的資訊,請參見 \pset
。
\i
或 \include
filename
#從檔案 filename
讀取輸入並執行它,就像它是在鍵盤上輸入的一樣。
如果 filename
是 -
(連字元),則會讀取標準輸入,直到遇到 EOF 指示或 \q
元命令。這可用於將互動式輸入與檔案輸入交錯。請注意,只有當 Readline 在最外層處於活動狀態時,才會使用 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
引數像任何其他反斜槓命令引數一樣,受變數插值和反引號擴充套件的影響。之後,它像開/關選項變數的值一樣進行評估。因此,有效值是以下任意一個的明確不區分大小寫匹配:true
、false
、1
、0
、on
、off
、yes
、no
。例如,t
、T
和 tR
都將被視為 true
。
不能正確評估為 true 或 false 的表示式將生成警告並被視為 false。
被跳過的行會正常解析以識別查詢和反斜槓命令,但查詢不會發送到伺服器,並且條件(\if
、\elif
、\else
、\endif
)以外的反斜槓命令將被忽略。條件命令僅檢查有效巢狀。跳過的行中的變數引用不會擴充套件,也不會執行反引號擴充套件。
給定條件塊的所有反斜槓命令必須出現在同一原始檔中。如果在所有本地 \if
塊關閉之前,主輸入檔案或 \include
-ed 檔案達到 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[x+]
或 \list[x+] [ pattern
]
#列出伺服器中的資料庫,並顯示它們的名稱、所有者、字元集編碼和訪問許可權。如果指定了 pattern
,則只列出名稱與模式匹配的資料庫。如果命令名稱後附加 x
,則結果以擴充套件模式顯示。如果命令名稱後附加 +
,則還會顯示資料庫大小、預設表空間和描述。(大小資訊僅適用於當前使用者可以連線的資料庫。)
\lo_export loid
filename
#從資料庫中讀取具有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,該 ID 可用於將來訪問新建立的大物件。為了可讀性,建議始終為每個物件關聯一個人類可讀的註釋。OID 和註釋都可以透過 \lo_list
命令檢視。
請注意,此命令與伺服器端 lo_import
有細微差別,因為它在本地檔案系統上作為本地使用者操作,而不是伺服器的使用者和檔案系統。
\lo_list[x+]
#顯示當前儲存在資料庫中的所有 PostgreSQL 大物件的列表,以及為它們提供的任何註釋。如果命令名稱後附加 x
,則結果以擴充套件模式顯示。如果命令名稱後附加 +
,則每個大物件都會列出其相關的許可權(如果有)。
\lo_unlink loid
#從資料庫中刪除具有OID loid
的大物件。
使用 \lo_list
查詢大物件的OID.
\o
或 \out [ filename
]
\o
或 \out [ |command
]
#安排將未來的查詢結果儲存到檔案 filename
或將未來的結果透過管道傳輸到 shell 命令 command
。如果未指定引數,則查詢輸出將重置為標準輸出。
如果引數以 |
開頭,則行的其餘部分將被視為要執行的 command
,並且其中不執行變數插值或反引號擴充套件。行的其餘部分只是按字面意思傳遞給 shell。
“查詢結果” 包括從資料庫伺服器獲得的所有表、命令響應和通知,以及查詢資料庫的各種反斜槓命令的輸出(例如 \d
);但不包括錯誤訊息。
要在查詢結果之間穿插文字輸出,請使用 \qecho
。
\p
或 \print
#將當前查詢緩衝區列印到標準輸出。如果當前查詢緩衝區為空,則會轉而列印最近執行的查詢。
\parse statement_name
#根據目標預處理語句物件的名稱,從當前查詢緩衝區建立預處理語句。空字串表示未命名預處理語句。
示例:
SELECT $1 \parse stmt1
此命令導致使用擴充套件查詢協議,與通常使用簡單查詢協議的 psql 操作不同。此命令將發出 解析 (F) 訊息,因此測試 psql 中的擴充套件查詢協議可能很有用。此命令僅影響下一個執行的查詢;預設情況下,所有後續查詢都將使用簡單查詢協議。
\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
#指定要在CSV輸出格式中使用的欄位分隔符。如果分隔符字元出現在欄位的值中,則該欄位將按照標準CSV規則在雙引號內輸出。預設值為逗號。
expanded
(或 x
) #如果指定了 value
,它必須是 on
或 off
,這將啟用或停用擴充套件模式,或 auto
。如果省略 value
,則命令在開和關設定之間切換。當啟用擴充套件模式時,查詢結果以兩列顯示,左側是列名,右側是資料。如果資料在正常的“水平”模式下無法在螢幕上顯示,此模式很有用。在自動設定中,當查詢輸出有多於一列且寬度超過螢幕時,將使用擴充套件模式;否則,將使用常規模式。自動設定僅在對齊和換行格式中有效。在其他格式中,它始終表現為擴充套件模式關閉。
fieldsep
#指定要在非對齊輸出格式中使用的欄位分隔符。這樣就可以建立例如製表符分隔的輸出,其他程式可能會更喜歡這種格式。要將製表符設定為欄位分隔符,請鍵入 \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
格式將一行的所有列寫入一行,由當前活動的欄位分隔符分隔。這對於建立可能旨在由其他程式讀取的輸出(例如,製表符分隔或逗號分隔格式)很有用。但是,如果欄位分隔符字元出現在列的值中,則不會對其進行特殊處理;因此CSV格式可能更適合此類目的。
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
#設定用於列印空值的字串。預設情況下不列印任何內容,這很容易與空字串混淆。例如,人們可能更喜歡 \pset null '(null)'
。
numericlocale
#如果指定了 value
,它必須是 on
或 off
,這將啟用或停用顯示特定於語言環境的字元以分隔小數點左側的數字組。如果省略 value
,則命令在常規和特定於語言環境的數字輸出之間切換。
pager
#控制查詢和 psql 幫助輸出的分頁程式的使用。當 pager
選項為 off
時,不使用分頁程式。當 pager
選項為 on
時,分頁程式在適當時使用,即當輸出到終端且無法在螢幕上顯示時。 pager
選項也可以設定為 always
,這將導致分頁程式用於所有終端輸出,無論它是否適合螢幕。\pset pager
沒有 value
會切換分頁程式的使用狀態。
如果設定了環境變數 PSQL_PAGER
或 PAGER
,則要分頁的輸出將透過管道傳輸到指定的程式。否則,使用平臺相關的預設程式(例如 more
)。
在 Unix 系統上,當使用 \watch
命令重複執行查詢時,環境變數 PSQL_WATCH_PAGER
用於查詢分頁程式。這是單獨配置的,因為它可能會使傳統的分頁程式感到困惑,但可以用於將輸出傳送到理解 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
或一個整數值
。
full
:擴充套件報頭不被截斷,並且與最寬的輸出行一樣寬。
column
:將報頭行截斷為第一列的寬度。
page
:將報頭行截斷為終端寬度。
整數值
:指定報頭行的確切最大寬度。
這些不同格式的外觀示例可以在下面的示例中看到。
\pset
有各種快捷命令。請參閱 \a
、\C
、\f
、\H
、\t
、\T
和 \x
。
\q
或 \quit
#退出 psql 程式。在指令碼檔案中,只終止該指令碼的執行。
\qecho text
[ ... ]
#此命令與 \echo
相同,不同之處在於輸出將寫入到由 \o
設定的查詢輸出通道。
\r
或 \reset
#重置(清除)查詢緩衝區。
\restrict restrict_key
#使用提供的鍵進入“受限”模式。在此模式下,唯一允許的元命令是 \unrestrict
,用於退出受限模式。該鍵只能包含字母數字字元。
此命令主要用於 pg_dump、pg_dumpall 和 pg_restore 生成的純文字轉儲中,但也可能在其他地方有用。
\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 行。
與大多數其他元命令不同,行的其餘部分始終被視為 \sf
的引數,並且在引數中不執行變數插值或反引號擴充套件。
\sv[+] view_name
#此命令以 CREATE OR REPLACE VIEW
命令的形式獲取並顯示命名檢視的定義。該定義將列印到由 \o
設定的當前查詢輸出通道。
如果命令名稱後附加 +
,則輸出行將從 1 開始編號。
與大多數其他元命令不同,行的其餘部分始終被視為 \sv
的引數,並且在引數中不執行變數插值或反引號擴充套件。
\startpipeline
\sendpipeline
\syncpipeline
\endpipeline
\flushrequest
\flush
\getresults [ number_results
]
#這組命令實現了 SQL 語句的管道傳輸。管道必須以 \startpipeline
開始並以 \endpipeline
結束。在這之間可以有任意數量的 \syncpipeline
命令,它傳送一個同步訊息,而不會結束正在進行的管道並刷新發送緩衝區。在管道模式下,語句被髮送到伺服器,而不等待先前語句的結果。有關更多詳細資訊,請參閱第 32.5 節。
在管道進行期間執行的所有查詢都使用擴充套件查詢協議。當以分號結束時,查詢將被附加到管道中。元命令 \bind
、\bind_named
、\close_prepared
或 \parse
可以在正在進行的管道中使用。當管道正在進行時,\sendpipeline
會將當前查詢緩衝區附加到管道中。其他元命令,如 \g
、\gx
或 \gdesc
,在管道模式下不允許使用。
\flushrequest
將一個 flush 命令附加到管道中,允許使用 \getresults
讀取結果,而無需發出同步或結束管道。\getresults
將自動將未傳送的資料推送到伺服器。\flush
可用於手動推送未傳送的資料。
\getresults
接受可選的 number_results
引數。如果提供,則只讀取前 number_results
個掛起結果。如果未提供或為 0
,則讀取所有掛起結果。
當管道模式處於活動狀態時,可以使用專用提示變數報告管道狀態。有關更多詳細資訊,請參閱%P
。
在管道模式下不支援 COPY
。
示例:
\startpipeline SELECT * FROM pg_class; SELECT 1 \bind \sendpipeline \flushrequest \getresults \endpipeline
\t
#切換輸出列名標題和行計數頁尾的顯示。此命令等效於 \pset tuples_only
,是為了方便而提供的。
\T table_options
#指定要放置在輸出格式的 table
標籤中的屬性。HTML此命令等效於 \pset tableattr
。table_options
\timing [ on
| off
]
#帶引數時,開啟或關閉顯示每個 SQL 語句所需的時間。不帶引數時,在開和關之間切換顯示。顯示以毫秒為單位;超過 1 秒的間隔也以分鐘:秒格式顯示,如果需要,還會新增小時和天欄位。
\unrestrict restrict_key
#退出“受限”模式(即,所有其他元命令都被阻止),前提是指定的鍵與進入受限模式時提供給 \restrict
的鍵匹配。
此命令主要用於 pg_dump、pg_dumpall 和 pg_restore 生成的純文字轉儲中,但也可能在其他地方有用。
\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)。可以使用變數 WATCH_INTERVAL
更改預設等待時間。為了向後相容,seconds
可以帶或不帶 interval=
字首指定。每個查詢結果都顯示一個包含 \pset title
字串(如果有)、查詢開始時間以及延遲間隔的標題。
如果當前查詢緩衝區為空,則會重新執行最近傳送的查詢。
\x [ on
| off
| auto
]
#設定或切換擴充套件表格式模式。因此,它等效於 \pset expanded
。
\z[Sx] [ pattern
]
#列出表、檢視和序列及其相關的訪問許可權。如果指定了 pattern
,則只列出名稱與模式匹配的表、檢視和序列。預設情況下只顯示使用者建立的物件;提供模式或 S
修飾符以包含系統物件。如果命令名稱後附加 x
,則結果以擴充套件模式顯示。
這是 \dp
(“顯示許可權”)的別名。
\! [ command
]
#不帶引數時,轉義到子 shell;當子 shell 退出時,psql 恢復。帶引數時,執行 shell 命令 command
。
與大多數其他元命令不同,行的其餘部分始終被視為 \!
的引數,並且在引數中不執行變數插值或反引號擴充套件。行的其餘部分只是字面量傳遞給 shell。
\? [ topic
]
#顯示幫助資訊。可選的 topic
引數(預設為 commands
)選擇要解釋的 psql 部分:commands
描述 psql 的反斜槓命令;options
描述可以傳遞給 psql 的命令列選項;variables
顯示關於 psql 配置變數的幫助。
\;
#反斜槓分號不像前面的命令那樣是元命令;相反,它只是導致一個分號被新增到查詢緩衝區,而無需進一步處理。
通常,psql 會在到達命令結束分號後立即將 SQL 命令分派到伺服器,即使當前行上還有更多輸入。因此,例如輸入
select 1; select 2; select 3;
將導致三個 SQL 命令單獨傳送到伺服器,每個命令的結果在繼續到下一個命令之前顯示。但是,作為 \;
輸入的分號不會觸發命令處理,因此它前面的命令和它後面的命令有效地組合在一起,以一個請求傳送到伺服器。例如
select 1\; select 2\; select 3;
導致在到達非反斜槓分號時,將三個 SQL 命令在一個請求中傳送到伺服器。伺服器將此類請求作為單個事務執行,除非字串中包含顯式的 BEGIN
/COMMIT
命令將其分成多個事務。(有關伺服器如何處理多查詢字串的更多詳細資訊,請參閱第 54.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
或其他事務控制命令,也不是不能在事務塊中執行的命令(例如 VACUUM
)的命令之前,隱式為您發出 BEGIN
。
在自動提交關閉模式下,您必須透過輸入 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 或更小,向 psql 的互動式會話傳送一個檔案結束字元(通常是 Control+D)將終止應用程式。如果設定為更大的數字值,則必須連續鍵入這麼多檔案結束字元才能終止互動式會話。如果變數設定為非數字值,則將其解釋為 10。預設值為 0。
此功能是從 Bash 毫不羞恥地剽竊而來的。
LASTOID
#最後一個受影響的 OID 值,由 INSERT
或 \lo_import
命令返回。此變數僅保證在下一個SQL命令結果顯示之後才有效。PostgreSQL 12 及更高版本伺服器不再支援 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 命令,處理將在當前命令處停止。
PIPELINE_COMMAND_COUNT
#正在進行的管道中排隊的命令數量。
PIPELINE_RESULT_COUNT
#正在進行的管道中,後面跟著 \flushrequest
或 \syncpipeline
的命令數量,強制伺服器傳送結果。這些結果可以透過 \getresults
檢索。
PIPELINE_SYNC_COUNT
#正在進行的管道中排隊的同步訊息數量。
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
。每次連線到資料庫(包括程式啟動)時都會設定這些值,但可以更改或取消設定。
SERVICE
#服務名稱,如果適用。
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
元命令以及反引號 (`
) 擴充套件呼叫的 shell 命令。請注意,對於 \o
,此變數在下一個 \o
命令關閉輸出管道時更新。另請參見 SHELL_ERROR
。
SHOW_ALL_RESULTS
#當此變數設定為 off
時,只顯示組合查詢 (\;
) 的最後一個結果,而不是所有結果。預設值為 on
。 off 行為是為了與舊版本的 psql 相容。
SHOW_CONTEXT
#此變數可以設定為 never
、errors
或 always
,以控制伺服器訊息中是否顯示 CONTEXT
欄位。預設值為 errors
(意味著上下文將顯示在錯誤訊息中,但不會顯示在通知或警告訊息中)。當 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
)。它們可以更改或取消設定。
WATCH_INTERVAL
#此變數設定 \watch
執行查詢之間等待的預設間隔(以秒為單位)。預設值為 2 秒。在命令中指定間隔會覆蓋此變數。
psql 變數的一個關鍵特性是您可以將它們替換(“插值”)到常規SQL語句中,以及元命令的引數中。此外,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
包含空位元組,這仍然無效。psql 不支援變數值中嵌入空位元組。)
由於冒號可以在 SQL 命令中合法出現,因此除非已設定命名變數,否則不會替換明顯的插值嘗試(即 :name
、:'name'
或 :"name"
)。在任何情況下,您都可以用反斜槓轉義冒號,以防止其被替換。
特殊語法 :{?
根據變數是否存在返回 TRUE 或 FALSE,因此總是被替換,除非冒號被反斜槓轉義。name
}
變數的冒號語法是SQL嵌入式查詢語言的標準語法,例如 ECPG。陣列切片和型別轉換的冒號語法是 PostgreSQL 擴充套件,有時可能與標準用法衝突。將變數值轉義為 SQL 文字或識別符號的冒號-引號語法是 psql 擴充套件。
psql 發出的提示符可以根據您的偏好進行自定義。三個變數 PROMPT1
、PROMPT2
和 PROMPT3
包含描述提示符外觀的字串和特殊轉義序列。提示符 1 是 psql 請求新命令時發出的正常提示符。提示符 2 在命令輸入期間預期有更多輸入時發出,例如因為命令未以分號終止或引號未閉合。提示符 3 在您執行SQL COPY FROM STDIN
命令並且需要在終端上鍵入行值時發出。
所選提示變數的值按字面列印,除了遇到百分號 (%
) 的地方。根據下一個字元,會替換某些其他文字。定義的替換是:
%M
#資料庫伺服器的完整主機名(帶域名),如果連線是透過 Unix 域套接字,則為 [local]
;如果 Unix 域套接字不在編譯時預設位置,則為 [local:
。/dir/name
]
%m
#資料庫伺服器的主機名,在第一個點處截斷,如果連線是透過 Unix 域套接字,則為 [local]
。
%>
#資料庫伺服器正在監聽的埠號。
%n
#資料庫會話使用者名稱。(此值的擴充套件可能會在資料庫會話期間因 SET SESSION AUTHORIZATION
命令而改變。)
%s
#服務名稱。
%/
#當前資料庫的名稱。
%~
#類似於 %/
,但如果資料庫是您的預設資料庫,則輸出為 ~
(波浪號)。
%#
#如果會話使用者是資料庫超級使用者,則為 #
,否則為 >
。(此值的擴充套件可能會在資料庫會話期間因 SET SESSION AUTHORIZATION
命令而改變。)
%p
#當前連線的後端程序 ID。
%P
#管道狀態:不在管道中時為 off
,正在進行的管道中為 on
,或已中止的管道中為 abort
。
%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
命令的分頁器相關選項來停用分頁器的使用。這些變數按列出的順序檢查;使用第一個設定的變數。如果兩者都沒有設定,預設是在大多數平臺上使用 more
,但在 Cygwin 上使用 less
。
PSQL_WATCH_PAGER
#當使用 \watch
命令重複執行查詢時,預設不使用分頁器。在 Unix 系統上,可以透過將 PSQL_WATCH_PAGER
設定為分頁器命令來更改此行為。pspg
分頁器(不屬於 PostgreSQL,但在許多開源軟體發行版中可用)如果使用選項 --stream
啟動,可以顯示 \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
,並在呼叫使用者的主目錄中查詢。在 Windows 上,個人啟動檔名為 %APPDATA%\postgresql\psqlrc.conf
。在任何一種情況下,此預設檔案路徑都可以透過設定 PSQLRC
環境變數來覆蓋。
系統範圍的啟動檔案和使用者的個人啟動檔案都可以透過在檔名後附加一個短劃線和 PostgreSQL 主要或次要版本識別符號來指定 psql 版本,例如 ~/.psqlrc-18
或 ~/.psqlrc-18.0
。最具體的版本匹配檔案將優先於非版本特定檔案讀取。這些版本字尾在確定檔案路徑(如上所述)之後新增。
.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)
這裡,+
選項用於顯示其中一個函式的附加資訊,x
用於以擴充套件模式顯示結果
testdb=> \df+x int*pl integer bigint
List of functions
-[ RECORD 1 ]-------+-----------------------------
Schema | pg_catalog
Name | int48pl
Result data type | bigint
Argument data types | integer, bigint
Type | func
Volatility | immutable
Parallel | safe
Owner | postgres
Security | invoker
Leakproof? | no
Access privileges |
Language | internal
Internal name | int48pl
Description | implementation of + operator
如果合適,查詢結果可以用 \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)
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。