暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL18中psql相关新特性尝鲜(2)

既上篇(PostgreSQL18中psql相关新特性尝鲜(1))后,这篇文章,我们接着来介绍一下PostgreSQL 18中psql工具引入新特性,本文将重点介绍三个优化功能点:扩展信息展示优化、服务名称查询以及命名预处理语句支持。

\dx扩展信息中新增default_version列

\dx
用于列出当前数据库中已安装的所有扩展及其详细信息,包括扩展名称、版本号、所属模式以及描述。为了让用户更清楚地意识到在升级扩展后需要执行ALTER EXTENSION UPDATE命令,在PostgreSQL18的\dx命令中新增显示扩展的默认版本即最初安装的版本,这样与Version对比就可以看出是否安装过更新版本

PostgreSQL17中查看\dx的内容

  1. testdb=# \dx
  2. List of installed extensions
  3. Name|Version|Schema|Description
  4. ---------+---------+------------+------------------------------
  5.  plpgsql |1.0| pg_catalog | PL/pgSQL procedural language
  6. (1 row)

PostgreSQL18中查看\dx的内容

  1. testdb=# \dx
  2. List of installed extensions
  3. Name|Version|Default version |Schema|Description
  4. ---------+---------+-----------------+------------+------------------------------
  5.  plpgsql |1.0|1.0| pg_catalog | PL/pgSQL procedural language

服务名称查询

在服务文件pg_service.conf用于连接到各种数据库,而不需要每次手动输入连接信息。

  1. [test]
  2. host=192.168.181.91
  3. port=5432
  4. user=test
  5. dbname=testdb
  6. password=Postgresql2024
  7. options=-c search_path=public

在PostgreSQL18中对服务名称的使用有两点优化即

1、通过psql变量service中访问服务名称

2、在psql提示符中允许添加连接服务名称,使用%s表示服务名称

我们知道任何使用libpq的应用程序都可以通过服务名称test进行连接,而PG18优化后,在psql中变量service就可以获取到服务名

  1. [postgres@wang ~]$ psql service=test -'\echo :SERVICE'
  2. test

对于在psql提示符使用服务名称,需要编辑.psqlrc文件,添加如下代码,其中%s就表示服务名称

  1. \set PROMPT1 '%/ %s =#'

修改完成后,通过psql连接服务名称,就在psql提示符中就显示了服务名称

  1. [postgres@wang ~]$ psql service=test
  2. Timingis on.
  3. psql (18beta1, server 17rc1)
  4. Type"help"for help.
  5. testdb test =#

命名的预处理语句操作

在以前的版本中,psql只支持未命名的预处理语句。psql使用\bind命令只支持未命名的预处理语句,并且不可能创建或使用已命名的预处理语句。在PostgreSQL18中引入了三个命令\parse、\bind_name和\close来操作有命名的预处理语句,这是针对多次使用命名预处理语句的优化:

\parse允许我们发出一个parse消息,通过扩展协议创建一个命名的预处理语句。

\bind_named使用扩展协议绑定并执行命名的准备语句。

\close使用扩展协议关闭现有的预处理语句

先简单的测试一下,如何使用 psql解析、绑定和关闭命名的预处理语句

\parse命令的执行需要有一个STMT_NAME值,也就是预处理语句的名称,如果没有该参数的时候会报错

  1. --\parse没有指定STMT_NAME
  2. demo=# \parse
  3. \parse: missing required argument
  4. --常规的SQL语句
  5. demo=#select*from pg_tables where schemaname ='bookings' \parse stmt1
  6. Time:0.257 ms
  7. --含有变量的SQL
  8. demo=#select*from pg_tables where schemaname = $1 \parse stmt2
  9. Time:0.443 ms

使用\bind_named绑定并执行命名的预处理语句

  1. demo=# \bind_named stmt1 \g
  2.  schemaname |    tablename    | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
  3. ------------+-----------------+------------+------------+------------+----------+-------------+-------------
  4.  bookings   | boarding_passes | postgres   || t          | f        | t           | f
  5.  bookings   | aircrafts_data  | postgres   || t          | f        | t           | f
  6.  bookings   | flights         | postgres   || t          | f        | t           | f
  7.  bookings   | airports_data   | postgres   || t          | f        | t           | f
  8.  bookings   | seats           | postgres   || t          | f        | t           | f
  9.  bookings   | tickets         | postgres   || t          | f        | t           | f
  10.  bookings   | ticket_flights  | postgres   || t          | f        | t           | f
  11.  bookings   | bookings        | postgres   || t          | f        | t           | f
  12. (8 rows)
  13. Time:0.878 ms
  14. demo=# \bind_named stmt2 'bookings'  \g
  15.  schemaname |    tablename    | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
  16. ------------+-----------------+------------+------------+------------+----------+-------------+-------------
  17.  bookings   | boarding_passes | postgres   || t          | f        | t           | f
  18.  bookings   | aircrafts_data  | postgres   || t          | f        | t           | f
  19.  bookings   | flights         | postgres   || t          | f        | t           | f
  20.  bookings   | airports_data   | postgres   || t          | f        | t           | f
  21.  bookings   | seats           | postgres   || t          | f        | t           | f
  22.  bookings   | tickets         | postgres   || t          | f        | t           | f
  23.  bookings   | ticket_flights  | postgres   || t          | f        | t           | f
  24.  bookings   | bookings        | postgres   || t          | f        | t           | f
  25. (8 rows)
  26. Time:1.147 ms

使用\close关闭预处理语句

  1. demo=# \close stmt1
  2. Time:0.127 ms
  3. demo=# \close stmt2
  4. Time:0.130 ms

在经过上面简单的测试,基本了解对于命名的预处理语句是如何操作的,而且也可以多次执行命名的预处理语句。

总结

PostgreSQL18为psql工具带来的这些改进虽然看似小巧,但在实际使用中还是能够方便开发者使用并能显著提升工作效率:

1、\dx输出的扩展信息新增default_version列

2、将连接服务名称添加到psql提示符或通过psql变量访问它

3、命名的预处理语句操作

这些新特性展示了PostgreSQL对开发者体验的持续关注,值得在实际工作中尝试应用。

参考

https://www.postgresql.org/docs/18/release-18.html

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d55322b0d

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=477728b5d

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d696406a9

– END / –

可以通过下面的方式联系我

  • 微信公众号:@墨竹札记
  • 墨天轮:@墨竹
  • 微信:wshf395062788
  • IFCLUB:@墨竹
  • PGFans:@墨竹

如果这篇文章为你带来了灵感或启发,就请帮忙点赞收藏转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!


文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论