Skip to content

1. PSQL概述

psql是PostgreSQL的一个命令行交互式的客户端,它可以通过内置的元命令或者sql语句查看和管理数据库对象。它是一个纯字符界面,能够通过tab键自动补全命令。

2. PSQL使用

bash

使用方法:
  psql [选项]... [数据库名称 [用户名称]]
通用选项:
  -c,--command=命令        执行单一命令(SQL或内部指令)然后结束
  -d, --dbname=DBNAME      指定要连接的数据库 (默认:"postgres")
  -f, --file=文件名        从文件中执行命令然后退出
  -l, --list               列出所有可用的数据库,然后退出
  -v, --set=, --variable=NAME=VALUE
                           设置psql变量NAME为VALUE
                           (例如,-v ON_ERROR_STOP=1)
  -V, --version            输出版本信息, 然后退出
  -X, --no-psqlrc          不读取启动文档(~/.psqlrc)
  -1 ("one"), --single-transaction
                           作为一个单一事务来执行命令文件(如果是非交互型的)
  -?, --help[=options]     显示此帮助,然后退出
      --help=commands      列出反斜线命令,然后退出
      --help=variables     列出特殊变量,然后退出

输入和输出选项:
  -a, --echo-all           显示所有来自于脚本的输入
  -b, --echo-errors        回显失败的命令
  -e, --echo-queries       显示发送给服务器的命令
  -E, --echo-hidden        显示内部命令产生的查询
  -L, --log-file=文件名    将会话日志写入文件
  -n, --no-readline        禁用增强命令行编辑功能(readline)
  -o, --output=FILENAME    将查询结果写入文件( |管道)
  -q, --quiet              以沉默模式运行(不显示消息,只有查询结果)
  -s, --single-step        单步模式 (确认每个查询)
  -S, --single-line        单行模式 (一行就是一条 SQL 命令)

输出格式选项 :
  -A, --no-align           使用非对齐表格输出模式
  -F, --field-separator=STRING
                           为字段设置分隔符,用于不整齐的输出(默认:"|")
  -H, --html               HTML 表格输出模式
  -P, --pset=变量[=参数]   设置将变量打印到参数的选项(查阅 \pset 命令)
  -R, --record-separator=STRING
                           为不整齐的输出设置字录的分隔符(默认:换行符号)
  -t, --tuples-only        只打印记录i
  -T, --table-attr=文本    设定 HTML 表格标记属性(例如,宽度,边界)
  -x, --expanded           打开扩展表格输出
  -z, --field-separator-zero
                           为不整齐的输出设置字段分隔符为字节0
  -0, --record-separator-zero
                           为不整齐的输出设置记录分隔符为字节0

联接选项:
  -h, --host=主机名        数据库服务器主机或socket目录(默认:"本地接口")
  -p, --port=端口          数据库服务器的端口(默认:"5432")
  -U, --username=用户名    指定数据库用户名(默认:"postgres")
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)

更多信息,请在psql中输入"\?"(用于内部指令)或者 "\help"(用于SQL命令),

使用方法:
  psql [选项]... [数据库名称 [用户名称]]
通用选项:
  -c,--command=命令        执行单一命令(SQL或内部指令)然后结束
  -d, --dbname=DBNAME      指定要连接的数据库 (默认:"postgres")
  -f, --file=文件名        从文件中执行命令然后退出
  -l, --list               列出所有可用的数据库,然后退出
  -v, --set=, --variable=NAME=VALUE
                           设置psql变量NAME为VALUE
                           (例如,-v ON_ERROR_STOP=1)
  -V, --version            输出版本信息, 然后退出
  -X, --no-psqlrc          不读取启动文档(~/.psqlrc)
  -1 ("one"), --single-transaction
                           作为一个单一事务来执行命令文件(如果是非交互型的)
  -?, --help[=options]     显示此帮助,然后退出
      --help=commands      列出反斜线命令,然后退出
      --help=variables     列出特殊变量,然后退出

输入和输出选项:
  -a, --echo-all           显示所有来自于脚本的输入
  -b, --echo-errors        回显失败的命令
  -e, --echo-queries       显示发送给服务器的命令
  -E, --echo-hidden        显示内部命令产生的查询
  -L, --log-file=文件名    将会话日志写入文件
  -n, --no-readline        禁用增强命令行编辑功能(readline)
  -o, --output=FILENAME    将查询结果写入文件( |管道)
  -q, --quiet              以沉默模式运行(不显示消息,只有查询结果)
  -s, --single-step        单步模式 (确认每个查询)
  -S, --single-line        单行模式 (一行就是一条 SQL 命令)

