购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.3 psql的常用命令

4.2节简单讲解了psql工具的使用方法,本节主要介绍常用快捷命令的使用方法。

4.3.1 “\h”命令

使用psql工具需要记住的第一个命令是“\h”,该命令用于查询SQL语句的语法,如我们不知道如何用SQL语句创建用户,就可以执行“\h create user”命令来查询:


postgres=# \h create user
Command:     CREATE USER
Description: define a new database role
Syntax:
CREATE USER name [ [ WITH ] option [ ... ] ]
where option can be:
    SUPERUSER | NOSUPERUSER
  | CREATEDB | NOCREATEDB
  | CREATEROLE | NOCREATEROLE
  | INHERIT | NOINHERIT
  | LOGIN | NOLOGIN
  | REPLICATION | NOREPLICATION
  | BYPASSRLS | NOBYPASSRLS
  | CONNECTION LIMIT connlimit
  | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
  | VALID UNTIL 'timestamp'
  | IN ROLE role_name [, ...]
  | IN GROUP role_name [, ...]
  | ROLE role_name [, ...]
  | ADMIN role_name [, ...]
  | USER role_name [, ...]
  | SYSID uid
URL: https://www.postgresql.org/docs/12/sql-createuser.html

使用“\h”命令可以查看各种SQL语句的语法,非常方便。

4.3.2 “\d”命令

“\d”命令的格式如下:


\d [ pattern ]
\d [ pattern ]+

该命令将显示每个匹配“pattern”(表、视图、索引、序列)的信息,包括对象中所有的列、各列的数据类型、表空间(如果不是默认的)和所有特殊属性(诸如“NOT NULL”或默认值等)等。唯一约束相关的索引、规则、约束、触发器也同样会显示出来。如果关系是一个视图,还会显示视图的定义(“匹配模式”将在下面定义)。下面来看看该命令的具体用法。

1)如果“\d”命令后什么都不带,将列出当前数据库中的所有表,示例如下:


osdba=# \d
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | t    | table | osdba
 public | t2   | table | osdba
 public | x1   | table | osdba
 public | x2   | table | osdba
(4 rows)

2)“\d”命令后面跟一个表名,表示显示这个表的结构定义,示例如下:


osdba=# \d t
               Table "public.t"
 Column |          Type           | Modifiers 
--------+-------------------------+-----------
 id     | integer                 | not null
 name   | character varying(4000) | 
Indexes:
    "t_pkey" PRIMARY KEY, btree (id)

3)“\d”命令也可以用于显示索引信息,示例如下:


osdba=# \d t_pkey
    Index "public.t_pkey"
 Column |  Type   | Definition 
--------+---------+------------
 id     | integer | id
primary key, btree, for table "public.t"

4)“\d”命令后面的表名或索引名中也可以使用通配符,如“*”或“?”等,示例如下:


osdba=# \d x?
             Table "public.x1"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | not null
 name   | character varying(20) | 
Indexes:
    "x1_pkey" PRIMARY KEY, btree (id)

             Table "public.x2"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | not null
 name   | character varying(20) | 
Indexes:
    "x2_pkey" PRIMARY KEY, btree (id)
osdba=# \d t*
               Table "public.t"
 Column |          Type           | Modifiers 
--------+-------------------------+-----------
 id     | integer                 | not null
 name   | character varying(4000) | 
Indexes:
    "t_pkey" PRIMARY KEY, btree (id)

      Table "public.t2"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | not null
 id2    | integer | 
 id3    | integer | 
Indexes:
    "t2_pkey" PRIMARY KEY, btree (id)

    Index "public.t2_pkey"
 Column |  Type   | Definition 
--------+---------+------------
 id     | integer | id
primary key, btree, for table "public.t2"

     Index "public.t_pkey"
 Column |  Type   | Definition 
--------+---------+------------
 id     | integer | id
primary key, btree, for table "public.t"

5)使用“\d+”命令可以显示比“\d”命令的执行结果更详细的信息,除了前面介绍的信息,还会显示所有与表的列关联的注释,以及表中出现的OID。示例如下:


osdba=# \d+ t
                           Table "public.t"
 Column |          Type           | Modifiers | Storage  | Description 
--------+-------------------------+-----------+----------+-------------
 id     | integer                 | not null  | plain    | 
 name   | character varying(4000) |           | extended | 
Indexes:
    "t_pkey" PRIMARY KEY, btree (id)
Has OIDs: no

6)匹配不同对象类型的“\d”命令如下:

·如果只想显示匹配的表,可以使用“\dt”命令。

·如果只想显示索引,可以使用“\di”命令。

·如果只想显示序列,可以使用“\ds”命令。

·如果只想显示视图,可以使用“\dv”命令。

·如果想显示函数,可以使用“\df”命令。

