概述
psql是PostgreSQL的命令行客户端工具,比起Oracle的sqlplus,psql天生可用上下键翻命令,也可以使用Tab键补全。
本地用postgres用户直接输入“psql”即可进入命令交互输入模式。
进入psql的命令交互输入模式就可以输入psql工具特有的快捷命令, 这些快捷命令都是以斜杠“\”开头的。
如使用“\l”命令查看有哪些数据库,使用“\c testdb”命令连接到testdb数据库上:
psql
\l
\c testdb
注:安装PostgreSQL数据库时, 会创建一个与初始化数据库时的操作系统用户同名的数据库用户, 这个用户是数据库的超级用户, 在此OS用户下登录数据库时, 因为执行的是操作系统认证, 所以是不需要用户名和密码的, 用户也可以通过修改pg_hba.conf文件来要求用户输入密码。
退出客户端:
\q
psql也支持直接使用命令行参数查询信息和执行SQL, 这种非交互模式与使用一般的Linux命令没有区别, 如使用如下命令可以查看数据库:
psql -l
psql常见连库语句(指定主机、端口、库名、用户):
psql -h 192.168.56.11 -p 5432 testdb postgres
这些连接参数也可通过环境变量指定,如:
export PGDATABASE=testdb
export PGHOST=192.168.56.11
export PGPORT=5432
export PGUSER=postgres
然后运行psql, 其运行结果与“psql -h 192.168.56.11 -p 5432 testdb postgres”的运行结果
相同。
详请参考官方手册“Reference”→“PostgreSQL Client Applications”→“psql”的内容。
常用命令
1. 用\h查询SQL语句
该命令用于查询SQL语句的语法, 如我们不知道如何用SQL语句创建用户, 就可以执行“\h create user”命令来查询:
\h create user
2. 用\d查看对象信息
格式如下:
\d [ pattern ]
\d [ pattern ]+
该命令将显示每个匹配“pattern”(表、 视图、 索引、 序列) 的信息, 包括对象中所有的列、 各列的数据类型、 表空间(如果不是默认的) 和所有特殊属性(诸如“NOT NULL”或默认值等)等。
唯一约束相关的索引、 规则、 约束、 触发器也同样会显示出来。如果关系是一个视图, 还会显示视图的定义(“匹配模式”将在下面定义) 。
如果“\d”命令后什么都不带, 将列出当前数据库中的所有表;“\d”命令后面跟一个表名, 表示显示这个表的结构定义:
\d t
结果为:
Table "public.t"
Column | Type | Modifiers
--------+-------------------------+-----------
id | integer | not null
name | character varying(4000) |
Indexes:
"t_pkey" PRIMARY KEY, btree (id)
“\d”命令也可以用于显示索引信息, 示例如下:
\d t_pkey
结果为:
Index "public.t_pkey"
Column | Type | Definition
--------+---------+------------
id | integer | id
primary key, btree, for table "public.t"
“\d”命令后面的表名或索引名中也可以使用通配符, 如“*”或“?”等:
\d x?
使用“\d+”命令可以显示比“\d”命令的执行结果更详细的信息:
\d+ t
列出所有的schema:
\dn
显示所有的表空间:
\db
PostgreSQL中的表空间对应一个目录, 放在这个表空间中的表, 就是把表的
数据文件放到该表空间下。
只显示匹配的表
\dt
只显示索引
\di
只显示序列
\ds
只显示视图
\dv
只显示函数
\df
列出数据库中的所有角色或用户
\dg
\du
在PostgreSQL数据库中, 用户和角色是不分的,因此“\du”和“\dg”命令等价。
显示表的权限分配情况:
\dp t
如果想显示执行SQL语句的时间, 可以用“\timing”命令:
\timing on
select count(*) from t;
3. 指定客户端字符集
当客户端的字符编码与服务器不一致时, 可能会出现乱码。
可以使用“\encoding”命令指定客户端的字符编码。
设置客户端的字符编码为“gbk”:
\encoding gbk;
设置客户端的字符编码为“utf8”:
\encoding utf8;
4. 格式化输出
格式化输出的\pset命令语法如下:
\pset [option [value] ]
根据命令后面“option”和“value”的不同可以设置很多种不同的输出格式, 这里只介绍一些常用的用法。
默认情况下, psql中执行SQL语句后输出的内容是只有内边框的表格(\pset boder 1),
如果要像MySQL中一样输出带有内外边框的表格内容, 可以用如下命令实现:
\pset boder 2
select * from t1;
输出不带任何边框的内容:
\pset boder 0
select * from t1;
如需要将结果输出为其他程序可以读取的文件, 如以逗号分隔或以Tab分隔的文本文件, 这时就需要用到“\pset format unaligned”命令了,默认分隔符是“|”:
\pset format unaligned
select * from t1;
改成Tab分隔符:
\pset fieldsep '\t'
select * from t1;
将结果输出到一个文件中:
\pset format unaligned
\t
\o test1.txt
select * from t1;
其中\t的作用是去除表头和结尾的行数统计。
5. 使用\x转为按列显示
使用“\x”命令可以把按行展示的数据变成按列展示:
\x
select * from pg_stat_activity;
如果数据行太长出现折行, 就可以使用这里介绍的“\x”命令将其拆分为多行显示。 这与MySQL中命令后加“\G”的功能类似。
6. 执行存储在外部文件中的SQL
命令“\i <文件名>”用于执行存储在外部文件中的SQL语句或命令:
\x
\i test.sql
或在OS层命令行加-f参数来执行SQL脚本文件中的命令:
psql -x -f test.sql
其中命令行参数“-x”的作用相当于在psql交互模式下运行“\x”命令。
7. 编辑命令
输入“\e”命令后会调用一个编辑器, 在Linux下通常是Vi, 当“\e”命令不带任何参数时则是生成一个临时文件, 前面执行的最后一条命令会出现在临时文件中, 当编辑完成后退出编辑器并回到psql中时会立即执行该命令,且这些语句的内容在psql中是看不到的。
“\e”后面也可以指定一个文件名, 但要求这个文件必须存在, 否则会报错
\e test.sql
可以用“\ef”命令编辑一个函数的定义, 如果“\ef”后面不跟任何参数, 则会出现一个编辑函数的模板。如果“\ef”后面跟一个函数名, 则函数定义的内容会出现在Vi编辑器中, 当编辑完成后按“wq:”保存并退出, 再输入“;”就会执行所创建函数的SQL语句。
同样输入“\ev”且后面不跟任何参数时, 在Vi中会出现一个创建视图的模板,然后用户就可以在Vi中编辑这个创建视图的SQL语句, 编辑完成后, 保存并退出, 再输入分号“;”, 就会执行所创建视图的SQL语句。也可以编辑已存在的视图的定义, 只需在“\ev”命令后面跟视图的名称即可。
“\ef”和“\ev”命令可以用于查看函数或视图的定义, 当然需要注意, 退出Vi后,要在psql中输入“\reset”来清除psql的命令缓冲区,而不要输入输入“;”, 防止误执行创建函数和视图的SQL语句:
\ev vm_class
\reset
8. 使用\echo打印信息
此命令通常用于在使用.sql脚本的文件中输出提示信息,比如组成分隔线:
\echo =========================================
select * from t1;
\echo =========================================
9.导出csv
如果是中文可以把UTF8改为GBK:
show client_encoding;
set client_encoding='GBK';
然后执行导出,例如:
\COPY (select a.username ,m.source_type ,m.type,m.source_type ,b."name" ,b.created_at, b.updated_at from members m inner join users a on a.id = m.user_id inner join namespaces b on m.source_id = b.id where m.source_type = 'Namespace' and m.access_level = 50 union all select a.username ,m.source_type ,m.type,m.source_type ,p."name",p.created_at, p.updated_at from members m inner join users a on a.id = m.user_id inner join projects p on m.source_id = p.id where m.source_type = 'Project' and m.access_level = 50) TO '/var/opt/gitlab/postgresql/20241216.csv' WITH (FORMAT CSV, HEADER);
直接导出的csv可能中文仍显示乱码,可以新建一个excel文件然后通过数据-导入文本来正常显示。
10. 其他命令
其他的命令可以用“?”命令来显示:
\?
在此不一一列举。
使用技巧
1. 历史命令与补全功能
可以使用上下方向键把以前使用过的命令或SQL语句调出来, 连续单击两次Tab键表示把命令补全或给出输入提示。
2. 自动提交
需要注意的是, 在psql中事务是自动提交的, 如果不想让事务自动提交, 方法有两种。
- 方法一: 运行“begin;”命令, 然后执行DML语句, 最后再执行commit或rollback语句。
- 方法二: 直接使用psql中的命令关闭自动提交功能:
\set AUTOCOMMIT off
注:这个命令中的“AUTOCOMMIT”是大写的, 不能使用小写, 如果使用小写, 虽不会报错, 但会导致关闭自动提交的操作无效。
3. 获取psql中快捷命令执行的实际SQL
在启动psql的命令行中加上“-E”参数, 就可以把psql中各种以“\”开头的命令执行的实际SQL语句打印出来:
psql -E postgres
比如我们再执行快捷键就会显示QUERY实际内容。
如果要在已运行的psql中显示了某个命令实际执行的SQL语句后又想关闭此功能,则:
\set ECHO_HIDDEN off
如果要打开:
\set ECHO_HIDDEN on