输出格式选项 :
  -A, --no-align           使用非对齐表格输出模式
  -F, --field-separator=STRING
                           为字段设置分隔符,用于不整齐的输出(默认:"|")
  -H, --html               HTML 表格输出模式
  -P, --pset=变量[=参数]   设置将变量打印到参数的选项(查阅 \pset 命令)
  -R, --record-separator=STRING
                           为不整齐的输出设置字录的分隔符(默认:换行符号)
  -t, --tuples-only        只打印记录i
  -T, --table-attr=文本    设定 HTML 表格标记属性(例如,宽度,边界)
  -x, --expanded           打开扩展表格输出
  -z, --field-separator-zero
                           为不整齐的输出设置字段分隔符为字节0
  -0, --record-separator-zero
                           为不整齐的输出设置记录分隔符为字节0

联接选项:
  -h, --host=主机名        数据库服务器主机或socket目录(默认:"本地接口")
  -p, --port=端口          数据库服务器的端口(默认:"5432")
  -U, --username=用户名    指定数据库用户名(默认:"postgres")
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)

更多信息,请在psql中输入"\?"(用于内部指令)或者 "\help"(用于SQL命令),

https://www.postgresql.org/docs/current/static/app-psql.html

3. PSQL元命令

  • 语法
bash

## 查看SQL元命令
postgres=# \?
一般性
  \copyright              显示PostgreSQL的使用和发行许可条款
  \crosstabview [COLUMNS] 执行查询并且以交叉表显示结果
  \errverbose            以最冗长的形式显示最近的错误消息
  \g [文件] or;          执行查询 (并把结果写入文件或 |管道)
  \gdesc                 描述查询结果,而不执行它
  \gexec                 执行策略,然后执行其结果中的每个值
  \gset [PREFIX]         执行查询并把结果存到psql变量中
  \gx [FILE]             就像\g,但强制扩展输出模式
  \q             退出 psql
  \watch [SEC]          每隔SEC秒执行一次查询

帮助
  \? [commands]          显示反斜线命令的帮助
  \? options             显示 psql 命令行选项的帮助
  \? variables           显示特殊变量的帮助
  \h [名称]          SQL命令语法上的说明,用*显示全部命令的语法说明

查询缓存区
  \e [FILE] [LINE]        使用外部编辑器编辑查询缓存区(或文件)
  \ef [FUNCNAME [LINE]]   使用外部编辑器编辑函数定义
  \ev [VIEWNAME [LINE]]  用外部编辑器编辑视图定义
  \p                    显示查询缓存区的内容
  \r                     重置(清除)查询缓存区
  \s [文件]              显示历史记录或将历史记录保存在文件中
  \w 文件                将查询缓存区的内容写入文件

输入/输出
  \copy ...              执行 SQL COPY,将数据流发送到客户端主机
  \echo [字符串]         将字符串写到标准输出
  \i 文件                从文件中执行命令
  \ir FILE                \i类似, 但是相对于当前脚本的位置
  \o [文件]              将全部查询结果写入文件或 |管道
  \qecho [字符串]        将字符串写到查询输出串流(参考 \o)

条件
  \if EXPR               开始条件块
  \elif EXPR             当前条件块内的备选方案
  \else                  当前条件块内的最终备选方案
  \endif                 条件块的结尾

