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相关推荐

  1. PostgreSQL插件开发踩坑之路1

    在根据博客http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/中的教程创建自己的extension时,遇到了几个问题 ...

  2. 数据库案例集锦 - 开发者的《如来神掌》

    标签 PostgreSQL , PG DBA cookbook , PG Oracle兼容性 , PG 架构师 cookbook , PG 开发者 cookbook , PG 应用案例 背景 「剑魔独 ...

  3. Kong 1.0正式发布,提供服务网格支持和插件开发工具包

    Kong Inc.已经发布了Kong 1.0,这是其旗舰API网关产品的最新正式版本(GA).虽然通常是部署在网络边缘处理外部"南北"API流量,但Kong也可以作为"服 ...

  4. Postgresql 日志收集

    PG安装完成后默认不会记录日志,必须修改对应的(${PGDATA}/postgresql.conf)配置才可以,这里只介绍常用的日志配置. 1.logging_collector = on/off - ...

  5. pg数据库开启远程连接_如何运行远程客户端连接postgresql数据库

    如何运行远程客户端连接 postgresql 数据库 前提条件是 2 个: 1 , pg_hba.conf 里面配置了运行远程客户机连接 pg_hba.conf 配置后需要重新加载 reload 生效 ...

  6. Postgresql:删除及查询字段中包含单引号的数据

    Postgresql:删除及查询字段中包含单引号的数据 1. 假设pg表t_info的属性att,值为固定的:'test' 2. 假设值为不固定的,'abcde' 参考 1. 假设pg表t_info的 ...

  7. postgresql Insert插入的几个报错

    postgresql Insert插入的几个报错 1. org.postgresql.util.PSQLException: 未设定参数值 2 的内容. 2. postgresql : column ...

  8. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    [Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...

  9. PostgreSql、MySql字段值为空时取其他值语句

    PostgreSql: COALESCE(expr1,expr2) COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的,如果参数都是null会报错. sele ...

最新文章

  1. 常用软件架构模式分类
  2. 求二叉树中叶子结点的个数
  3. 枚举类能继承吗?能被继承吗?
  4. chrome自动提交文件_实用!8个 chrome插件玩转GitHub,单个文件下载小意思
  5. jstl 处理Date 时间
  6. Linux中的15个‘echo’ 命令实例
  7. pillow python 划线_Python-PIL(pillow)图片处理入门(一)
  8. 【OJ】洛谷顺序结构题单题解锦集
  9. shell判断数组内是否包含某成员,获取数组长度
  10. 【树莓派】树莓派3B安装宝塔面板并配置安装LNMP
  11. GET和POST方式提交参数给web应用
  12. python决策树 value_直播案例 | 决策树、随机森林和 AdaBoost 的 Python 实现
  13. 成功的软件系统=成熟产品+全面配置+专业定制
  14. 路飞学城Python-Day108
  15. “李刚畅谈Java编程人生”讲座
  16. 在苹果Mac中如何使用 BetterZip 将文件压缩到指定目录下?
  17. AD学习之旅(10)— 导入元器件到PCB文件
  18. 4.1 51单片机-定时器使用
  19. 谈一下对计算机网络技术的认识,浅谈对计算机网络的认识
  20. clickhouse ARRAY JOIN函数

热门文章

  1. js复制与粘贴(单行复制/换行复制)
  2. 数据库读写分离数据延迟解决方案
  3. express框架中res和rep属性
  4. 怀旧服服务器炸了修复,《魔兽世界》怀旧服重大故障全服崩溃 官方道歉补偿 玩家:就这?...
  5. 关于uniapp 打包小程序包过大问题
  6. 第三届中国人工智能大赛 过滤算法鲁棒性赛项 Docker赛题提交过程
  7. OSChina 周三乱弹 ——烧坏了也不给你
  8. 010,Jquery循环遍历
  9. JS中数组查询的方法indexOf()、lastIndexOf()、includes()、find()、findIndex()、filter()、every()
  10. win10域增加计算机本地用户,win10肿么从域用户登陆本地账户