應用場景當數據庫中relationtable表中有數據插入、更新、刪除操作,postgresql 調用第三方接口,進行處理。這里用pgsq 中python的擴展插件來實現。
安裝PostgreSQL中的plpython3u 插件
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;
如:報錯"ERROR: could not load library "C:/Program Files/PostgreSQL/12/lib/plpython3.dll": The specified module could not be found.
"
復制C:\Python37\DLLs\python3.dll到C:\Program Files\PostgreSQL\12\lib下 重命名python37.dll
繼續執行如果還報錯,將python37.dll 復制到C:\Window\System32 下,執行成功
安裝plpython3u 在linux環境
檢查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; 運行成功
創建運行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 后接 要執行的擴展插件
創建觸發器函數
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的表里面
表綁定觸發器函數
將relationtable表新建一個觸發器並綁定,如下圖:
CREATE TRIGGER testtriggers BEFORE INSERT OR DELETE OR UPDATE ON public.relationtable FOR EACH ROW EXECUTE PROCEDURE public.relationtabletrigger();
也可以直接在pgadmin上通過界面,新建觸發器綁定觸發器函數:
測試是否生效
ok 測試成功!