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)