使用golang 编写postgresql 扩展
postgresql 的扩展可以帮助我们做好多强大的事情,支持的开发语言有lua、perl、java、js、c
社区有人开发了一个可以基于golang开发pg 扩展的项目,使用起来很方便,同时为我们生成了
pg 扩展依赖的文件 control 、sql 文件,以及编译好的共享库
注意我使用的是centos7 操作系统
环境准备
- golang 安装&&配置
这个比较简单,可以直接使用yum 安装,可能需要配置环境变量,以支持bin 工具的使用
- 安装plgo
go get -u github.com/microo8/plgo/plgo
- 安装对应版本的pg server dev 包
注意安装版本的问题,当前master 分支支持的是pg11 需要checkout 最近几次修改的变动以支持pg10
pg10 支持版本
cd $GOPATH/src/github.com/microo8/plgo/
git checkout efae75298155d8f66a9c28a788e4def50916c
- 安装pg server dev 包
pg10
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
pg11
yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
简单测试
为了简单,直接使用的官方的example 代码
- 构建
cd $GOPATH/src/github.com/microo8/plgo/example
plgo ./
- 效果
├── build
│ ├── example--0.1.sql
│ ├── example.control
│ ├── example.h
│ ├── example.so
│ └── Makefile
└── example_methods.go
- 代码说明
创建了一个函数以及一个触发器
example--0.1.sql 内容
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION example" to load this file. \quit
CREATE OR REPLACE FUNCTION Meh()
RETURNS VOID AS
'$libdir/example', 'Meh'
LANGUAGE c VOLATILE STRICT;
COMMENT ON FUNCTION Meh() IS 'Meh prints out message to error elog
';
CREATE OR REPLACE FUNCTION ConcatAll(tableName text,colName text)
RETURNS text AS
'$libdir/example', 'ConcatAll'
LANGUAGE c VOLATILE STRICT;
COMMENT ON FUNCTION ConcatAll(text,text) IS 'ConcatAll concatenates all values of an column in a given table
';
CREATE OR REPLACE FUNCTION CreatedTimeTrigger()
RETURNS TRIGGER AS
'$libdir/example', 'CreatedTimeTrigger'
LANGUAGE c VOLATILE STRICT;
COMMENT ON FUNCTION CreatedTimeTrigger() IS 'CreatedTimeTrigger example trigger
';
CREATE OR REPLACE FUNCTION ConcatArray(strs text[])
RETURNS text AS
'$libdir/example', 'ConcatArray'
LANGUAGE c VOLATILE STRICT;
COMMENT ON FUNCTION ConcatArray(text[]) IS 'ConcatArray concatenates an array of strings
';
example.control 文件
# example extension
comment = 'example extension'
default_version = '0.1'
Makefile
EXTENSION = example
DATA = example--0.1.sql # script files to install
# REGRESS = example_test # our test script file (without extension)
MODULES = example # our c module file to build
# postgres build stuff
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
- 安装
make install
效果
make install
/usr/bin/mkdir -p '/usr/pgsql-10/share/extension'
/usr/bin/mkdir -p '/usr/pgsql-10/share/extension'
/usr/bin/mkdir -p '/usr/pgsql-10/lib'
/usr/bin/install -c -m 644 .//example.control '/usr/pgsql-10/share/extension/'
/usr/bin/install -c -m 644 .//example--0.1.sql '/usr/pgsql-10/share/extension/'
/usr/bin/install -c -m 755 example.so '/usr/pgsql-10/lib/'
使用扩展
- 创建扩展
CREATE EXTENSION example;
CREATE EXTENSION
- 使用扩展
select concatarray(array['foo','bar']);
concatarray
-------------
foobar
说明
plgo 是基于cgo 进行的扩展开发,进行了包装,同时帮助我们生成了好多方便的代码,我们可以像编写普通golang
代码一样,编写pg 扩展,很方便,实际上我们可以基于rpm 包以及deb 包方便的分发我们的扩展。
参考资料
https://github.com/microo8/plgo
https://www.opsdash.com/blog/postgresql-triggers-golang.html
https://github.com/microo8/plgo/issues/28
https://www.postgresql.org/download/linux/redhat/
https://www.cnblogs.com/rongfengliang/p/10655310.html
https://www.cnblogs.com/rongfengliang/p/10654768.html
https://www.cnblogs.com/rongfengliang/p/10650888.html
https://gist.github.com/rongfengliang/53c11c85fb52185f23b24383c2d8faf0
使用golang 编写postgresql 扩展的更多相关文章
- 编写Postgres扩展之三:调试
原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-iii/ 编译:Tacey Wong 在上一篇关于编写Post ...
- 用Zephir编写PHP扩展
自从NodeJS,和Golang出来后,很多人都投奔过去了.不为什么,冲着那牛X的性能.那PHP的性能什么时候能提升一下呢?要不然就会被人鄙视了.其实大牛们也深刻体会到了这些威胁,于是都在秘密开发各种 ...
- 编写Postgres扩展之五:代码组织和版本控制
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...
- 编写Postgres扩展之一:基础
原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/ 编译:Tacey Wong Postgres提供了广泛的 ...
- 一步步入门编写PHP扩展
1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问 ...
- 编写Postgres扩展之四:测试
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-iv/ 编译:http://big-elephants.com ...
- 编写 Chrome 扩展——contextMenus 的快捷创建
1 写在前面 最近使用 typescript 与 angular 编写 chrome 扩展, 对繁复的 contextMenus 创建步骤进行了提炼,并总结一个类 2 重构思路 2.1 一般方法 在编 ...
- Golang编写动态库实现回调函数
Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...
- 编写Postgres扩展之二:类型和运算符
原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-ii/ 编译:Tacey Wong 在上一篇关于编写Postg ...
随机推荐
- Vue:(五)axios
Axios是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.axios主要是用于向后台发起请求的,还有在请求中做更多可控功能.官方不再维护vue-resource,推 ...
- jquery 判断元素是否可见
if($('#progress_bar').is(":visible")){ $('#progress_bar').hide(); }
- Python语法注意点
1. 在Python中定义函数,可以用必选参数.默认参数.可变参数.关键字参数和命名关键字参数,这5种参数都可以组合使用.但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关键字参数 ...
- 第 8 章 容器网络 - 071 - 如何定制 Calico 的 IP 池?
定制IP池 首先定义一个 IP Pool,比如: calicoctl create -f ipPool.yml 用此 IP Pool 创建 calico 网络. docker network crea ...
- Python自学:第二章 浮点数
>>>0.1 + 0.1 0.2 >>>0.2 + 0.2 0.4 >>>2 * 0.1 0.2 >>>2 * 0.2 0.4
- CRM INBOX 结果增强功能
前段时间接到的需求:INBOX(ICCMP_INBOX)查询结果,多选后弹出选择用户的框,选择用户,带入到单据的PARTNER FUNC的工程师中,并修改单据状态. 其实标准的INBOX的Compon ...
- Android : 跟我学Binder --- (6) JAVA实现
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- 从零开始学Shell(二)
$1,$2....${10},${11},[root@localhost cee]# cat p.sh #!/bin/bash#file_name:p.shecho $1 $2[root@localh ...
- LeetCode 47 全排列II
题目: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路: 与上一题相比,这题多了一 ...
- Netty的ByteToMessageDecoder/LengthFieldBasedFrameDecoder
是个inbound handler,channelRead方法里面,用一个bytebuf(cumulation)来把下一个数据包和当前这一个拼在一起,以免同一个请求被拆包.然后callDecode,里 ...