PostgreSQL 命令行客户端 psql 使用指南
作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net
文章目录
运行 psql 工具
连接数据库
查看当前连接信息
切换数据库连接
查看/设置客户端编码
修改用户密码
查看帮助信息
psql 命令帮助
psql 命令行选项帮助
psql 配置变量帮助
SQL 语句帮助
退出 psql 工具
常用元命令
执行 SQL 语句
保存查询结果
重复执行语句
显示/清空查询缓冲区
编辑/保存查询缓冲区
执行上一次命令
查看/保存命令历史
显示语句执行时间
设置输出格式
执行脚本文件
显示详细错误信息
查看数据库对象信息
查看角色和用户
查看数据库
查看模式
查看表空间
查看表
查看索引
查看序列
查看/编辑视图
查看/编辑函数和过程
高级功能
设置变量
SQL 替换
条件执行命令
执行操作系统命令
处理大对象
大家好,我是只谈技术不剪发的 Tony 老师。
psql 是 PostgreSQL 官方提供的命令行客户端工具,支持交互式的查询和脚本命令。同时,psql 还提供了大量的元命令(meta-command)以及许多类似 shell 的功能,可以方便我们编写脚本和实现各种任务的自动化。
无论是 DBA 还是开发人员,psql 都是和 PostgreSQL 数据库交互必不可少的工具之一;因此,本文就来详细介绍一下它的使用方法和常用命令。
运行 psql 工具
简单来说,运行 psql 工具的命令如下:
psql [option...] [dbname [username]]
其中,option 用于指定各种命令行选项,下文将会详细进行介绍;dbname 是连接的数据库名;username 是连接数据库的用户名。
执行psql -?或者psql --help命令可以获取运行 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>.
接下来我们详细介绍一下这些选项的作用。
连接数据库
使用 psql 连接 PostgreSQL 数据库的选项如下:
-h hostname或者--host=hostname,数据库服务器主机地址或者本机 socket 目录,默认为 local socket 或者 localhost;
-p port或者--port=port,数据库服务的监听端口,默认为 5432;
-U username或者--username=username,数据库用户名,默认为操作系统当前用户;
-w或者--no-password,不提示输入密码,如果没有提供其他认证方式(例如 .pgpass 文件)可能会连接失败。通常用于执行批处理任务和脚本;
-W或者--password,强制提示输入密码,如果服务器要求密码认证,即使不指定该参数也会提示输入密码;
-d dbname或者--dbname=dbname,连接的数据库,默认和用户名相同。该参数等价于 psql 命令后第一个非选项形式的参数 dbname。
例如,以下命令使用 postgres 用户连接到主机 192.168.56.104、端口 5432 的 hrdb 数据库:
[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=#
以下命令使用操作系统用户(postgres)通过 Unix 套接字连接到本机上的 postgres 数据库:
-bash-4.2$ whoami
postgres
-bash-4.2$ psql
psql (12.4)
Type "help" for help.
postgres=#
另一种指定连接参数的方法是使用 conninfo 字符串或者 URI 替代数据库名。例如:
[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=>
查看当前连接信息
成功建立连接之后,可以使用元命令\conninfo查看当前连接信息:
hrdb=> \conninfo
You are connected to database "hrdb" as user "tony" on host "192.168.56.104" at port "5432".
切换数据库连接
使用元命令\c可以重新连接数据库:
\c[onnect] [ dbname [ username ] [ host ] [ port ] | conninfo ]
以上参数如果省略,将会重用原有连接的参数值。例如:
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=>
第一个 \c 命令使用原来的连接参数重新建立了连接;第二个 \c 命令使用原来的用户(tony)切换到了 postgres 数据库。
查看/设置客户端编码
通过\encoding [ENCODING]命令可以查看或者设置客户端的编码格式。例如:
hrdb=> \encoding
UTF8
hrdb=> \encoding gbk
hrdb=> \encoding
GBK
修改用户密码
使用\password [username]命令可以安全地修改指定用户的密码,默认为修改当前用户密码。例如:
hrdb=> \password
Enter new password:
Enter it again:
hrdb=>
查看帮助信息
psql 提供了关于该工具的命令、选项、变量配置以及 SQL 语句的帮助信息。
psql 命令帮助
使用\?或者\? 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
...
该命令的结果和psql --help=commands的输出相同。
psql 命令行选项帮助
输入\? options命令可以获得运行 psql 时的命令行选项相关的帮助:
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
...
该命令的结果和上文中的psql -?或者psql --help的输出相同。
psql 配置变量帮助
输入\? variables命令可以获得 psql 的配置变量、环境变量以及显示设置相关的帮助信息:
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)
...
该命令的结果和psql --help=variables的输出相同。
SQL 语句帮助
输入\h [ command ]或者\help [ command ]命令可以获得 SQL 命令语法相关的帮助:
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
...
或者直接查看某个具体 SQL 命令的语法帮助,例如:
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 ~]>
常用元命令
执行 SQL 语句
psql 中的 SQL 命令以;或者\g结束,同时发送到服务端执行并返回结果。例如,以下查询返回了当前 PostgreSQL 数据库的版本:
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)
保存查询结果
如果想要将查询结果直接保存到某个文件中,可以使用\g filename命令。例如:
hrdb=> SELECT version() \g result.txt
hrdb=> \! ls
result.txt
此时,数据库的版本信息被保存到了操作系统当前工作目录下的 result.txt 文件中。\! command用于执行操作系统命令,这里使用 Linux 的 ls 命令查看文件列表。
另外,执行\o [ filename ]命令可以将之后的所有查询结果和命令返回信息保存到指定文件,默认为标准输出。例如:
hrdb=> \o result.txt
hrdb=> select user;
hrdb=> select version();
hrdb=> \o
hrdb=> select user;
user
------
tony
(1 row)
前两个 select 语句的结果打印到了 result.txt 文件中,然后又将查询结果定向为标准输出。
还有一个\copy ...命令可以用于将表或者查询结果保存到指定文件中,或者从指定文件中读取内容到表中。例如:
hrdb=> \copy employee to employee.txt
COPY 25
重复执行语句
\watch [SEC]命令可以用于每隔指定秒数(默认 2 秒)执行一次 SQL 语句。例如:
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)
显示/清空查询缓冲区
输入\p命令可以显示当前缓冲区或者最近一次执行的命令:
hrdb=> \p
SELECT version()
输入\r命令可以清空当前缓冲区中的内容:
hrdb=> \r
Query buffer reset (cleared).
编辑/保存查询缓冲区
元命令\e [FILE] [LINE]可以用于编辑当前查询缓冲区或者文件中的内容。例如:
hrdb=> \e
Linux 默认使用 vim 作为外部编辑器,Windows 默认使用 Notepad 作为外部编辑器。
在这里插入图片描述
编辑完成后所有的内容都会复制到查询缓冲区,如果命令中包含 ; 或者 \g,psql 会自动执行该命令。
?column?
----------
2
(1 row)
元命令\w filename可以将当前查询缓冲区中的内容保存到文件中:
hrdb=> \w command.txt
执行上一次命令
直接输入没有参数的\g命令表示再次执行查询缓冲区中的命令或者上一次执行的语句。例如:
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
显示语句执行时间
\timing [ on | off ]命令可以用于显示或者关闭 SQL 语句的执行时间,单位为毫秒。例如:
hrdb=> \timing on
Timing is on.
hrdb=> select count(*) from employee;
count
-------
25
(1 row)
Time: 23.220 ms
hrdb=> \timing
Timing is off.
不指定参数的\timing命令可以在 on 和 off 之间切换。
设置输出格式
\pset [ option [ value ] ]命令可以用于显示或者设置与查询结果输出相关的选项。例如:
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
以上命令返回了当前的选项设置。
我们以 null 选项为例,默认情况下 psql 的输出结果中无法区分空字符串和 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)
一些选项还提供了便捷的元命令,例如\x命令\pset expanded on|off命令都可以打开或者关闭扩展表格模式。例如:
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.
另一个常用的选项是 format,它可以用于设置不同的输出格式,例如 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
📝关于 \pset 命令相关的更多选项配置,可以参考 PostgreSQL 官方文档或者中文文档。
\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]命令可以将查询结果按照交叉报表的形式进行显示,colV 是垂直标题字段(默认第一个字段),colH 是水平标题字段(默认第二个字段),colD 是表格中的数据字段(默认第三个字段),sortcolH 是决定水平标题顺序的字段。例如:
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 |
关平 | 6800.00 |
赵氏 | | 6600.00
(10 rows)
执行脚本文件
\i filename命令用于读取文件并执行其中的命令。在操作系统当前目录中创建一个脚本文件 test.sql,输入以下语句:
select current_user;
1
然后在 psql 中输入以下命令:
hrdb-> \i test.sql
current_user
--------------
tony
(1 row)
如果 filename 是一个连字符(-),表示从标准输入读取内容,知道 EOF 或者 \q 命令结束。这种方式可以用于运行脚本文件时接收手动输入。
另外,\ir filename命令也可以用于运行脚本文件。两者不同之处在于 \ir 查找文件时使用相对路径;如果从一个脚本文件中读取其他文件,会以当前文件目录作为查找目录,而不是当前工作目录。
显示详细错误信息
\errverbose命令可以用于显示最近的服务器错误信息。例如:
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
查看数据库对象信息
psql 提供了大量用于查看数据库对象信息的元命令,绝大多数以 \d 开头。其中很多命令支持额外的 S 后缀,用于显示系统对象,否则只显示当前用户拥有访问权限的对象;或者额外的 + 后缀,用于显示额外的信息。
查看角色和用户
\du[S+] [ pattern ]或者\dg[S+] [ pattern ]命令用于列出用户创建的角色、用户和组。例如:
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 选项,同时会显示系统创建的角色;如果指定了 + 选项,还会显示额外的描述信息;如果指定了 pattern,只有名称匹配指定模式的角色才会显示。
查看数据库
\l[+] [pattern]命令用于列出系统中的所有数据库。例如:
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)
如果指定 + 选项,还会显示额外的数据库大小、默认表空间和描述信息;如果指定了 pattern,只有名称匹配指定模式的数据库才会显示。
查看模式
\dn[S+] [ pattern ]命令用于列出当前数据库中的所有模式(schema)。例如:
hrdb=> \dn
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
如果指定了 S 选项,同时会显示系统模式;如果指定了 + 选项,还会显示额外的授权信息和描述;如果指定了 pattern,只有名称匹配指定模式的 schema 才会显示。
查看表空间
\db[+] [ pattern ]命令用于列出系统中的所有表空间。例如:
hrdb=> \db
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
如果指定了 + 选项,还会显示额外的选项、空间大小、授权信息和描述;如果指定了 pattern,只有名称匹配指定模式的表空间才会显示。
查看表
\dt[S+] [ pattern ]命令用于列出所有的数据表。例如:
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 选项,同时会显示系统表;如果指定了 + 选项,还会显示额外的大小和描述信息;如果指定了 pattern,只有名称匹配指定模式的表才会显示。
另外,\d[S+] [ pattern ]命令可以同时列出表、视图、物化视图、索引、序列以及外部表的信息,等价于\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 选项,同时会显示系统表上的索引;如果指定了 + 选项,还会显示额外的大小和描述信息;如果指定了 pattern,只有名称匹配指定模式的索引才会显示。
查看序列
\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 选项,同时会显示系统创建的序列;如果指定了 + 选项,还会显示额外的大小和描述信息;如果指定了 pattern,只有名称匹配指定模式的序列才会显示。
查看/编辑视图
\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 选项,同时会显示系统创建的视图;如果指定了 + 选项,还会显示额外的大小和描述信息;如果指定了 pattern,只有名称匹配指定模式的视图才会显示。
\sv[+] view_name命令用于显示视图的定义语句。例如:
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
如果指定了 + 选项,同时会显示行号(从 1 开始)。
\ev [ view_name [ line_number ] ]命令用于编辑视图的定义,类似于\e命令。例如:
hrdb=> \ev employees_it
1
在这里插入图片描述
编辑完成之后,定义语句将会保留在查询缓冲区中,可以输入 \g 运行或者 \r 取消。
如果指定了 line_number,编辑时自动定位到指定代码行;如果没有指定 view_name,相当于新建一个视图。
查看/编辑函数和过程
\df[anptwS+] [ pattern ]命令用于列出所有的函数,其中 a 表示聚合函数,n 表示普通函数、p 表示存储过程,t 表示触发器函数,w 表示窗口函数。例如:
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命令用于显示函数、存储过程等对象的定义。例如:
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$
如果指定了 + 选项,同时会显示主体代码的行号(从 1 开始)。
\ef [ function_description [ line_number ] ]命令用于编辑函数、存储过程等对象的定义。该命令的使用方法和\ev命令相同,可以参考上一小节。
高级功能
设置变量
psql 提供了类似于 Unix 中的命令行变量替换的功能。变量由 name/value 对组成,其中 value 可以是任意长度的字符串;name 由字母、数字和下划线组成,区分大小写。
变量由\set [ name [ value [ ... ] ] ]命令进行设置。例如:
hrdb=> \set myname 'tony'
使用变量时,需要在变量名前加上冒号(:)。例如:
hrdb=> \echo :myname
tony
没有参数的\set命令可以用于显示所有变量的值:
hrdb=> \set
AUTOCOMMIT = 'on'
COMP_KEYWORD_CASE = 'preserve-upper'
DBNAME = 'hrdb'
ECHO = 'none'
ECHO_HIDDEN = 'off'
ENCODING = 'UTF8'
ERROR = 'false'
...
以上命令返回的大写变量都是 psql 默认设置的特殊变量。
变量 PROMPT1(常规提示符)、PROMPT2(等待更多输入)以及 PROMPT3(等待终端输入行数据)可以用于设置 psql 的命令提示符。例如:
hrdb=> \set PROMPT1 '%n@%M %~%R%# '
tony@192.168.56.104 hrdb=>
其中,百分号代表了特殊的含义;%n 表示用户名,%M 表示服务器的主机名,%~ 表示数据库名,%R 表示 =,%# 表示 #(superuser)或者 >(普通用户)。更多的特殊符号可以参考官方文档或者中文文档。
\set name命令可以将变量 name 设置为空字符串。如果想要删除变量,可以使用\unset name命令。例如:
hrdb=> \unset myname
另外,\prompt [ text ] name命令可以用于提示用户输入一个变量值,text 是提示文字。例如:
hrdb=> \prompt 'Please choose Y or N:' mychoice
Please choose Y or N:Y
SQL 替换
基于 psql 变量可以实现一个重要的功能:SQL 替换。也就是将变量的内容替换到 SQL 语句中或者作为元命令的参数。例如:
hrdb=> \set tablename 't1'
hrdb=> select * from :tablename;
id
----
(2 rows)
hrdb=> select :'tablename' as val;
val
-----
t1
(1 row)
条件执行命令
\if expression、\elif expression、\else以及\endif命令可以用于条件判断,实现嵌套的条件语句。
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
执行操作系统命令
psql 支持使用\! [ command ]直接运行操作系统命令,而不需要退出当前连接。例如:
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
如果直接输入\!,将会切换到操作系统命令行环境,退出之后回到 psql 环境。
另外,\cd [ directory ]命令用于切换当前工作目录,默认为当前用户的 home 目录。例如:
hrdb-> \cd /tmp
hrdb-> \! pwd
/tmp
hrdb-> \cd
hrdb-> \! pwd
/home/tony
处理大对象
psql 支持从文件系统读取文件存储为 PostgreSQL 大对象的\lo_import filename [ comment ],以及从将大对象导出到文件中的\lo_export loid filename命令。例如:
hrdb-> \lo_import '/home/tony/pagila.png' 'this is pagila erd'
lo_import 155782
返回的数字 155782 是大对象的 id。使用\lo_list或者\dl命令可以查看所有的大对象:
hrdb-> \lo_list
Large objects
ID | Owner | Description
--------+-------+--------------------
155782 | tony | this is pagila erd
(1 row)
使用 \lo_export 命令将该对象导出到文件系统中:
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命令删除大对象。例如:
hrdb-> \lo_unlink 155782
lo_unlink 155782
hrdb-> \lo_list
Large objects
ID | Owner | Description
----+-------+-------------
(0 rows)