PostgreSQL 命令行客戶端 psql 使用指南
作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫(kù)管理與開(kāi)發(fā)經(jīng)驗(yàn),目前在一家全球性的金融公司從事數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
文章目錄
運(yùn)行 psql 工具
連接數(shù)據(jù)庫(kù)
查看當(dāng)前連接信息
切換數(shù)據(jù)庫(kù)連接
查看/設(shè)置客戶端編碼
修改用戶密碼
查看幫助信息
psql 命令幫助
psql 命令行選項(xiàng)幫助
psql 配置變量幫助
SQL 語(yǔ)句幫助
退出 psql 工具
常用元命令
執(zhí)行 SQL 語(yǔ)句
保存查詢結(jié)果
重復(fù)執(zhí)行語(yǔ)句
顯示/清空查詢緩沖區(qū)
編輯/保存查詢緩沖區(qū)
執(zhí)行上一次命令
查看/保存命令歷史
顯示語(yǔ)句執(zhí)行時(shí)間
設(shè)置輸出格式
執(zhí)行腳本文件
顯示詳細(xì)錯(cuò)誤信息
查看數(shù)據(jù)庫(kù)對(duì)象信息
查看角色和用戶
查看數(shù)據(jù)庫(kù)
查看模式
查看表空間
查看表
查看索引
查看序列
查看/編輯視圖
查看/編輯函數(shù)和過(guò)程
高級(jí)功能
設(shè)置變量
SQL 替換
條件執(zhí)行命令
執(zhí)行操作系統(tǒng)命令
處理大對(duì)象
大家好,我是只談技術(shù)不剪發(fā)的 Tony 老師。
psql 是 PostgreSQL 官方提供的命令行客戶端工具,支持交互式的查詢和腳本命令。同時(shí),psql 還提供了大量的元命令(meta-command)以及許多類似 shell 的功能,可以方便我們編寫(xiě)腳本和實(shí)現(xiàn)各種任務(wù)的自動(dòng)化。
無(wú)論是 DBA 還是開(kāi)發(fā)人員,psql 都是和 PostgreSQL 數(shù)據(jù)庫(kù)交互必不可少的工具之一;因此,本文就來(lái)詳細(xì)介紹一下它的使用方法和常用命令。
運(yùn)行 psql 工具
簡(jiǎn)單來(lái)說(shuō),運(yùn)行 psql 工具的命令如下:
psql [option...] [dbname [username]]
其中,option 用于指定各種命令行選項(xiàng),下文將會(huì)詳細(xì)進(jìn)行介紹;dbname 是連接的數(shù)據(jù)庫(kù)名;username 是連接數(shù)據(jù)庫(kù)的用戶名。
執(zhí)行psql -?或者psql --help命令可以獲取運(yùn)行 psql 工具的幫助:
[tony@sqlhost ~]> psql --help
psql is the PostgreSQL interactive terminal.
Usage:
psql [OPTION]... [DBNAME [USERNAME]]
General options:
-c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to (default: "tony")
-f, --file=FILENAME execute commands from file, then exit
-l, --list list available databases, then exit
-v, --set=, --variable=NAME=VALUE
set psql variable NAME to VALUE
(e.g., -v ON_ERROR_STOP=1)
-V, --version output version information, then exit
-X, --no-psqlrc do not read startup file (~/.psqlrc)
-1 ("one"), --single-transaction
execute as a single transaction (if non-interactive)
-?, --help[=options] show this help, then exit
--help=commands list backslash commands, then exit
--help=variables list special variables, then exit
Input and output options:
-a, --echo-all echo all input from script
-b, --echo-errors echo failed commands
-e, --echo-queries echo commands sent to server
-E, --echo-hidden display queries that internal commands generate
-L, --log-file=FILENAME send session log to file
-n, --no-readline disable enhanced command line editing (readline)
-o, --output=FILENAME send query results to file (or |pipe)
-q, --quiet run quietly (no messages, only query output)
-s, --single-step single-step mode (confirm each query)
-S, --single-line single-line mode (end of line terminates SQL command)
Output format options:
-A, --no-align unaligned table output mode
--csv CSV (Comma-Separated Values) table output mode
-F, --field-separator=STRING
field separator for unaligned output (default: "|")
-H, --html HTML table output mode
-P, --pset=VAR[=ARG] set printing option VAR to ARG (see \pset command)
-R, --record-separator=STRING
record separator for unaligned output (default: newline)
-t, --tuples-only print rows only
-T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)
-x, --expanded turn on expanded table output
-z, --field-separator-zero
set field separator for unaligned output to zero byte
-0, --record-separator-zero
set record separator for unaligned output to zero byte
Connection options:
-h, --host=HOSTNAME database server host or socket directory (default: "local socket")
-p, --port=PORT database server port (default: "5432")
-U, --username=USERNAME database user name (default: "tony")
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
For more information, type "\?" (for internal commands) or "\help" (for SQL
commands) from within psql, or consult the psql section in the PostgreSQL
documentation.
Report bugs to <pgsql-bugs@lists.postgresql.org>.
接下來(lái)我們?cè)敿?xì)介紹一下這些選項(xiàng)的作用。
連接數(shù)據(jù)庫(kù)
使用 psql 連接 PostgreSQL 數(shù)據(jù)庫(kù)的選項(xiàng)如下:
-h hostname或者--host=hostname,數(shù)據(jù)庫(kù)服務(wù)器主機(jī)地址或者本機(jī) socket 目錄,默認(rèn)為 local socket 或者 localhost;
-p port或者--port=port,數(shù)據(jù)庫(kù)服務(wù)的監(jiān)聽(tīng)端口,默認(rèn)為 5432;
-U username或者--username=username,數(shù)據(jù)庫(kù)用戶名,默認(rèn)為操作系統(tǒng)當(dāng)前用戶;
-w或者--no-password,不提示輸入密碼,如果沒(méi)有提供其他認(rèn)證方式(例如 .pgpass 文件)可能會(huì)連接失敗。通常用于執(zhí)行批處理任務(wù)和腳本;
-W或者--password,強(qiáng)制提示輸入密碼,如果服務(wù)器要求密碼認(rèn)證,即使不指定該參數(shù)也會(huì)提示輸入密碼;
-d dbname或者--dbname=dbname,連接的數(shù)據(jù)庫(kù),默認(rèn)和用戶名相同。該參數(shù)等價(jià)于 psql 命令后第一個(gè)非選項(xiàng)形式的參數(shù) dbname。
例如,以下命令使用 postgres 用戶連接到主機(jī) 192.168.56.104、端口 5432 的 hrdb 數(shù)據(jù)庫(kù):
[tony@sqlhost ~]> psql -h 192.168.56.104 -p 5432 -U postgres hrdb
Password for user postgres:
psql (12.4)
Type "help" for help.
hrdb=#
以下命令使用操作系統(tǒng)用戶(postgres)通過(guò) Unix 套接字連接到本機(jī)上的 postgres 數(shù)據(jù)庫(kù):
-bash-4.2$ whoami
postgres
-bash-4.2$ psql
psql (12.4)
Type "help" for help.
postgres=#
另一種指定連接參數(shù)的方法是使用 conninfo 字符串或者 URI 替代數(shù)據(jù)庫(kù)名。例如:
[tony@sqlhost ~]> psql "host=192.168.56.104 user=tony password=tony port=5432 dbname=hrdb"
psql (12.4)
Type "help" for help.
hrdb=> \q
[tony@sqlhost ~]> psql postgresql://192.168.56.104:5432/hrdb?user=tony
Password for user tony:
psql (12.4)
Type "help" for help.
hrdb=>
查看當(dāng)前連接信息
成功建立連接之后,可以使用元命令\conninfo查看當(dāng)前連接信息:
hrdb=> \conninfo
You are connected to database "hrdb" as user "tony" on host "192.168.56.104" at port "5432".
切換數(shù)據(jù)庫(kù)連接
使用元命令\c可以重新連接數(shù)據(jù)庫(kù):
\c[onnect] [ dbname [ username ] [ host ] [ port ] | conninfo ]
以上參數(shù)如果省略,將會(huì)重用原有連接的參數(shù)值。例如:
hrdb=> \c
You are now connected to database "hrdb" as user "tony".
hrdb=> \c postgres
You are now connected to database "postgres" as user "tony".
postgres=>
第一個(gè) \c 命令使用原來(lái)的連接參數(shù)重新建立了連接;第二個(gè) \c 命令使用原來(lái)的用戶(tony)切換到了 postgres 數(shù)據(jù)庫(kù)。
查看/設(shè)置客戶端編碼
通過(guò)\encoding [ENCODING]命令可以查看或者設(shè)置客戶端的編碼格式。例如:
hrdb=> \encoding
UTF8
hrdb=> \encoding gbk
hrdb=> \encoding
GBK
修改用戶密碼
使用\password [username]命令可以安全地修改指定用戶的密碼,默認(rèn)為修改當(dāng)前用戶密碼。例如:
hrdb=> \password
Enter new password:
Enter it again:
hrdb=>
查看幫助信息
psql 提供了關(guān)于該工具的命令、選項(xiàng)、變量配置以及 SQL 語(yǔ)句的幫助信息。
psql 命令幫助
使用\?或者\(yùn)? commands命令可以獲得所有反斜線命令的幫助:
hrdb=> \?
General
\copyright show PostgreSQL usage and distribution terms
\crosstabview [COLUMNS] execute query and display results in crosstab
\errverbose show most recent error message at maximum verbosity
\g [FILE] or ; execute query (and send results to file or |pipe)
\gdesc describe result of query, without executing it
\gexec execute query, then execute each value in its result
\gset [PREFIX] execute query and store results in psql variables
\gx [FILE] as \g, but forces expanded output mode
\q quit psql
\watch [SEC] execute query every SEC seconds
Help
\? [commands] show help on backslash commands
\? options show help on psql command-line options
\? variables show help on special variables
\h [NAME] help on syntax of SQL commands, * for all commands
...
該命令的結(jié)果和psql --help=commands的輸出相同。
psql 命令行選項(xiàng)幫助
輸入\? options命令可以獲得運(yùn)行 psql 時(shí)的命令行選項(xiàng)相關(guān)的幫助:
hrdb=> \? options
psql is the PostgreSQL interactive terminal.
Usage:
psql [OPTION]... [DBNAME [USERNAME]]
General options:
-c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to (default: "tony")
-f, --file=FILENAME execute commands from file, then exit
-l, --list list available databases, then exit
-v, --set=, --variable=NAME=VALUE
set psql variable NAME to VALUE
(e.g., -v ON_ERROR_STOP=1)
-V, --version output version information, then exit
-X, --no-psqlrc do not read startup file (~/.psqlrc)
-1 ("one"), --single-transaction
execute as a single transaction (if non-interactive)
-?, --help[=options] show this help, then exit
--help=commands list backslash commands, then exit
--help=variables list special variables, then exit
...
該命令的結(jié)果和上文中的psql -?或者psql --help的輸出相同。
psql 配置變量幫助
輸入\? variables命令可以獲得 psql 的配置變量、環(huán)境變量以及顯示設(shè)置相關(guān)的幫助信息:
hrdb=> \? variables
List of specially treated variables
psql variables:
Usage:
psql --set=NAME=VALUE
or \set NAME VALUE inside psql
AUTOCOMMIT
if set, successful SQL commands are automatically committed
COMP_KEYWORD_CASE
determines the case used to complete SQL key words
[lower, upper, preserve-lower, preserve-upper]
DBNAME
the currently connected database name
ECHO
controls what input is written to standard output
[all, errors, none, queries]
ECHO_HIDDEN
if set, display internal queries executed by backslash commands;
if set to "noexec", just show them without execution
ENCODING
current client character set encoding
ERROR
true if last query failed, else false
FETCH_COUNT
the number of result rows to fetch and display at a time (0 = unlimited)
...
該命令的結(jié)果和psql --help=variables的輸出相同。
SQL 語(yǔ)句幫助
輸入\h [ command ]或者\(yùn)help [ command ]命令可以獲得 SQL 命令語(yǔ)法相關(guān)的幫助:
hrdb=> \h
Available help:
ABORT CREATE FOREIGN DATA WRAPPER DROP ROUTINE
ALTER AGGREGATE CREATE FOREIGN TABLE DROP RULE
ALTER COLLATION CREATE FUNCTION DROP SCHEMA
ALTER CONVERSION CREATE GROUP DROP SEQUENCE
ALTER DATABASE CREATE INDEX DROP SERVER
ALTER DEFAULT PRIVILEGES CREATE LANGUAGE DROP STATISTICS
...
或者直接查看某個(gè)具體 SQL 命令的語(yǔ)法幫助,例如:
hrdb=> \h create index
Command: CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ INCLUDE ( column_name [, ...] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ WHERE predicate ]
URL: https://www.postgresql.org/docs/12/sql-createindex.html
退出 psql 工具
退出 psql 終端的命令包括\q、\quit、quit以及exit。例如:
hrdb=> \q
[tony@sqlhost ~]>
常用元命令
執(zhí)行 SQL 語(yǔ)句
psql 中的 SQL 命令以;或者\(yùn)g結(jié)束,同時(shí)發(fā)送到服務(wù)端執(zhí)行并返回結(jié)果。例如,以下查詢返回了當(dāng)前 PostgreSQL 數(shù)據(jù)庫(kù)的版本:
hrdb=> SELECT version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 12.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)
保存查詢結(jié)果
如果想要將查詢結(jié)果直接保存到某個(gè)文件中,可以使用\g filename命令。例如:
hrdb=> SELECT version() \g result.txt
hrdb=> \! ls
result.txt
此時(shí),數(shù)據(jù)庫(kù)的版本信息被保存到了操作系統(tǒng)當(dāng)前工作目錄下的 result.txt 文件中。\! command用于執(zhí)行操作系統(tǒng)命令,這里使用 Linux 的 ls 命令查看文件列表。
另外,執(zhí)行\(zhòng)o [ filename ]命令可以將之后的所有查詢結(jié)果和命令返回信息保存到指定文件,默認(rèn)為標(biāo)準(zhǔn)輸出。例如:
hrdb=> \o result.txt
hrdb=> select user;
hrdb=> select version();
hrdb=> \o
hrdb=> select user;
user
------
tony
(1 row)
前兩個(gè) select 語(yǔ)句的結(jié)果打印到了 result.txt 文件中,然后又將查詢結(jié)果定向?yàn)闃?biāo)準(zhǔn)輸出。
還有一個(gè)\copy ...命令可以用于將表或者查詢結(jié)果保存到指定文件中,或者從指定文件中讀取內(nèi)容到表中。例如:
hrdb=> \copy employee to employee.txt
COPY 25
重復(fù)執(zhí)行語(yǔ)句
\watch [SEC]命令可以用于每隔指定秒數(shù)(默認(rèn) 2 秒)執(zhí)行一次 SQL 語(yǔ)句。例如:
hrdb=> SELECT now() \watch 5
Wed 26 Aug 2020 01:44:44 AM CST (every 5s)
now
------------------------------
2020-08-26 01:44:44.64684+08
(1 row)
Wed 26 Aug 2020 01:44:49 AM CST (every 5s)
now
-------------------------------
2020-08-26 01:44:49.655722+08
(1 row)
Wed 26 Aug 2020 01:44:54 AM CST (every 5s)
now
-------------------------------
2020-08-26 01:44:54.676536+08
(1 row)
顯示/清空查詢緩沖區(qū)
輸入\p命令可以顯示當(dāng)前緩沖區(qū)或者最近一次執(zhí)行的命令:
hrdb=> \p
SELECT version()
輸入\r命令可以清空當(dāng)前緩沖區(qū)中的內(nèi)容:
hrdb=> \r
Query buffer reset (cleared).
編輯/保存查詢緩沖區(qū)
元命令\e [FILE] [LINE]可以用于編輯當(dāng)前查詢緩沖區(qū)或者文件中的內(nèi)容。例如:
hrdb=> \e
Linux 默認(rèn)使用 vim 作為外部編輯器,Windows 默認(rèn)使用 Notepad 作為外部編輯器。
在這里插入圖片描述
編輯完成后所有的內(nèi)容都會(huì)復(fù)制到查詢緩沖區(qū),如果命令中包含 ; 或者 \g,psql 會(huì)自動(dòng)執(zhí)行該命令。
?column?
----------
2
(1 row)
元命令\w filename可以將當(dāng)前查詢緩沖區(qū)中的內(nèi)容保存到文件中:
hrdb=> \w command.txt
執(zhí)行上一次命令
直接輸入沒(méi)有參數(shù)的\g命令表示再次執(zhí)行查詢緩沖區(qū)中的命令或者上一次執(zhí)行的語(yǔ)句。例如:
hrdb=> SELECT 1;
?column?
----------
1
(1 row)
hrdb=> \g
?column?
----------
1
(1 row)
查看/保存命令歷史
\s [ filename ]命令用于將歷史命令保存到文件中,如果省略 filename 則顯示到終端。例如:
hrdb=> \s
SELECT version() \g result.txt
\! ls
SELECT now() \watch
\watch
\s
SELECT now() \watch 5
\timing on
select count(*) from employee;
\timing
SELECT 1;
\g
\s
顯示語(yǔ)句執(zhí)行時(shí)間
\timing [ on | off ]命令可以用于顯示或者關(guān)閉 SQL 語(yǔ)句的執(zhí)行時(shí)間,單位為毫秒。例如:
hrdb=> \timing on
Timing is on.
hrdb=> select count(*) from employee;
count
-------
25
(1 row)
Time: 23.220 ms
hrdb=> \timing
Timing is off.
不指定參數(shù)的\timing命令可以在 on 和 off 之間切換。
設(shè)置輸出格式
\pset [ option [ value ] ]命令可以用于顯示或者設(shè)置與查詢結(jié)果輸出相關(guān)的選項(xiàng)。例如:
hrdb=> \pset
border 1
columns 0
csv_fieldsep ','
expanded off
fieldsep '|'
fieldsep_zero off
footer on
format aligned
linestyle ascii
null ''
numericlocale off
pager 1
pager_min_lines 0
recordsep '\n'
recordsep_zero off
tableattr
title
tuples_only off
unicode_border_linestyle single
unicode_column_linestyle single
unicode_header_linestyle single
以上命令返回了當(dāng)前的選項(xiàng)設(shè)置。
我們以 null 選項(xiàng)為例,默認(rèn)情況下 psql 的輸出結(jié)果中無(wú)法區(qū)分空字符串和 NULL 值,我們可以使用\pset null str命令將 NULL 值顯示為指定的字符串:
hrdb=> select null as null_value,'' as empty_string;
null_value | empty_string
------------+--------------
|
(1 row)
hrdb=> select null as null_value,'' as empty_string;
null_value | empty_string
------------+--------------
[null] |
(1 row)
一些選項(xiàng)還提供了便捷的元命令,例如\x命令\pset expanded on|off命令都可以打開(kāi)或者關(guān)閉擴(kuò)展表格模式。例如:
hrdb=> \x
Expanded display is on.
hrdb=> select emp_id, emp_name, hire_date from employee limit 3;
-[ RECORD 1 ]---------
emp_id | 1
emp_name | 劉備
hire_date | 2000-01-01
-[ RECORD 2 ]---------
emp_id | 4
emp_name | 諸葛亮
hire_date | 2006-03-15
-[ RECORD 3 ]---------
emp_id | 5
emp_name | 黃忠
hire_date | 2008-10-25
hrdb=> \x
Expanded display is off.
另一個(gè)常用的選項(xiàng)是 format,它可以用于設(shè)置不同的輸出格式,例如 csv 或者 html 等。
hrdb=> \pset format csv
Output format is csv.
hrdb=> select emp_id, emp_name, hire_date from employee limit 3;
emp_id,emp_name,hire_date
1,劉備,2000-01-01
4,諸葛亮,2006-03-15
5,黃忠,2008-10-25
??關(guān)于 \pset 命令相關(guān)的更多選項(xiàng)配置,可以參考 PostgreSQL 官方文檔或者中文文檔。
\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]命令可以將查詢結(jié)果按照交叉報(bào)表的形式進(jìn)行顯示,colV 是垂直標(biāo)題字段(默認(rèn)第一個(gè)字段),colH 是水平標(biāo)題字段(默認(rèn)第二個(gè)字段),colD 是表格中的數(shù)據(jù)字段(默認(rèn)第三個(gè)字段),sortcolH 是決定水平標(biāo)題順序的字段。例如:
hrdb=> select emp_name, sex, salary from employee limit 10 \crosstabview
emp_name | 男 | 女
----------+----------+----------
劉備 | 30000.00 |
諸葛亮 | 24000.00 |
黃忠 | 8000.00 |
魏延 | 7500.00 |
孫尚香 | | 12000.00
孫丫鬟 | | 6000.00
趙云 | 15000.00 |
廖化 | 6500.00 |
關(guān)平 | 6800.00 |
趙氏 | | 6600.00
(10 rows)
執(zhí)行腳本文件
\i filename命令用于讀取文件并執(zhí)行其中的命令。在操作系統(tǒng)當(dāng)前目錄中創(chuàng)建一個(gè)腳本文件 test.sql,輸入以下語(yǔ)句:
select current_user;
1
然后在 psql 中輸入以下命令:
hrdb-> \i test.sql
current_user
--------------
tony
(1 row)
如果 filename 是一個(gè)連字符(-),表示從標(biāo)準(zhǔn)輸入讀取內(nèi)容,知道 EOF 或者 \q 命令結(jié)束。這種方式可以用于運(yùn)行腳本文件時(shí)接收手動(dòng)輸入。
另外,\ir filename命令也可以用于運(yùn)行腳本文件。兩者不同之處在于 \ir 查找文件時(shí)使用相對(duì)路徑;如果從一個(gè)腳本文件中讀取其他文件,會(huì)以當(dāng)前文件目錄作為查找目錄,而不是當(dāng)前工作目錄。
顯示詳細(xì)錯(cuò)誤信息
\errverbose命令可以用于顯示最近的服務(wù)器錯(cuò)誤信息。例如:
hrdb=> select * from abc;
ERROR: relation "abc" does not exist
LINE 1: select * from abc;
^
hrdb=> \errverbose
ERROR: 42P01: relation "abc" does not exist
LINE 1: select * from abc;
^
LOCATION: parserOpenTable, parse_relation.c:1194
查看數(shù)據(jù)庫(kù)對(duì)象信息
psql 提供了大量用于查看數(shù)據(jù)庫(kù)對(duì)象信息的元命令,絕大多數(shù)以 \d 開(kāi)頭。其中很多命令支持額外的 S 后綴,用于顯示系統(tǒng)對(duì)象,否則只顯示當(dāng)前用戶擁有訪問(wèn)權(quán)限的對(duì)象;或者額外的 + 后綴,用于顯示額外的信息。
查看角色和用戶
\du[S+] [ pattern ]或者\(yùn)dg[S+] [ pattern ]命令用于列出用戶創(chuàng)建的角色、用戶和組。例如:
hrdb=> \du
List of roles
Role name | Attributes | Member of
----------------------+------------------------------------------------------------+-----------
monitor_system_stats | Cannot login | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
tony | No inheritance | {}
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)創(chuàng)建的角色;如果指定了 + 選項(xiàng),還會(huì)顯示額外的描述信息;如果指定了 pattern,只有名稱匹配指定模式的角色才會(huì)顯示。
查看數(shù)據(jù)庫(kù)
\l[+] [pattern]命令用于列出系統(tǒng)中的所有數(shù)據(jù)庫(kù)。例如:
hrdb=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
ds2 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
hrdb | tony | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
pagila | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(6 rows)
如果指定 + 選項(xiàng),還會(huì)顯示額外的數(shù)據(jù)庫(kù)大小、默認(rèn)表空間和描述信息;如果指定了 pattern,只有名稱匹配指定模式的數(shù)據(jù)庫(kù)才會(huì)顯示。
查看模式
\dn[S+] [ pattern ]命令用于列出當(dāng)前數(shù)據(jù)庫(kù)中的所有模式(schema)。例如:
hrdb=> \dn
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)模式;如果指定了 + 選項(xiàng),還會(huì)顯示額外的授權(quán)信息和描述;如果指定了 pattern,只有名稱匹配指定模式的 schema 才會(huì)顯示。
查看表空間
\db[+] [ pattern ]命令用于列出系統(tǒng)中的所有表空間。例如:
hrdb=> \db
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
如果指定了 + 選項(xiàng),還會(huì)顯示額外的選項(xiàng)、空間大小、授權(quán)信息和描述;如果指定了 pattern,只有名稱匹配指定模式的表空間才會(huì)顯示。
查看表
\dt[S+] [ pattern ]命令用于列出所有的數(shù)據(jù)表。例如:
hrdb=> \dt
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------------------+-------
public | accounts | table | tony
public | anchors | table | tony
public | bj_subway | table | tony
...
(41 rows)
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)表;如果指定了 + 選項(xiàng),還會(huì)顯示額外的大小和描述信息;如果指定了 pattern,只有名稱匹配指定模式的表才會(huì)顯示。
另外,\d[S+] [ pattern ]命令可以同時(shí)列出表、視圖、物化視圖、索引、序列以及外部表的信息,等價(jià)于\dtvmsE[S+] [ pattern ]命令。
查看索引
\di[S+] [ pattern ]命令用于列出所有的索引。例如:
hrdb=> \di
List of relations
Schema | Name | Type | Owner | Table
--------+------------------------+-------+-------+-------------------
public | accounts_pkey | index | tony | accounts
public | bj_subway_pkey | index | tony | bj_subway
public | department_pkey | index | tony | department
...
(39 rows)
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)表上的索引;如果指定了 + 選項(xiàng),還會(huì)顯示額外的大小和描述信息;如果指定了 pattern,只有名稱匹配指定模式的索引才會(huì)顯示。
查看序列
\ds[S+] [ pattern ]命令用于列出所有的序列。例如:
hrdb=> \ds
List of relations
Schema | Name | Type | Owner
--------+--------------------------+----------+-------
public | accounts_id_seq | sequence | tony
public | employees_history_id_seq | sequence | tony
public | users_id_seq | sequence | tony
(3 rows)
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)創(chuàng)建的序列;如果指定了 + 選項(xiàng),還會(huì)顯示額外的大小和描述信息;如果指定了 pattern,只有名稱匹配指定模式的序列才會(huì)顯示。
查看/編輯視圖
\dv[S+] [ pattern ]命令用于列出所有的視圖。例如:
hrdb=> \dv
List of relations
Schema | Name | Type | Owner
--------+---------------+------+-------
public | employee_path | view | tony
public | employees_it | view | tony
(2 rows)
如果指定了 S 選項(xiàng),同時(shí)會(huì)顯示系統(tǒng)創(chuàng)建的視圖;如果指定了 + 選項(xiàng),還會(huì)顯示額外的大小和描述信息;如果指定了 pattern,只有名稱匹配指定模式的視圖才會(huì)顯示。
\sv[+] view_name命令用于顯示視圖的定義語(yǔ)句。例如:
hrdb=> \sv employees_it
CREATE OR REPLACE VIEW public.employees_it AS
SELECT employees.employee_id,
employees.first_name,
employees.last_name,
employees.email,
employees.phone_number,
employees.hire_date,
employees.job_id,
employees.manager_id,
employees.department_id
FROM employees
WHERE employees.department_id = 60
WITH CASCADED CHECK OPTION
如果指定了 + 選項(xiàng),同時(shí)會(huì)顯示行號(hào)(從 1 開(kāi)始)。
\ev [ view_name [ line_number ] ]命令用于編輯視圖的定義,類似于\e命令。例如:
hrdb=> \ev employees_it
1
在這里插入圖片描述
編輯完成之后,定義語(yǔ)句將會(huì)保留在查詢緩沖區(qū)中,可以輸入 \g 運(yùn)行或者 \r 取消。
如果指定了 line_number,編輯時(shí)自動(dòng)定位到指定代碼行;如果沒(méi)有指定 view_name,相當(dāng)于新建一個(gè)視圖。
查看/編輯函數(shù)和過(guò)程
\df[anptwS+] [ pattern ]命令用于列出所有的函數(shù),其中 a 表示聚合函數(shù),n 表示普通函數(shù)、p 表示存儲(chǔ)過(guò)程,t 表示觸發(fā)器函數(shù),w 表示窗口函數(shù)。例如:
hrdb-> \df
List of functions
Schema | Name | Result data type |
Argument data types
| Type
--------+------------------------------+----------------------------+-------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------+------
public | abort_any_command | event_trigger |
| func
public | add_user | | pv_name character varying, pd_created_at timestamp wit
hout time zone
| proc
public | version_del_func | trigger |
| func
...
(28 rows)
\sf[+] function_description命令用于顯示函數(shù)、存儲(chǔ)過(guò)程等對(duì)象的定義。例如:
hrdb-> \sf add_user(character varying, timestamp without time zone)
CREATE OR REPLACE PROCEDURE public.add_user(pv_name character varying, pd_created_at timestamp without time zone)
LANGUAGE plpgsql
AS $procedure$
BEGIN
insert into users(name, created_at)
values (pv_name, pd_created_at);
END; $procedure$
如果指定了 + 選項(xiàng),同時(shí)會(huì)顯示主體代碼的行號(hào)(從 1 開(kāi)始)。
\ef [ function_description [ line_number ] ]命令用于編輯函數(shù)、存儲(chǔ)過(guò)程等對(duì)象的定義。該命令的使用方法和\ev命令相同,可以參考上一小節(jié)。
高級(jí)功能
設(shè)置變量
psql 提供了類似于 Unix 中的命令行變量替換的功能。變量由 name/value 對(duì)組成,其中 value 可以是任意長(zhǎng)度的字符串;name 由字母、數(shù)字和下劃線組成,區(qū)分大小寫(xiě)。
變量由\set [ name [ value [ ... ] ] ]命令進(jìn)行設(shè)置。例如:
hrdb=> \set myname 'tony'
使用變量時(shí),需要在變量名前加上冒號(hào)(:)。例如:
hrdb=> \echo :myname
tony
沒(méi)有參數(shù)的\set命令可以用于顯示所有變量的值:
hrdb=> \set
AUTOCOMMIT = 'on'
COMP_KEYWORD_CASE = 'preserve-upper'
DBNAME = 'hrdb'
ECHO = 'none'
ECHO_HIDDEN = 'off'
ENCODING = 'UTF8'
ERROR = 'false'
...
以上命令返回的大寫(xiě)變量都是 psql 默認(rèn)設(shè)置的特殊變量。
變量 PROMPT1(常規(guī)提示符)、PROMPT2(等待更多輸入)以及 PROMPT3(等待終端輸入行數(shù)據(jù))可以用于設(shè)置 psql 的命令提示符。例如:
hrdb=> \set PROMPT1 '%n@%M %~%R%# '
tony@192.168.56.104 hrdb=>
其中,百分號(hào)代表了特殊的含義;%n 表示用戶名,%M 表示服務(wù)器的主機(jī)名,%~ 表示數(shù)據(jù)庫(kù)名,%R 表示 =,%# 表示 #(superuser)或者 >(普通用戶)。更多的特殊符號(hào)可以參考官方文檔或者中文文檔。
\set name命令可以將變量 name 設(shè)置為空字符串。如果想要?jiǎng)h除變量,可以使用\unset name命令。例如:
hrdb=> \unset myname
另外,\prompt [ text ] name命令可以用于提示用戶輸入一個(gè)變量值,text 是提示文字。例如:
hrdb=> \prompt 'Please choose Y or N:' mychoice
Please choose Y or N:Y
SQL 替換
基于 psql 變量可以實(shí)現(xiàn)一個(gè)重要的功能:SQL 替換。也就是將變量的內(nèi)容替換到 SQL 語(yǔ)句中或者作為元命令的參數(shù)。例如:
hrdb=> \set tablename 't1'
hrdb=> select * from :tablename;
id
----
(2 rows)
hrdb=> select :'tablename' as val;
val
-----
t1
(1 row)
條件執(zhí)行命令
\if expression、\elif expression、\else以及\endif命令可以用于條件判斷,實(shí)現(xiàn)嵌套的條件語(yǔ)句。
hrdb=> \set b false
hrdb=> \if :b
hrdb@> \echo 'b is true'
\echo command ignored; use \endif or Ctrl-C to exit current \if block
hrdb@> \else
hrdb=> \echo 'b is false'
b is false
hrdb=> \endif
執(zhí)行操作系統(tǒng)命令
psql 支持使用\! [ command ]直接運(yùn)行操作系統(tǒng)命令,而不需要退出當(dāng)前連接。例如:
hrdb-> \! pwd
/home/tony
hrdb-> \! ls -l
total 16
-rw-rw-r-- 1 tony tony 18 Aug 26 03:36 command.txt
-rw-rw-r-- 1 tony tony 1613 Aug 26 17:21 employee.txt
-rw-rw-r-- 1 tony tony 355 Aug 26 17:00 result.txt
-rw-rw-r-- 1 tony tony 21 Aug 26 13:55 test.sql
如果直接輸入\!,將會(huì)切換到操作系統(tǒng)命令行環(huán)境,退出之后回到 psql 環(huán)境。
另外,\cd [ directory ]命令用于切換當(dāng)前工作目錄,默認(rèn)為當(dāng)前用戶的 home 目錄。例如:
hrdb-> \cd /tmp
hrdb-> \! pwd
/tmp
hrdb-> \cd
hrdb-> \! pwd
/home/tony
處理大對(duì)象
psql 支持從文件系統(tǒng)讀取文件存儲(chǔ)為 PostgreSQL 大對(duì)象的\lo_import filename [ comment ],以及從將大對(duì)象導(dǎo)出到文件中的\lo_export loid filename命令。例如:
hrdb-> \lo_import '/home/tony/pagila.png' 'this is pagila erd'
lo_import 155782
返回的數(shù)字 155782 是大對(duì)象的 id。使用\lo_list或者\(yùn)dl命令可以查看所有的大對(duì)象:
hrdb-> \lo_list
Large objects
ID | Owner | Description
--------+-------+--------------------
155782 | tony | this is pagila erd
(1 row)
使用 \lo_export 命令將該對(duì)象導(dǎo)出到文件系統(tǒng)中:
hrdb-> \lo_export 155782 '/home/tony/pagila2.png'
lo_export
hrdb-> \! ls
command.txt employee.txt pagila2.png pagila.png result.txt test.sql
最后,使用\lo_unlink loid命令刪除大對(duì)象。例如:
hrdb-> \lo_unlink 155782
lo_unlink 155782
hrdb-> \lo_list
Large objects
ID | Owner | Description
----+-------+-------------
(0 rows)