4.2节简单讲解了psql工具的使用方法,本节主要介绍常用快捷命令的使用方法。
使用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语句的语法,非常方便。
“\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 |
当客户端的字符编码与服务器不一致时,可能会出现乱码,可以使用“\encoding”命令指定客户端的字符编码,如使用“\encoding gbk;”命令设置客户端的字符编码为“gbk”;使用“\encoding utf8;”命令设置客户端的字符编码为“utf8”。
“\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)班
使用“\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”的功能类似。
命令“\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”命令。
编辑命令“\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).
“\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”命令输出由“=”组成的分隔线。
更多其他的命令可以用“\?”命令来显示,示例如下:
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--