PostgreSQL 基础知识:psql 提示和技巧

对于积极使用和连接到 PostgreSQL 数据库的任何开发人员或 DBA 来说,能够访问psql命令行工具是必不可少的。在我们的第一篇文章中,我们讨论了 psql的简要历史,并演示了如何在您选择的平台上安装它并连接到 PostgreSQL 数据库。

在本文中,我们将帮助您了解成为高级用户所需了解的所有psql基本知识 。从基本的命令语法到最常见(和最有用的)元命令,本文的其余部分都涵盖了这些内容。
要从本内容中获得最大价值,您应该已经 安装psql并连接到 PostgreSQL 数据库,以便您可以在阅读时尝试这些命令。

基本可用性提示

psql实用程序包含许多有用的命令,可帮助您探索和管理数据库。任何斜杠命令 ( \) 都用于指定一个元命令,该命令通常会在后台运行必要的 SQL 查询并以可读格式返回结果。


首先,让我们看一下有关 psql 作为命令行工具工作的一些技巧。了解如何启用某些功能或为每个元命令找到帮助,将有助于您更好的使用它。

01 分号是必需的


PostgreSQL 遵守 ANSI SQL 标准,该标准规定了语句终止是分号。在psql中可以通过添加分号并按 Enter 来表示 SQL 语句的结束。
如果不添加分号,psql将只提供一个新行供您继续输入,如下所示。
 

pagila_dev=# select * from film
pagila_dev-# ;


在添加分号之前不会执行查询。

02 命令历史和分页

psql是一个终端应用程序,因此它保留了您执行过的查询和命令的历史记录。因此,您可以使用键盘上的向上和向下箭头翻阅以前的命令和语句。当您想多次运行一条语句但每次只更改过滤条件时,这很有用。
历史记录存储在本地客户端的文件中,这意味着它会因计算机而异。您还可以配置.psqlrc文件中的变量HISTFILE为使用 psql的每个数据库或服务器创建不同的历史文件。
要查看已运行命令的列表,请使用 \s 命令。

postgres=# \s

\c pagila_
\c pagila_dev
\df
\x
\df
select * from film
;
\s

03  自动完成(补全)


psql支持基于选项卡的自动完成。对于许多命令,您可以使用TAB键来触发自动补全或给出建议。如果您想列出一个表或连接到一个不同的数据库,请从元命令开始,然后开始键入对象名称并按TAB。如果有多个匹配项,psql将提供类似于 Linux 终端的可能匹配项。
 

04  扩展的结果表格式


我很早就了解到的psql第一个有用的提示之一是:有两种模式可以同时显示查询和元命令结果。通常,psql将以等宽字体格式化数据的行和列,并在合理范围内进行适当的填充量以使所有内容对齐。但是,当发生终端换行时,要弄清楚哪些数据与哪一列对应可能会很困难。
在这些情况下,您可以以“扩展”(expanded)格式打印结果,该格式本质上是每行的交叉表,在左侧显示列标题,在右侧显示每个值。在这种格式中,您可以一次一个地翻阅结果。
您可以使用命令 \x打开和关闭扩展模式。下面我们展示了数据库中的对象列表,首先是普通表模式,然后是扩展模式。
 

postgres=# \d
                  List of relations
Schema |          Name           | Type  |  Owner
--------+-------------------------+-------+----------
public | example_tbl             | table | postgres
public | pg_stat_statements      | view  | postgres
public | pg_stat_statements_info | view  | postgres
(3 rows)

postgres=# \x
Expanded display is on.
postgres=# \d
List of relations
-[ RECORD 1 ]-------------------
Schema | public
Name   | example_tbl
Type   | table
Owner  | postgres
-[ RECORD 2 ]-------------------
Schema | public
Name   | pg_stat_statements
Type   | view
Owner  | postgres
-[ RECORD 3 ]-------------------
Schema | public
Name   | pg_stat_statements_info
Type   | view
Owner  | postgres

05  退出 psql 会话


