目录
一、概述
二、编译opengauss支持Python3存储过程
三、还有问题
一、概述
OpenGauss是可以支持以Python2、3编写存储过程的,但是这个功能默认不开启,想要这个功能要自己编译源码,目前这部分源码感觉不够成熟,还有一些问题,但也勉强能用。
二、编译opengauss支持Python3存储过程
configure时加入 --with-python ,我的编译选项如下:
./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib --enable-llvm --enable-mot --with-python
我的编译环境,使用的是我自己编译的Python3,这样就有了相关的头文件和so文件:
我使用的opengauss代码版本是 b82d56991745a , 即opengauss-5.0.0,编译时遇到了一些编译错,似乎对Python存储过程的支持还有问题,但是做了一些修改后,可以成功编译,这些修改如下:
首先是configure里获取python命令的地方,由于我的Python3是自己编的,并且已经把Python3的bin和lib目录加到PATH和LD_LIBRARY_PATH,这里替换为PYTHON=python3.8是为了使用我的头文件和动态库来链接。
这里估计是编码错误,不解释。
这里如果不注释的话,create extension plpython3u 时会报 "new language is not yet supported.",这个问题社区里反映过了,有人还提交了修改,但是这个版本还是有问题,不知道怎么搞的。
然后编译、安装、初始化,启动,我就不说了。
然后create extension,创建python存储过程:
create extension plpython3u;
create or replace function pymax(a int, b int)
returns int
language plpython3u
as $$
import numpy
if a > b:
return a
else:
return b
$$;select pymax(10, 3);
三、还有问题
上面的python3存储过程,python3代码是在gaussdb这个进程中的一个线程中运行,这样没啥问题。但是opengauss还提供一个fenced模式,就是再开启一个进程专门用来执行用户定义的存储过程,再把结果传递给gaussdb进程,官方的解释是,这个可以用于调试,在存储过程段错误时,不会导致gaussdb段错误。(需要配置参数unix_socket_directory 参看 Plpython Fenced模式 (opengauss.org))
问题是,我尝试过fenced模式创建和执行python3存储过程,是有问题的,简单的说就是执行以fenced关键字创建的python3存储过程时,报错:
ERROR: The connection between 'pg_154' and 'UDF Master/Worker' maybe closed. 'pg_154' recv 0 bytes. Error: Success
CONTEXT: referenced column: pymax
并且gaussdb进程段错误。
具体参看:
修复执行python脚本函数报错的问题 · Pull Request !3336 · openGauss/openGauss-server - Gitee.com
目前5.0.0的版本仍然有这个问题。