PostgreSQL插件开发1
PostgreSQL的扩展性十分强大,不仅可以自定义操作符、索引等,还可以允许用户安装需求来安装contrib模块,即扩展(extension)。
比较常见的一些extension有pg_pathman(分区表)、citus(分布式)等等,那么我们该怎么通过编写扩展向pg中增加想要的功能呢?
首先,我们想要安装extension必需要在contrib目录下编写两个必要的文件:
extension_name.control 控制文件,声明该扩展的基础信息。
extension–version.sql 加载扩展所需要执行的SQL文件。
今天学习了一些扩展开发的基础知识,下面我自己写了个简单的extension来测试。这里编写一个extension来代替pg中的to_char函数,弥补to_char函数不能作为函数索引的缺陷(因为系统自带的to_char不是immutable函数)。
例子:
1、创建控制文件
在contrib目录下一个my_tochar文件夹,在该文件夹下面创建my_tochar.control文件,内容如下:
# my_tochar extension
comment = 'my_tochar auth by wuc'
default_version = '0.0.1'
relocatable = true
2、创建Makefile文件
EXTENSION = my_tochar # 扩展的名称
DATA = my_tochar--0.0.1.sql # 扩展安装的SQL文件
# 以下是 PostgreSQL 构建扩展相关的命令,保留就可以PG_CONFIG = pg_configPGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS)
3、创建sql文件
我们想要实现的功能需要在sql文件里面编写函数:
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION my_tochar" to load this file. \quit
create or replace function my_tochar(some_time timestamp) returns text as $$select to_char($1, 'yyyy-mm-dd'); $$ language sql immutable;
4、安装扩展
接下来我们就可以编译文件然后将扩展添加到数据库中了。
编译安装:
pg12@oracle-> make&make install
[1] 12702
make: Nothing to be done for `all'.
/bin/mkdir -p '/home/pg12/pgsql12.4/share/extension'
/bin/mkdir -p '/home/pg12/pgsql12.4/share/extension'
/bin/install -c -m 644 .//my_tochar.control '/home/pg12/pgsql12.4/share/extension/'
/bin/install -c -m 644 .//my_tochar--0.0.1.sql '/home/pg12/pgsql12.4/share/extension/'
[1]+ Done make
去数据库里面添加扩展:
bill=# create extension my_tochar ;
CREATE EXTENSION
bill=# \dx my_tochar List of installed extensionsName | Version | Schema | Description
-----------+---------+--------+-------------------------my_tochar | 0.0.1 | public | my_tochar author by wuc
(1 row)
验证:
bill=# select my_tochar('now()');my_tochar
------------2019-11-21
(1 row)
到这里我们就已经成功的完成了这个简单的extension的编写。但是还有一点不足之处,万一我们的extension有错该如何测试呢?上面我们没有通过测试就直接将extension添加进去了,万一这个extension对数据库影响很大怎么办,我们该怎么先进行测试呢?这里推荐make installcheck的方式来测试。
5、测试
首先,我们把测试写成一个 SQL 文件,保存为sql/my_tochar_test.sql。我们把之前用于测试的 SQL 写入到这个文件中,并且在开头添加加载扩展的语句(如果没有,在运行测试时就会返回错误)。
CREATE EXTENSION my_tochar;select my_tochar('2019-11-20 23:36:48.996747+08');
然后在Makefile中增加测试命令REGRESS:
EXTENSION = my_tochar # 扩展的名称
DATA = my_tochar--0.0.1.sql # 扩展安装的SQL文件
REGRESS = my_tochar_test
# 以下是 PostgreSQL 构建扩展相关的命令,保留就可以PG_CONFIG = pg_configPGXS := $(shell $(PG_CONFIG) --pgxs)include $(PGXS)
我们运行make installcheck看看会发生什么。
pg12@oracle-> make installcheck
/home/pg12/pgsql12.4/lib/pgxs/src/makefiles/…/…/src/test/regress/pg_regress --inputdir=./ --bindir=’/home/pg12/pgsql12.4/bin’ --dbname=contrib_regression my_tochar_test
(using postmaster on /home/pg12/pgdata, port 2019)
============== dropping database “contrib_regression” ==============
NOTICE: database “contrib_regression” does not exist, skipping
DROP DATABASE
============== creating database “contrib_regression” ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries ==============
test my_tochar_test … diff: /home/pg12/postgresql-12beta4/contrib/my_tochar/expected/my_tochar_test.out: No such file or directory
diff command failed with status 512: diff “/home/pg12/postgresql-12beta4/contrib/my_tochar/expected/my_tochar_test.out” “/home/pg12/postgresql-12beta4/contrib/my_tochar/results/my_tochar_test.out” > “/home/pg12/postgresql-12beta4/contrib/my_tochar/results/my_tochar_test.out.diff”
make: *** [installcheck] Error 2
检查错误可以发现,缺少两个目录results和expected。我们要将期望的结果写入expected/array_ext_test.out,执行测试 SQL 输出的结果会写入results/array_ext_test.out。这样,通过 diff 这两个文件的内容差异,就能验证结果是否符合预期。
pg12@oracle-> mkdir -p expected/
pg12@oracle-> mkdir -p results/
pg12@oracle-> touch expected/my_tochar_test.out
继续测试:
pg12@oracle-> make installcheck
/home/pg12/pgsql12.4/lib/pgxs/src/makefiles/../../src/test/regress/pg_regress --inputdir=./ --bindir='/home/pg12/pgsql12.4/bin' --dbname=contrib_regression my_tochar_test
(using postmaster on /home/pg12/pgdata, port 2019)
============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries ==============
test my_tochar_test ... ok 11 ms=====================All 1 tests passed.
=====================
提示成功!
以上就是一个简单开发一个 PostgreSQL 扩展的所需的基本方法。
PostgreSQL插件开发1相关推荐
- PostgreSQL插件开发踩坑之路1
在根据博客http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/中的教程创建自己的extension时,遇到了几个问题 ...
- 数据库案例集锦 - 开发者的《如来神掌》
标签 PostgreSQL , PG DBA cookbook , PG Oracle兼容性 , PG 架构师 cookbook , PG 开发者 cookbook , PG 应用案例 背景 「剑魔独 ...
- Kong 1.0正式发布,提供服务网格支持和插件开发工具包
Kong Inc.已经发布了Kong 1.0,这是其旗舰API网关产品的最新正式版本(GA).虽然通常是部署在网络边缘处理外部"南北"API流量,但Kong也可以作为"服 ...
- Postgresql 日志收集
PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...
- pg数据库开启远程连接_如何运行远程客户端连接postgresql数据库
如何运行远程客户端连接 postgresql 数据库 前提条件是 2 个: 1 , pg_hba.conf 里面配置了运行远程客户机连接 pg_hba.conf 配置后需要重新加载 reload 生效 ...
- Postgresql:删除及查询字段中包含单引号的数据
Postgresql:删除及查询字段中包含单引号的数据 1. 假设pg表t_info的属性att,值为固定的:'test' 2. 假设值为不固定的,'abcde' 参考 1. 假设pg表t_info的 ...
- postgresql Insert插入的几个报错
postgresql Insert插入的几个报错 1. org.postgresql.util.PSQLException: 未设定参数值 2 的内容. 2. postgresql : column ...
- 【Postgresql】触发器某个字段更新时执行,行插入或更新执行
[Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...
- PostgreSql、MySql字段值为空时取其他值语句
PostgreSql: COALESCE(expr1,expr2) COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的,如果参数都是null会报错. sele ...
最新文章
- 常用软件架构模式分类
- 求二叉树中叶子结点的个数
- 枚举类能继承吗?能被继承吗?
- chrome自动提交文件_实用!8个 chrome插件玩转GitHub,单个文件下载小意思
- jstl 处理Date 时间
- Linux中的15个‘echo’ 命令实例
- pillow python 划线_Python-PIL(pillow)图片处理入门(一)
- 【OJ】洛谷顺序结构题单题解锦集
- shell判断数组内是否包含某成员,获取数组长度
- 【树莓派】树莓派3B安装宝塔面板并配置安装LNMP
- GET和POST方式提交参数给web应用
- python决策树 value_直播案例 | 决策树、随机森林和 AdaBoost 的 Python 实现
- 成功的软件系统=成熟产品+全面配置+专业定制
- 路飞学城Python-Day108
- “李刚畅谈Java编程人生”讲座
- 在苹果Mac中如何使用 BetterZip 将文件压缩到指定目录下?
- AD学习之旅(10)— 导入元器件到PCB文件
- 4.1 51单片机-定时器使用
- 谈一下对计算机网络技术的认识,浅谈对计算机网络的认识
- clickhouse ARRAY JOIN函数
热门文章
- js复制与粘贴(单行复制/换行复制)
- 数据库读写分离数据延迟解决方案
- express框架中res和rep属性
- 怀旧服服务器炸了修复,《魔兽世界》怀旧服重大故障全服崩溃 官方道歉补偿 玩家:就这?...
- 关于uniapp 打包小程序包过大问题
- 第三届中国人工智能大赛 过滤算法鲁棒性赛项 Docker赛题提交过程
- OSChina 周三乱弹 ——烧坏了也不给你
- 010,Jquery循环遍历
- JS中数组查询的方法indexOf()、lastIndexOf()、includes()、find()、findIndex()、filter()、every()
- win10域增加计算机本地用户,win10肿么从域用户登陆本地账户