既上篇(PostgreSQL18中psql相关新特性尝鲜(1))后,这篇文章,我们接着来介绍一下PostgreSQL 18中psql工具引入新特性,本文将重点介绍三个优化功能点:扩展信息展示优化、服务名称查询以及命名预处理语句支持。
\dx扩展信息中新增default_version列
\dx
用于列出当前数据库中已安装的所有扩展及其详细信息,包括扩展名称、版本号、所属模式以及描述。为了让用户更清楚地意识到在升级扩展后需要执行ALTER EXTENSION UPDATE命令,在PostgreSQL18的\dx命令中新增显示扩展的默认版本即最初安装的版本,这样与Version对比就可以看出是否安装过更新版本。
PostgreSQL17中查看\dx的内容
testdb=# \dxList of installed extensionsName|Version|Schema|Description---------+---------+------------+------------------------------plpgsql |1.0| pg_catalog | PL/pgSQL procedural language(1 row)
PostgreSQL18中查看\dx的内容
testdb=# \dxList of installed extensionsName|Version|Default version |Schema|Description---------+---------+-----------------+------------+------------------------------plpgsql |1.0|1.0| pg_catalog | PL/pgSQL procedural language
服务名称查询
在服务文件pg_service.conf用于连接到各种数据库,而不需要每次手动输入连接信息。
[test]host=192.168.181.91port=5432user=testdbname=testdbpassword=Postgresql2024options=-c search_path=public
在PostgreSQL18中对服务名称的使用有两点优化即
1、通过psql变量service中访问服务名称
2、在psql提示符中允许添加连接服务名称,使用%s表示服务名称
我们知道任何使用libpq的应用程序都可以通过服务名称test进行连接,而PG18优化后,在psql中变量service就可以获取到服务名
[postgres@wang ~]$ psql service=test -c '\echo :SERVICE'test
对于在psql提示符使用服务名称,需要编辑.psqlrc文件,添加如下代码,其中%s就表示服务名称
\set PROMPT1 '%/ %s =#'
修改完成后,通过psql连接服务名称,就在psql提示符中就显示了服务名称
[postgres@wang ~]$ psql service=testTimingis on.psql (18beta1, server 17rc1)Type"help"for help.testdb test =#
命名的预处理语句操作
在以前的版本中,psql只支持未命名的预处理语句。psql使用\bind命令只支持未命名的预处理语句,并且不可能创建或使用已命名的预处理语句。在PostgreSQL18中引入了三个命令\parse、\bind_name和\close来操作有命名的预处理语句,这是针对多次使用命名预处理语句的优化:
\parse允许我们发出一个parse消息,通过扩展协议创建一个命名的预处理语句。
\bind_named使用扩展协议绑定并执行命名的准备语句。
\close使用扩展协议关闭现有的预处理语句
先简单的测试一下,如何使用 psql解析、绑定和关闭命名的预处理语句
\parse命令的执行需要有一个STMT_NAME值,也就是预处理语句的名称,如果没有该参数的时候会报错
--\parse没有指定STMT_NAME值demo=# \parse\parse: missing required argument--常规的SQL语句demo=#select*from pg_tables where schemaname ='bookings' \parse stmt1Time:0.257 ms--含有变量的SQLdemo=#select*from pg_tables where schemaname = $1 \parse stmt2Time:0.443 ms
使用\bind_named绑定并执行命名的预处理语句
demo=# \bind_named stmt1 \gschemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity------------+-----------------+------------+------------+------------+----------+-------------+-------------bookings | boarding_passes | postgres || t | f | t | fbookings | aircrafts_data | postgres || t | f | t | fbookings | flights | postgres || t | f | t | fbookings | airports_data | postgres || t | f | t | fbookings | seats | postgres || t | f | t | fbookings | tickets | postgres || t | f | t | fbookings | ticket_flights | postgres || t | f | t | fbookings | bookings | postgres || t | f | t | f(8 rows)Time:0.878 msdemo=# \bind_named stmt2 'bookings' \gschemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity------------+-----------------+------------+------------+------------+----------+-------------+-------------bookings | boarding_passes | postgres || t | f | t | fbookings | aircrafts_data | postgres || t | f | t | fbookings | flights | postgres || t | f | t | fbookings | airports_data | postgres || t | f | t | fbookings | seats | postgres || t | f | t | fbookings | tickets | postgres || t | f | t | fbookings | ticket_flights | postgres || t | f | t | fbookings | bookings | postgres || t | f | t | f(8 rows)Time:1.147 ms
使用\close关闭预处理语句
demo=# \close stmt1Time:0.127 msdemo=# \close stmt2Time: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:@墨竹
如果这篇文章为你带来了灵感或启发,就请帮忙点赞、收藏、转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!