资讯性
  (选项: S = 显示系统对象, + = 其余的详细信息)
  \d[S+]                 列出表,视图和序列
  \d[S+]  名称           描述表,视图,序列,或索引
  \da[S]  [模式]         列出聚合函数
  \dA[+]  [模式]         列出访问方法
  \db[+]  [模式]         列出表空间
  \dc[S+] [模式]         列表转换
  \dC[+]  [模式]         列出类型强制转换
  \dd[S]  [模式]         显示没有在别处显示的对象描述
  \dD[S+] [模式]         列出共同值域
  \ddp    [模式]         列出默认权限
  \dE[S+] [模式]         列出引用表
  \det[+] [模式]         列出引用表
  \des[+] [模式]         列出外部服务器
  \deu[+] [模式]         列出用户映射
 \dew[+] [模式]          列出外部数据封装器
  \df[anptw][S+] [PATRN] 列出[只包括 聚合/常规/程序/触发器/窗口]函数 
  \dF[+]  [模式]         列出文本搜索配置
  \dFd[+] [模式]         列出文本搜索字典
 \dFp[+] [模式]          列出文本搜索解析器
  \dFt[+] [模式]         列出文本搜索模版
  \dg[S+] [模式]         列出角色
 \di[S+] [模式]          列出索引
  \dl                    列出大对象, 功能与\lo_list相同
  \dL[S+] [模式]         列出所有过程语言
  \dm[S+] [模式]         列出所有物化视图
  \dn[S+] [模式]         列出所有模式
  \do[S+] [PATTERN]      list operators
  \dO[S+] [模式]         列出所有校对规则
  \dp     [模式]         列出表,视图和序列的访问权限
  \drds [模式1 [模式2]]  列出每个数据库的角色设置
  \dRp[+] [模式]         列出复制出版物
  \dRs[+] [模式]         列出复制订阅
  \ds[S+] [模式]         列出序列
  \dt[S+] [模式]         列出表
  \dT[S+] [模式]         列出数据类型
  \du[S+] [模式]         列出角色
  \dv[S+] [模式]         列出视图
  \dx[+]  [模式]         列出扩展
  \dy[+]  [PATTERN]      list event triggers
  \l[+]   [模式]         列出所有数据库
  \sf[+]  FUNCNAME       显示一个函数的定义
  \sv[+]  VIEWNAME       显示一个视图的定义
  \z      [模式]         和\dp的功能相同

格式化
  \a                     在非对齐模式和对齐模式之间切换
  \C [字符串]            设置表的标题,或如果没有的标题就取消
  \f [字符串]            显示或设定非对齐模式查询输出的字段分隔符
  \H                     切换HTML输出模式 (目前是 关闭)
  \pset [NAME [VALUE]]   设置表输出选项
                         (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|
                         footer|format|linestyle|null|numericlocale|pager|
                         pager_min_lines|recordsep|recordsep_zero|tableattr|title|
                         tuples_only|unicode_border_linestyle|
                         unicode_column_linestyle|unicode_header_linestyle})
  \t [开|关]             只显示记录 (目前是 关闭)
  \T [字符串]            设置HTML <表格>标签属性, 或者如果没有的话取消设置
  \x [on|off|auto]       切换扩展输出模式(目前是 关闭)

