PostgreSQL
pg+debezium+kafka实时同步
三机patroni+etcd高可用
基于Python实现大批量dataframe格式数据快速存入postgresql
python数据批量插入postgreSQL数据库
pg 插件扩展(extension)开发
psql 连接数据库的方法
pg 函数返回表、数据集、结果集
pg 日志记录 异常处理
pg 作业调度器 pg_timetable
pg 查询对象的权限
正则表达式去除注释
pg 数据库高可用及负载均衡JDBC参数
pg 生成节假日
pg_recvlogical 解析日志
pg 查看锁表
pg upsert写法
pg 查看函数或存储过程的定义
plpgsql 代码块
pg 查看表的膨胀率
pg 获取表大小
pg 非物化视图所有者刷新物化视图
本站点使用 MrDoc 构建
-
+
首页
pg 插件扩展(extension)开发
## 插件扩展开发基本步骤 * 在源码目录的`contrib/`目录下创建与扩展名同名的文件夹,在该文件夹内存放开发好的扩展源码文件,包含`MakeFile`文件、`.sql`文件、`.control`控制文件等 * 在该目录下,执行make命令,进行编译 * 将编译生成的`so`文件和`sql`文件迁移至安装目录的`lib`和`extension`下 * 将`so`文件和`sql`文件修改权限和用户组 * 最后再在数据库中添加扩展:`create extension 扩展名`; ## 插件扩展开发使用的语言 > `PostgreSQL`支持使用`PL/pgSQL`语言或者原生的`C`语言开发扩展。`PL/pgSQL`开发相对简单,但性能上较原生的`C`语言要差。只需要通过指定`sql`文件的`CREATE FUNCTION`的`LANGUAGE`参数即可。 ## 示例:纯 sql 插件 * 文件列表 ``` test_add/ 目录,扩展名一致 ├── Makefile Makefile文件 ├── test_add--1.0.sql .sql文件 └── test_add.control .control文件 ``` * `test_add--1.0.sql` 文件 ```sql -- 如果脚本是由 psql 而不是 CREATE EXTENSION 执行,则报错 -- \echo开始的行,会被扩展机制认为是注释行,如果脚本文件被送给psql而不是由CREATE EXTENSION载入,这种机制通常被用来抛出错误 \echo Use "CREATE EXTENSION test_add" to load this file. \quit CREATE FUNCTION test_add(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; ``` * `test_add.control` 文件 ``` comment = 'create add function' # 添加扩展注释 default_version = '1.0' # 指定默认扩展版本 relocatable = false # 设置扩展是否可重定向 ``` * `Makefile` 文件 ``` EXTENSION = test_add DATA = test_add--1.0.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) ``` * `make && make install` ``` make && make install ``` * 创建 extension ``` create extension if not exists test_add; select public.test_add(1,1); ``` ## 示例:c 语言插件 * 文件列表 ``` test_c_add/ 目录,扩展名一致 ├── Makefile Makefile文件 ├── test_c_add--1.0.sql .sql文件 ├── test_c_add.c C源文件 └── test_c_add.control .control文件 ``` * `test_c_add.c` 文件 ```c #include "postgres.h" //包含 PostgreSQL 基础的接口。这是开发 PostgreSQL 扩展必需包含的头文件 #include "fmgr.h" // 包含了PG_GETARG_XX和PG_RETURN_XX等获取参数和返回结果的重要的宏,是必需的 #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; // 从 PostgreSQL 8.2版本后就必须的宏,必须写在#include "fmgr.h"之后 #endif PG_FUNCTION_INFO_V1(add); // PG_FUNCTION_INFO_V1宏声明了我们所定义的函数为 Version-1 约定的函数,需要在定义方法之前先进行声明 Datum add(PG_FUNCTION_ARGS); Datum add(PG_FUNCTION_ARGS) // Datum 等同于void,表示函数返回任意类型的数据 { int sum,a,b; a = PG_GETARG_INT32(0); // 获取函数的第一个参数的值,并且将其转换为 int 类型 b = PG_GETARG_INT32(1); sum = a + b; PG_RETURN_INT32(sum); // 将结果转换为 int 类型并返回,也有其他类型的返回值:float、json } ``` * `test_c_add--1.0.sql` 文件 ```sql -- 如果脚本是由 psql 而不是 CREATE EXTENSION 执行,则报错 -- \echo开始的行,会被扩展机制认为是注释行,如果脚本文件被送给psql而不是由CREATE EXTENSION载入,这种机制通常被用来抛出错误 \echo Use "create EXTENSION add_c_test" to load this file. quit CREATE FUNCTION test_c_add(integer, integer) RETURNS integer AS '$libdir/test_c_add' LANGUAGE C STRICT IMMUTABLE; ``` * `test_c_add.control` 文件 ``` comment = 'create add function' # 添加扩展注释 default_version = '1.0' # 指定默认扩展版本 relocatable = true # 设置扩展是否可重定向 ``` * `Makefile` 文件 ```bash MODULE_big = test_c_add OBJS = test_c_add.o EXTENSION = test_c_add DATA = test_c_add--1.0.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) ``` * `make && make install` ``` make && make install ``` * 创建 extension ``` create extension if not exists test_c_add; select public.test_c_add(1,1); ```
vleity
2025年6月19日 16:27
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码