PostgreSQL 安装PYTHON扩展,访问页面或者第三方程序
应用场景当数据库中relation表中有数据插入、更新、删除操作,postgresql 调用第三方接口,进行处理。这里用pgsq 中python的扩展插件来实现。
1、安装PostgreSQL中的Python 插件
1.1 安装plpython3u 在windows环境
我本地的pgsql 安装的是pgsql12的版本,由于版本的不同,需要下载的python 版本也不同。12版本python3.7 可以运行具体下载地址:https://www.python.org/ftp/python/3.7.7/python-3.7.7-amd64.exe
检查Postgresql的安装目录下面的 lib 文件夹有没有 plpython3.dll 。这是Postgresql 调用Python 3.X的DLL文件.如果是老的pgsql9之前的版本调用的是plpythonu.dll对应的python2.x的版本。参考文章:https://blog.csdn.net/weixin_34405332/article/details/92575854
新建QueryTool,执行 CREATE EXTENSION plpython3u;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIx0DciV2dmADM30zd-cmbw5CRzUCRzUydaVnQuxUNjRkTxMmeONTSE5EdJRlT6FFVNRTUU5EeBpWTxEERNlXQq1EdjRVT5tmeOBDOT50dBpWT3lkeMNTRq1UNjRkT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
如:报错"
ERROR: could not load library "C:/Program Files/PostgreSQL/12/lib/plpython3.dll": The specified module could not be found.
"
1、 复制C:\Python37\DLLs\python3.dll到C:\Program Files\PostgreSQL\12\lib下 重命名python37.dll
继续执行如果还报错,将python37.dll 复制到C:\Window\System32 下,执行成功
1.2 安装plpython3u 在liunx环境
检查pgsql 是否安装插件plpython3u,在 界面上输入 su postgres 切换至postgres用户,输入psql 进入查询语句,输入select name from pg_available_extensions; 查看安装的扩展,如下图:
这里发现没有装扩展plpython3u,进入https://www.postgresql.org/download/linux/redhat/,点击下图位置:
进入版本选择界面,选择相应的Linux的版本以及postgresql版本:查看postgresql版本,如下:
查看linux 版本,见下图:
点击选择相应的版本:
下载对应的python扩展安装包:
将下载好的 postgresql11-plpython3-11.7-1PGDG.rhel8.x86_64.rpm 放入服务器的tmp目录
cd /tmp
rpm -ivh postgresql11-plpython3-11.7-1PGDG.rhel8.x86_64.rpm
安装成功后,可以在pgsql的查询器中查看到有了python的扩展。
在pgadmin连接工具中,运行 CREATE PROCEDURAL LANGUAGE plpython3u; 运行成功
2、创建运行Python的自定义函数
CREATE OR REPLACE FUNCTION httpclient()
RETURNS text AS
$BODY$
import urllib.request
url="https://www.baidu.com/"
req=urllib.request.Request(url)
resp=urllib.request.urlopen(req)
data=resp.read().decode('utf-8')
return data
$BODY$
LANGUAGE 'plpython3u' VOLATILE;
这里用python创建一个访问baidu的自定义函数。BODY 里面放入运行的python语句,LANGUAGE 后接 要执行的扩展插件
3、创建触发器函数
CREATE fUNCTION relationtabletrigger() Returns trigger As $relationtabletrigger$
BEGIN
If(TG_OP='INSERT' or TG_OP='UPDATE' or TG_OP='DElETE' ) THEN
INSERT INTO public.baidu(
html)
VALUES (httpclient());
END IF;
RETURN null;
END;
$RelationTableTrigger$ LANGUAGE plpgsql;
当新增、更新、删除的时候,将httpclient的内容,存入到baidu的表里面
4、表绑定触发器函数
将relationtable表新建一个触发器并绑定,如下图:
CREATE TRIGGER testtriggers
BEFORE INSERT OR DELETE OR UPDATE
ON public.relationtable
FOR EACH ROW
EXECUTE PROCEDURE public.relationtabletrigger();
也可以直接在pgadmin上通过界面,新建触发器绑定触发器函数:
5、测试是否生效
ok 测试成功!