连接
  \c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
                         连接到新数据库(当前是"postgres"
  \conninfo              显示当前连接的相关信息
  \encoding [编码名称]  显示或设定客户端编码
  \password [USERNAME]   安全地为用户更改口令

操作系统
  \cd [目录]             更改目前的工作目录
  \setenv NAME [VALUE]   设置或清空环境变量
 \timing [开|关]         切换命令计时开关 (目前是 关闭)
  \! [命令]              在 shell中执行命令或启动一个交互式shell

变量
  \prompt [文本] 名称    提示用户设定内部变量
  \set [名称 [值数]]     设定内部变量,若无参数则列出全部变量
  \unset 名称            清空(删除)内部变量

大对象
  \lo_export LOBOID 文件
  \lo_import 文件 [注释]
  \lo_list
  \lo_unlink LOBOID      大对象运算

## 查看SQL元命令
postgres=# \?
一般性
  \copyright              显示PostgreSQL的使用和发行许可条款
  \crosstabview [COLUMNS] 执行查询并且以交叉表显示结果
  \errverbose            以最冗长的形式显示最近的错误消息
  \g [文件] or;          执行查询 (并把结果写入文件或 |管道)
  \gdesc                 描述查询结果,而不执行它
  \gexec                 执行策略,然后执行其结果中的每个值
  \gset [PREFIX]         执行查询并把结果存到psql变量中
  \gx [FILE]             就像\g,但强制扩展输出模式
  \q             退出 psql
  \watch [SEC]          每隔SEC秒执行一次查询

帮助
  \? [commands]          显示反斜线命令的帮助
  \? options             显示 psql 命令行选项的帮助
  \? variables           显示特殊变量的帮助
  \h [名称]          SQL命令语法上的说明,用*显示全部命令的语法说明

查询缓存区
  \e [FILE] [LINE]        使用外部编辑器编辑查询缓存区(或文件)
  \ef [FUNCNAME [LINE]]   使用外部编辑器编辑函数定义
  \ev [VIEWNAME [LINE]]  用外部编辑器编辑视图定义
  \p                    显示查询缓存区的内容
  \r                     重置(清除)查询缓存区
  \s [文件]              显示历史记录或将历史记录保存在文件中
  \w 文件                将查询缓存区的内容写入文件

输入/输出
  \copy ...              执行 SQL COPY,将数据流发送到客户端主机
  \echo [字符串]         将字符串写到标准输出
  \i 文件                从文件中执行命令
  \ir FILE                \i类似, 但是相对于当前脚本的位置
  \o [文件]              将全部查询结果写入文件或 |管道
  \qecho [字符串]        将字符串写到查询输出串流(参考 \o)

条件
  \if EXPR               开始条件块
  \elif EXPR             当前条件块内的备选方案
  \else                  当前条件块内的最终备选方案
  \endif                 条件块的结尾

资讯性
  (选项: S = 显示系统对象, + = 其余的详细信息)
  \d[S+]                 列出表,视图和序列
  \d[S+]  名称           描述表,视图,序列,或索引
  \da[S]  [模式]         列出聚合函数
  \dA[+]  [模式]         列出访问方法
  \db[+]  [模式]         列出表空间
  \dc[S+] [模式]         列表转换
  \dC[+]  [模式]         列出类型强制转换
  \dd[S]  [模式]         显示没有在别处显示的对象描述
  \dD[S+] [模式]         列出共同值域
  \ddp    [模式]         列出默认权限
  \dE[S+] [模式]         列出引用表
  \det[+] [模式]         列出引用表
  \des[+] [模式]         列出外部服务器
  \deu[+] [模式]         列出用户映射
 \dew[+] [模式]          列出外部数据封装器
  \df[anptw][S+] [PATRN] 列出[只包括 聚合/常规/程序/触发器/窗口]函数 
  \dF[+]  [模式]         列出文本搜索配置
  \dFd[+] [模式]         列出文本搜索字典
 \dFp[+] [模式]          列出文本搜索解析器
  \dFt[+] [模式]         列出文本搜索模版
  \dg[S+] [模式]         列出角色
 \di[S+] [模式]          列出索引
  \dl                    列出大对象, 功能与\lo_list相同
  \dL[S+] [模式]         列出所有过程语言
  \dm[S+] [模式]         列出所有物化视图
  \dn[S+] [模式]         列出所有模式
  \do[S+] [PATTERN]      list operators
  \dO[S+] [模式]         列出所有校对规则
  \dp     [模式]         列出表,视图和序列的访问权限
  \drds [模式1 [模式2]]  列出每个数据库的角色设置
  \dRp[+] [模式]         列出复制出版物
  \dRs[+] [模式]         列出复制订阅
  \ds[S+] [模式]         列出序列
  \dt[S+] [模式]         列出表
  \dT[S+] [模式]         列出数据类型
  \du[S+] [模式]         列出角色
  \dv[S+] [模式]         列出视图
  \dx[+]  [模式]         列出扩展
  \dy[+]  [PATTERN]      list event triggers
  \l[+]   [模式]         列出所有数据库
  \sf[+]  FUNCNAME       显示一个函数的定义
  \sv[+]  VIEWNAME       显示一个视图的定义
  \z      [模式]         和\dp的功能相同

格式化
  \a                     在非对齐模式和对齐模式之间切换
  \C [字符串]            设置表的标题,或如果没有的标题就取消
  \f [字符串]            显示或设定非对齐模式查询输出的字段分隔符
  \H                     切换HTML输出模式 (目前是 关闭)
  \pset [NAME [VALUE]]   设置表输出选项
                         (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|
                         footer|format|linestyle|null|numericlocale|pager|
                         pager_min_lines|recordsep|recordsep_zero|tableattr|title|
                         tuples_only|unicode_border_linestyle|
                         unicode_column_linestyle|unicode_header_linestyle})
  \t [开|关]             只显示记录 (目前是 关闭)
  \T [字符串]            设置HTML <表格>标签属性, 或者如果没有的话取消设置
  \x [on|off|auto]       切换扩展输出模式(目前是 关闭)