最后,我不希望您觉得自己无法摆脱交互式外壳。任何时候你想退出当前psql会话,只需使用元命令 \q 返回到你的终端提示符。
 

postgres=# \q

ryan@redgate-laptop:~$

06  系统对象和其他详细信息

当我们回顾下面的一些基本命令时,您会注意到一种模式,其中许多命令具有多种形式。在许多命令的末尾添加大写字母S将在输出中包含系统对象。此外,在命令末尾包含符号“+”,将返回其他详细信息,类似于高级输出模式。
例如,下面的两个命令都列出了数据库的表、视图和序列,但第二种形式提供了额外的详细信息。

postgres=# \d
                  List of relations
Schema |          Name           | Type  |  Owner
--------+-------------------------+-------+----------
public | example_tbl             | table | postgres
public | pg_stat_statements      | view  | postgres
public | pg_stat_statements_info | view  | postgres
...

postgres=# \d+
                                              List of relations
Schema |          Name           | Type  |  Owner   | Persistence | Access method |    Size    | Description
--------+-------------------------+-------+----------+-------------+---------------+------------+-------------
public | example_tbl             | table | postgres | permanent   | heap          | 8192 bytes |
public | pg_stat_statements      | view  | postgres | permanent   |               | 0 bytes    |
public | pg_stat_statements_info | view  | postgres | permanent   |               | 0 bytes    |

postgres=# \dS+
                                               List of relations
   Schema   |              Name               | Type  |  Owner   | Persistence | Access method |    Size    | Description
------------+---------------------------------+-------+----------+-------------+---------------+------------+-------------
pg_catalog | pg_aggregate                    | table | postgres | permanent   | heap          | 56 kB      |
pg_catalog | pg_am                           | table | postgres | permanent   | heap          | 40 kB      |
pg_catalog | pg_amop                         | table | postgres | permanent   | heap          | 88 kB      |
pg_catalog | pg_amproc                       | table | postgres | permanent   | heap          | 72 kB      |
pg_catalog | pg_attrdef                      | table | postgres | permanent   | heap          | 8192 bytes |
...
public     | example_tbl                     | table | postgres | permanent   | heap          | 8192 bytes |
public     | pg_stat_statements              | view  | postgres | permanent   |               | 0 bytes    |
public     | pg_stat_statements_info         | view  | postgres | permanent   |               | 0 bytes    |

07  获得帮助

尽管输出可能会让人不知所措,但您始终可以查看psql帮助文件,该文件将向您展示元命令模式的扩展列表。请注意,输出被分组到类别中。
 