7)如果想显示执行SQL语句的时间,可以用“\timing”命令,示例如下:


osdba=# \timing on
Timing is on.
osdba=# select count(*) from t;
  count  
--------
  100000
(1 row)

Time: 3486.471 ms

8)要想列出所有的schema,可以使用“\dn”命令,示例如下:


osdba=# \dn
      List of schemas
        Name        | Owner 
--------------------+-------
 information_schema | osdba
 pg_catalog         | osdba
 pg_toast           | osdba
 pg_toast_temp_1    | osdba
 public             | osdba
(5 rows)

9)要想显示所有的表空间,可以用“\db”命令,示例如下:


osdba=# \db
      List of tablespaces
    Name    | Owner | Location 
------------+-------+----------
 pg_default | osdba | 
 pg_global  | osdba | 
(2 rows)

实际上,PostgreSQL中的表空间对应一个目录,放在这个表空间中的表,就是把表的数据文件放到该表空间下。

10)要想列出数据库中的所有角色或用户,可以使用“\du”或“\dg”命令,示例如下:


osdba=# \dg
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 osdba     | Superuser, Create role, Create DB | {}

osdba=# \du
                       List of roles
 Role name |            Attributes             | Member of 
-----------+-----------------------------------+-----------
 osdba     | Superuser, Create role, Create DB | {}

“\du”和“\dg”命令等价。原因是,在PostgreSQL数据库中,用户和角色是不分的。

11)“\dp”或“\z”命令用于显示表的权限分配情况,示例如下:


osdba=# \dp t
                           Access privileges
 Schema | Name | Type  |  Access privileges  | Column access privileges 
--------+------+-------+---------------------+--------------------------
 public | t    | table | osdba=arwdDxt/osdba+| 
        |      |       | usertest=r/osdba    |

4.3.3 指定客户端字符集的命令

当客户端的字符编码与服务器不一致时,可能会出现乱码,可以使用“\encoding”命令指定客户端的字符编码,如使用“\encoding gbk;”命令设置客户端的字符编码为“gbk”;使用“\encoding utf8;”命令设置客户端的字符编码为“utf8”。

4.3.4 格式化输出的\pset命令

“\pset”命令的语法如下:


\pset [option [value] ]

根据命令后面“option”和“value”的不同可以设置很多种不同的输出格式,这里只介绍一些常用的用法。

默认情况下,psql中执行SQL语句后输出的内容是只有内边框的表格:


osdba=# select * from class;
 no | class_name
----+------------
  1 | 初二(1)班
  2 | 初二(2)班
  3 | 初二(3)班
  4 | 初二(4)班
(4 rows)

如果要像MySQL中一样输出带有内外边框的表格内容,可以用命令“\pset boder 2”来实现,示例如下:


osdba=# \pset border 2
Border style is 2.
osdba=# select * from class;
+----+------------+
| no | class_name |
+----+------------+
|  1 | 初二(1)班   |
|  2 | 初二(2)班   |
|  3 | 初二(3)班   |
|  4 | 初二(4)班   |
+----+------------+
(4 rows)

当然也可以用“\pset boder 0”命令输出不带任何边框的内容,示例如下:


osdba=# \pset border 0
Border style is 0.
osdba=# select * from class;
no class_name
-- ----------
 1 初二(1)班
 2 初二(2)班
 3 初二(3)班
 4 初二(4)班
(4 rows)

综上所述,“\pset”命令设置边框的用法如下。

·\pset border 0:表示输出内容无边框。

·\pset border 1:表示输出内容只有内边框。

·\pset border 2:表示输出内容内外都有边框。

psql中默认的输出格式是“\pset border 1”。

不管输出的内容加不加边框,内容本身都是对齐的,是为增强数据的可读性而专门格式化过的,而有时我们需要把命令的结果输出为其他程序可以读取的文件,如以逗号分隔或以Tab分隔的文本文件,这时就需要用到“\pset format unaligned”命令了,示例如下:


osdba=# \pset format unaligned
Output format is unaligned.
osdba=# select * from class;
no|class_name
1|初二(1)班
2|初二(2)班
3|初二(3)班
4|初二(4)班
(4 rows)

默认分隔符是“|”,我们可以用命令“\pset fieldsep”来设置分隔符,如改成Tab分隔符的方法如下:


osdba=# \pset fieldsep '\t'
Field separator is "    ".
osdba=# select * from class;
no               class_name
1                初二(1)班
2                初二(2)班
3                初二(3)班
4                初二(4)班
(4 rows)

实际使用时,我们需要把SQL命令输出到一个文件中,而不是屏幕上,这时可以用“\o”命令指定一个文件,然后再执行上面的SQL命令,执行结果就会输出到这个文件中,示例如下:


osdba=# \pset format unaligned
Output format is unaligned.
osdba=# \o 111.txt
osdba=# select * from class;
osdba=#