连接
  \c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
                         连接到新数据库(当前是"postgres"
  \conninfo              显示当前连接的相关信息
  \encoding [编码名称]  显示或设定客户端编码
  \password [USERNAME]   安全地为用户更改口令

操作系统
  \cd [目录]             更改目前的工作目录
  \setenv NAME [VALUE]   设置或清空环境变量
 \timing [开|关]         切换命令计时开关 (目前是 关闭)
  \! [命令]              在 shell中执行命令或启动一个交互式shell

变量
  \prompt [文本] 名称    提示用户设定内部变量
  \set [名称 [值数]]     设定内部变量,若无参数则列出全部变量
  \unset 名称            清空(删除)内部变量

大对象
  \lo_export LOBOID 文件
  \lo_import 文件 [注释]
  \lo_list
  \lo_unlink LOBOID      大对象运算

4. 常用操作

bash
## 查看客户端工具版本信息
psql -v 

## 使用-c参数执行查询数据库版本信息
psql -c "select version()";

## psql登录到数据库后去执行操作系统的命令
\! top

## psql登录到数据库
psql -h 127.0.0.1 -U postgres -d postgres 

## 查看当前连接状态
\conninfo

## 查看当前数据库
select current_database();

## 查看当前连接用户
select * from current_user;select user;

## 查看所有数据库
select * from pg_database;\l+

## 查看数据库用户情况
\du 
select * from pg_user;

## 切换数据库
\c <dbname>

## 使用某个用户连接到某个数据库
\c <dbname> <username>

## 查看当前数据库下的对象
\d+

## 查看当数数据库下的表
\dt

## 查看当前数据库下的索引
\di

#查看命令执行时间
\timing on

## 设置自动提交(默认情况)
\set autocommit on
## 查看客户端工具版本信息
psql -v 

## 使用-c参数执行查询数据库版本信息
psql -c "select version()";

## psql登录到数据库后去执行操作系统的命令
\! top

## psql登录到数据库
psql -h 127.0.0.1 -U postgres -d postgres 

## 查看当前连接状态
\conninfo

## 查看当前数据库
select current_database();

## 查看当前连接用户
select * from current_user;select user;

## 查看所有数据库
select * from pg_database;\l+

## 查看数据库用户情况
\du 
select * from pg_user;

## 切换数据库
\c <dbname>

## 使用某个用户连接到某个数据库
\c <dbname> <username>

## 查看当前数据库下的对象
\d+

## 查看当数数据库下的表
\dt

## 查看当前数据库下的索引
\di

#查看命令执行时间
\timing on

## 设置自动提交(默认情况)
\set autocommit on

5.PSql定制脚本

https://github.com/NikolayS/postgres_dba

bash
[ptgres@db_prod ~]$ cat .psqlrc
\echo 🧐 🐘 postgres_dba 6.0 installed. Use ":dba" to see menu
\set dba '\\i /home/ptgres/postgres_dba-6.0/start.psql'
[ptgres@db_prod ~]$ cat .psqlrc
\echo 🧐 🐘 postgres_dba 6.0 installed. Use ":dba" to see menu
\set dba '\\i /home/ptgres/postgres_dba-6.0/start.psql'

脚本扩展方法

只需要将自己的sql脚本添加到sql/这个目录下面即可

然后执行generate.sh脚本初始化:

./init/generate.sh
./init/generate.sh

然后我们去start.psql中可以为我们新增的选项加点注释:

bash
...
\echo '  c1 – List the count of objects for each Database Schema'
...
...
\echo '  c1 – List the count of objects for each Database Schema'
...

5.1 第二种方式

[postgres@localhost ~]$ cat ~/.psqlrc
\set active_session ' select pid,usename,datname,query,client_addr from pg_stat_activity where pid <> pg_backend_pid() and state=\'active\' order by query;'
[postgres@localhost ~]$ cat ~/.psqlrc
\set active_session ' select pid,usename,datname,query,client_addr from pg_stat_activity where pid <> pg_backend_pid() and state=\'active\' order by query;'
  • 调用
bash
使用方法:冒号后面接变量名

postgres=# :active_session
 pid | usename | datname | query | client_addr
-----+---------+---------+-------+-------------
(0 rows)
使用方法:冒号后面接变量名

postgres=# :active_session
 pid | usename | datname | query | client_addr
-----+---------+---------+-------+-------------
(0 rows)