postgres=# \?
General
  \copyright             show PostgreSQL usage and distribution terms
  \crosstabview [COLUMNS] execute query and display result in crosstab
  \errverbose            show most recent error message at maximum verbosity
  \g [(OPTIONS)] [FILE]  execute query (and send result to file or |pipe);
                         \g with no arguments is equivalent to a semicolon
  \gdesc                 describe result of query, without executing it
  \gexec                 execute query, then execute each value in its result
  \gset [PREFIX]         execute query and store result in psql variables
  \gx [(OPTIONS)] [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

Query Buffer
  \e [FILE] [LINE]       edit the query buffer (or file) with external editor
  \ef [FUNCNAME [LINE]]  edit function definition with external editor
...

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
  \dA[+]  [PATTERN]      list access methods
…

基本元命令


根据我过去几年使用 PostgreSQL 的经验,特别是多年的 SQL Server 工作经验,学习如何有效地使用psql基本命令已被证明是非常有用且节省时间的。以下是一组初始命令,可帮助您浏览 PostgreSQL 集群和数据库。
肯定有比这些更多的命令,但我相信这些是您应该从一开始就学习的高级命令集。

01 连接到不同的数据库

该\c命令将连接到同一服务器上的新数据库。如果您使用-W选项连接到服务器,那么每次您连接到不同的数据库时,系统都会再次提示您输入密码,这几乎总是很麻烦,所以我不推荐它。
 

postgres=# \c flywaytest

psql (15.0 (Ubuntu 15.0-1.pgdg20.04+1), server 15.1 (Debian 15.1-1.pgdg110+1))
You are now connected to database "flywaytest" as user "postgres".

flywaytest=#


请注意,默认psql提示显示当前连接的数据库名称。
 

02 列出所有数据库

\l命令将列出当前服务器中的所有数据库以及指定的访问权限。看到数据库存在于此列表中并不意味着当前角色可以连接 ( \c) 到数据库。添加符号“+”将提供其他信息,包括数据库大小。、
 

postgres=# \l+
                                                    List of databases
       Name        |  Owner   | Encoding |  Collate   |   Ctype    | ICU Locale | Locale Provider |   Access privileges
-------------------+----------+----------+------------+------------+------------+-----------------+-----------------------
advent_of_code    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            | postgres=CTc/postgres+
                   |          |          |            |            |            |                 | rptusr=c/postgres
bulk_example      | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            |
flywaytest        | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            |
flywaytest_shadow | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            |

显示对象详细信息


psql里面有很多\d命令。尽管大多数命令没有指定具体名称,但社区中的大多数人将其称为“描述”、“显示”或“详细信息”命令。就像一个 CLI,它允许您通过键入“help [command]”之类的内容来获取每个命令的帮助。
大多数\d命令将通过在末尾添加+运算符,来提供更多详细信息。我只会在下面展示几个示例,但请随意尝试使用这些命令中的任何一个来获取更多详细信息。
 

01 显示表、视图和序列对象


\d命令的默认操作是列出当前数据库中的所有表、视图和序列。
 

postgres=# \d
                  List of relations
Schema |          Name           | Type  |  Owner
--------+-------------------------+-------+----------
public | example_tbl             | table | postgres
public | pg_stat_statements      | view  | postgres
public | pg_stat_statements_info | view  | postgres

02 描述表、视图或序列的详细信息

您可以命名特定对象以获取更多信息。使用+运算符还将列出表的约束和索引。
 

postgres=# \d+ example_tbl
                                       Table "public.example_tbl"
Column |  Type   | Collation | Nullable | Default | Storage  | Compression | Stats target | Description
--------+---------+-----------+----------+---------+----------+-------------+--------------+-------------
id     | integer |           | not null |         | plain    |             |              |
notes  | text    |           |          |         | extended |             |              |
Indexes:
    "idx_example_notes" btree (notes)
Access method: heap

03 显示特定对象类型

如您所料,psql开发人员提供了用于列出各个对象类型的特定命令。在命令后添加不同的字母\d将仅列出该类型的对象。所有列表都支持使用+运算符。.

1、E = 外部表(由许多外部数据包装器之一提供)
2、I = 索引
3、m = 物化视图
4、s = 序列
5、t = 表格
6、v = 视图

postgres=# \dt

            List of relations
 Schema |    Name     | Type  |  Owner
--------+-------------+-------+----------
 public | example_tbl | table | postgres

04 显示角色和成员

角色用于连接到 PostgreSQL、分配数据库权限和指定对象所有权。有关角色的更多详细信息,请参阅我们关于 PostgreSQL 安全性的系列文章。
 

postgres=# \du
                                        List of roles
Role name |                         Attributes                         |     Member of
-----------+------------------------------------------------------------+---------------
dev1      |                                                            | {devgrp}
dev2      |                                                            | {devgrp}
devgrp    | Cannot login                                               | {}
postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
read_only | Cannot login                                               | {pg_read_all_data}
rptusr    |                                                            | {}

05 显示已安装的扩展

扩展是 PostgreSQL 更强大的特性之一。了解特定数据库中安装了哪些扩展有助于您更好地了解应用程序可能依赖的功能。
 

postgres=# \dx
                                            List of installed extensions
        Name        | Version |   Schema   |                              Description
--------------------+---------+------------+------------------------------------------------------------------------
pg_stat_statements | 1.10    | public     | track planning and execution statistics of all SQL statements executed
plpgsql            | 1.0     | pg_catalog | PL/pgSQL procedural language
tablefunc          | 1.0     | public     | functions that manipulate whole tables, including crosstab                                                          | {}

06 显示模式


通常,您的应用程序数据库将具有多少模式,具体取决于数据库的设计和访问要求。默认情况下,psql只会显示属于您的模式,它由变量search_path标识,对于大多数用户而言,public作为默认的模式。如果您想查看数据库中还有哪些其他模式可用,\dn将仅显示用户自定义的模式。
 

postgres=# \dn
       List of schemas
   Name   |       Owner
----------+-------------------
accounts | postgres
public   | pg_database_owner

07 显示用户定义的函数

PostgreSQL 是一个功能繁重的数据库。如果您来自其他数据库(如 SQL Server),这可能会感觉有点违反直觉,因为很多讨论和培训都在谈论使用函数的陷阱,尤其是在查询性能方面。也就是说,能够快速列出当前数据库中的各种函数(包括输入类型)非常有帮助。
 

postgres=# \df
                                                         List of functions
Schema |            Name            | Result data type |                        Argument data types                         | Type
--------+----------------------------+------------------+--------------------------------------------------------------------+------
public | _group_concat              | text             | text, text                                                         | func
public | film_in_stock              | SETOF integer    | p_film_id integer, p_store_id integer, OUT p_film_count integer    | func
public | film_not_in_stock          | SETOF integer    | p_film_id integer, p_store_id integer, OUT p_film_count integer    | func
public | get_customer_balance       | numeric          | p_customer_id integer, p_effective_date timestamp with time zone   | func
public | inventory_held_by_customer | integer          | p_inventory_id integer                                             | func
public | inventory_in_stock         | boolean          | p_inventory_id integer                                             | func
public | last_day                   | date             | timestamp with time zone                                           | func
public | rewards_report             | SETOF customer   | min_monthly_purchases integer, min_dollar_amount_purchased numeric | func

08  在终端外编辑 SQL


大部分时间psql被用作交互式终端。然而,有时,在编辑器中打开一个查询以进行更大的更改和迭代是很有用的。
使用该\e命令会将当前查询缓冲区(或最近执行的命令)打开到编辑器中。退出编辑器后,如果 SQL 查询完成(以分号结束),它将立即执行。
或者,在命令\e后添加文件名,将打开该文件进行编辑,然后在完成时执行查询。(例如。\e my_query.sql)
最后,您可以使用特定版本的编辑命令在外部编辑器中查看函数或视图的代码。
 

\ef {function name}
\ev {view name}

09  显示隐藏的元命令 SQL


当您了解有关psql交互式 shell 的更多信息时,最后要知道的一件事是,可以查看运行的每个元命令的 SQL 查询。这是了解运行 PostgreSQL 实例的目录表更多信息的一种非常有用的方法。注意,通常会执行多个 SQL 查询以获得所需的输出,因此在您尝试了解特定内容时,仅在短时间内启用它通常很有帮助。
在psql.有两个选项方法可以启用这个模式:

选项一:psql -E 连接参数

这将在您的psql连接期间启用隐藏查询。

psql -E postgresql://[username]:[password]@[hostname]:[port]/[database name]


选项 2:\set 元命令

如果您已经连接到数据库,则可以随意设置显示隐藏查询的变量。

postgres=# \set ECHO_HIDDEN true

结论

了解如何安装和使用psql命令行工具是使用 PostgreSQL 的必备技能。由于没有完全标准化的 IDE,从目录表中轻松查询有关数据库的详细信息有时可能具有挑战性,特别是如果您是 PostgreSQL 的新手。了解基本元命令的工作原理可以显着改善您的开发和管理任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE

HTTP的method方法 GET POST PUT DELETE HEAD OPTIONS CONNECT PATCH TRACE GET 向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意…

Docker 持久化存储 Bind mounts

Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…

ePWM模块(1)

ePWM模块 ePWM模块内部包含有7个子模块,分别是时间基准子模块TB、比较功能子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET和故障捕获子模块TZ。 每个ePWM模块都具有以下功能: 可以输出两路PWM,EPWMxA和EPWMxB两路PWM可以独立输出,也可…

大二一个学期学这么点内容,没有概念,只有实操

如何查看所有的数据库: Show databases; 如何进入某个数据库: use xxx; 如何新进数据库: Create database jx; 如何删除数据库: Drop database jx; 如何查看所有的表格: Show tables; 如何创建数据表&#xf…

【Flink】DataStream API使用之执行环境

1. 执行环境 Flink 程序可以在各种上下文环境中运行:我们可以在本地 JVM 中执行程序,也可以提交 到远程集群上运行。不同的环境,代码的提交运行的过程会有所不同。这就要求我们在提交作业执行计算时,首先必须获取当前 Flink 的运…

(异或相消)猫猫数字异或和

E - Red Scarf (atcoder.jp) 刚入坑写的一道题被我拉出来对比分析了 我的思路: 垃圾运气选手凭借直觉乱搞猜出来的,没有思路。 题解思路: 由问题陈述中XOR的定义,我们可以看出计算3个或更多整数的XOR可以以任意顺序进行&#…

ChatGPT :十几个国内免费可用 ChatGPT 网页版

前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言…

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂,通过印刷,利用一切可能的方式,在机械通孔、机械盲埋孔等各种类型的孔内进行填充,实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后,利于层压的真空下…

盲目自学网络安全只会成为脚本小子?

前言:我们来看看怎么学才不会成为脚本小子 目录: 一,怎么入门? 1、Web 安全相关概念(2 周)2、熟悉渗透相关工具(3 周)3、渗透实战操作(5 周)4、关注安全圈动…

2.RabbitMQ

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…

springboot整合flowable工作流引擎的简单使用

内容来自网络整理,文章最下有引用地址,可跳转至相关资源页面。若有侵权请联系删除 环境: mysql5.7.2 springboot 2.3.9.RELEASE flowable 6.7.2 采坑: 1.当前flowable sql需要与引用的pom依赖一致,否则会报library…

进程/线程 状态模型详解

前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的…

[Python]爬虫基础——urllib库

urllib目录 一、简介二、发送请求1、urlopen()函数2、Request()函数 三、异常处理四、解析URL五、分析Robots协议 一、简介 urllib库是Python内置的标准库。包含以下四个模块: 1、request:模拟发送HTTP请求; 2、error:处理HTTP请…

前端技术——css

1.CSS的引入 【1】为什么要学习CSS? 如果只用HEML画页面的话--->这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面。所以我们需要用到CSS。 CSS的作用:修饰HTML页面…

linux操作手册

开机&关机 指令 shutdown -h now 立刻进行关机 shutdown -h num num分钟后执行关机 shutdown -r now 现在重启计算机 halt 关机 rebboot 重启计算机 sync 把内存的数据同步到磁盘 注意事项 无论是重启还是关闭系统,都必须先执行sync,将内存…

使用无标注的数据训练Bert

文章目录 1、准备用于训练的数据集2、处理数据集3、克隆代码4、运行代码5、将ckpt模型转为bin模型使其可在pytorch中运用 Bert官方仓库:https://github.com/google-research/bert 1、准备用于训练的数据集 此处准备的是BBC news的数据集,下载链接&…

camunda表达式如何使用

在Camunda中,表达式是一种灵活的方式,可以用于在流程定义和表单中计算和处理数据。表达式可以在Camunda的各个环节中使用,例如服务任务、网关、表单、条件等。 以下是Camunda表达式的一些常见用途: 1、计算值:表达式可…

卢北辰:数据点亮梦想,能力驱动人生 | 提升之路系列(九)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处,在于普通的电容笔并不具备着重力压感,而是会给人一种倾斜的压感。如果不是频繁作画,那就用一支普通的电容笔。这种电容笔不但可以用于办公室,也可以用于记笔记、做练习。再说了,一支苹果…