这时,我们得到的文件“111.txt”的内容如下:


osdba-mac:~ osdba$ cat 111.txt
no|class_name
1|初二(1)班
2|初二(2)班
3|初二(3)班
4|初二(4)班
(4 rows)

我们看到“(4 rows)”也输入到文件111.txt中了,而且很多时候我们也不需要列头数据如“no|class_name”,这时就可以用“\t”命令来删除这些信息:


osdba=# \pset format unaligned
Output format is unaligned.
osdba=# \t
Tuples only is on.
osdba=# \o 111.txt
osdba=# select * from class;

得到的文件“111.txt”的内容如下:


osdba-mac:~ osdba$ cat 111.txt
1|初二(1)班
2|初二(2)班
3|初二(3)班
4|初二(4)班

4.3.5 “\x”命令

使用“\x”命令可以把按行展示的数据变成按列展示,示例如下:


osdba=# \x
Expanded display (expanded) is on.
osdba=# select * from pg_stat_activity;
-[ RECORD 1 ] ----+--------------------------------
 datid            | 16384                           
 datname          | osdba                           
 pid              | 21174                           
 usesysid         | 10                              
 usename          | osdba                           
 application_name | psql                            
 client_addr      |                                 
 client_hostname  |                                 
 client_port      | -1                              
 backend_start    | 2014-07-27 12:03:30.383937+08   
 xact_start       | 2014-07-27 12:03:40.425898+08   
 query_start      | 2014-07-27 12:03:40.425898+08   
 state_change     | 2014-07-27 12:03:40.425901+08   
 waiting          | f                               
 state            | active                          
 backend_xid      |                                 
 backend_xmin     | 732                             
 query            | select * from pg_stat_activity; 
-[ RECORD 2 ] ----+--------------------------------
 datid            | 16390                           
 datname          | testdb                          
 pid              | 5742                            
 usesysid         | 10                              
 usename          | osdba                           
 application_name | psql                            
 client_addr      |                                 
 client_hostname  |                                 
 client_port      | -1                              
 backend_start    | 2014-07-27 10:16:39.966001+08   
 xact_start       |                                 
 query_start      | 2014-07-27 10:57:28.940843+08   
 state_change     | 2014-07-27 10:57:28.940929+08   
 waiting          | f                               
 state            | idle                            
 backend_xid      |                                 
 backend_xmin     |                                 
 query            | show log_directory ;

如果数据行太长出现折行,就可以使用这里介绍的“\x”命令将其拆分为多行显示。这与MySQL中命令后加“\G”的功能类似。

4.3.6 执行存储在外部文件中的SQL命令

命令“\i <文件名>”用于执行存储在外部文件中的SQL语句或命令。示例如下:


osdba=# \x
Expanded display (expanded) is on.
osdba=# \i getrunsql
-[ RECORD 1 ]-------------------------------------------------------------------
 pid         | 21240                                                              
 usename     | osdba                                                              
 query_start | 2014-07-27 12:09:25.094913+08                                      
 waiting     | f                                                                  
 query       | select pid, usename, query_start, waiting, query from pg_stat_acti.
             |.vity;                                                              
-[ RECORD 2 ]-------------------------------------------------------------------
 pid         | 5742                                                               
 usename     | osdba                                                              
 query_start | 2014-07-27 10:57:28.940843+08                                      
 waiting     | f                                                                  
 query       | show log_directory ;

当然也可以在psql命令行中加上“-f <filename>”来执行SQL脚本文件中的命令,示例如下:


osdba@osdba-work:~$ psql -x -f getrunsql
Output format (format) is wrapped.
Target width (columns) is 80.
-[ RECORD 1 ]-------------------------------------------------------------------
 pid         | 21255                                                              
 usename     | osdba                                                              
 query_start | 2014-07-27 12:11:15.531285+08                                      
 waiting     | f                                                                  
 query       | select pid, usename, query_start, waiting, query from pg_stat_acti.
             |.vity;                                                              
-[ RECORD 2 ]-------------------------------------------------------------------
 pid         | 5742                                                               
 usename     | osdba                                                              
 query_start | 2014-07-27 10:57:28.940843+08                                      
 waiting     | f                                                                  
 query       | show log_directory ;

其中命令行参数“-x”的作用相当于在psql交互模式下运行“\x”命令。

4.3.7 编辑命令

编辑命令“\e”可以用于编辑文件,也可用于编辑系统中已存在的函数或视图定义,下面来举例说明此命令的使用方法。

输入“\e”命令后会调用一个编辑器,在Linux下通常是Vi,当“\e”命令不带任何参数时则是生成一个临时文件,前面执行的最后一条命令会出现在临时文件中,当编辑完成后退出编辑器并回到psql中时会立即执行该命令:


osdba=# \e ←-这里输入“\e”后,会进入Vi编辑器,退出Vi编辑器后就会执行Vi中编辑的内容,然后下面就显示出执行的内容

 no | class_name
----+------------
  1 | 初二(1)班
(1 row)

在上面的操作中,我们在Vi中输入的内容为“select * from class where no=1;”,当退出Vi编辑器后,就会执行SQL语句“select * from class where no=1;”,这条SQL语句的内容在psql中是看不到的。

“\e”后面也可以指定一个文件名,但要求这个文件必须存在,否则会报错:


osdba=# \e 1.sql
1.sql: No such file or directory

可以用“\ef”命令编辑一个函数的定义,如果“\ef”后面不跟任何参数,则会出现一个编辑函数的模板:


CREATE FUNCTION ( )
  RETURNS
  LANGUAGE
  -- common options:  IMMUTABLE  STABLE  STRICT  SECURITY DEFINER
AS $function$
$function$

如果“\ef”后面跟一个函数名,则函数定义的内容会出现在Vi编辑器中,当编辑完成后按“wq:”保存并退出,再输入“;”就会执行所创建函数的SQL语句。

同样输入“\ev”且后面不跟任何参数时,在Vi中会出现一个创建视图的模板:


CREATE VIEW  AS
  SELECT
    -- something...

然后用户就可以在Vi中编辑这个创建视图的SQL语句,编辑完成后,保存并退出,再输入分号“;”,就会执行所创建视图的SQL语句。

也可以编辑已存在的视图的定义,只需在“\ev”命令后面跟视图的名称即可。

“\ef”和“\ev”命令可以用于查看函数或视图的定义,当然用户需要注意,退出Vi后,要在psql中输入“\reset”来清除psql的命令缓冲区,防止误执行创建函数和视图的SQL语句,示例如下:


postgres=# \ev vm_class ←-在这里进入Vi后,在Vi中用":q"退出
No changes
postgres-# \reset ←-在这里不要忘了输入"\reset"命令清除psql缓冲区
Query buffer reset (cleared).

4.3.8 输出信息的“\echo”命令

“\echo”命令用于输出一行信息,示例如下:


osdba=# \echo hello word
hello word

此命令通常用于在使用.sql脚本的文件中输出提示信息。

比如,某文件“a.sql”有如下内容:


\echo =========================================
select * from x1;
\echo =========================================

运行a.sql脚本:


osdba=# \i a.sql
=========================================
 id |  name  
----+--------
  1 | aaaaaa
  2 | bbbbbb
  3 | cccccc
(3 rows)

=========================================
osdba=#

上面使用“\echo”命令输出由“=”组成的分隔线。

4.3.9 其他命令

更多其他的命令可以用“\?”命令来显示,示例如下: 5Pan1dxTIO1ZoGWXMX3yaJfQ/8XdwKAZj1ePjn6tR11uz4UmbtOtwgrBtAXKDUCT


osdba=#  \?
General
  \copyright             show PostgreSQL usage and distribution terms
  \g [FILE] or ;         execute query (and send results to file or |pipe)
  \h [NAME]              help on syntax of SQL commands, * for all commands
  \q                     quit psql

Query Buffer
  \e [FILE]              edit the query buffer (or file) with external editor
  \ef [FUNCNAME]         edit function definition with external editor
  \p                     show the contents of the query buffer
  \r                     reset (clear) the query buffer
  \s [FILE]              display history or save it to file
  \w FILE                write query buffer to file

Input/Output
  \copy ...              perform SQL COPY with data stream to the client host
  \echo [STRING]         write string to standard output
  \i FILE                execute commands from file
  \o [FILE]              send all query results to file or |pipe
  \qecho [STRING]        write string to query output stream (see \o)

Informational
  (options: S = show system objects, + = additional detail)
  \d[S+]                 list tables, views, and sequences
  \d[S+]  NAME           describe table, view, sequence, or index
  \da[S]  [PATTERN]      list aggregates
  \db[+]  [PATTERN]      list tablespaces
  \dc[S]  [PATTERN]      list conversions
  \dC     [PATTERN]      list casts
  \dd[S]  [PATTERN]      show comments on objects
  \ddp    [PATTERN]      list default privileges
  \dD[S]  [PATTERN]      list domains
  \des[+] [PATTERN]      list foreign servers
  \deu[+] [PATTERN]      list user mappings
  \dew[+] [PATTERN]      list foreign-data wrappers
  \df[antw][S+] [PATRN]  list [only agg/normal/trigger/window] functions
  \dF[+]  [PATTERN]      list text search configurations
  \dFd[+] [PATTERN]      list text search dictionaries
  \dFp[+] [PATTERN]      list text search parsers
--More--

点击中间区域
呼出菜单
上一章
目录
下一章
×