PostgreSQL如何支持PL/Python过程语言

2023-09-22 15:15:52

瀚高数据库
目录
环境
文档用途
详细信息

环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:10.4
文档用途
本文档主要介绍PostgreSQL如何支持PL/Python过程语言,如何创建plpython扩展。

详细信息
一、PostgreSQL支持python语言的前提条件

1、本地必须安装python

python有python2和python3的版本,执行下面命令查看python版本

image.png

2、本地必须有python的动态库文件,例如libpython2.7.so.1.0、libpython3.10.so.1.0

3、编译PG源码时,./configure必须配置–with-python

./configure --prefix=/home/pg10_python/pgdb --with-python

执行该配置命令时,会check本地是否已安装python,且是否存在必要的python库文件,同时还会选择python版本。

python版本的选择是根据/bin或者/usr/bin目录下的python命令指向的版本决定的。

例如:

1)python和python-config指向的是python2的版本

image.png

PG源码中执行./configure时,使用的是python2

[pg10_python@localhost postgresql-10.21]$ ./configure --prefix=/home/pg10_python/pgdb --with-python

......

checking for python... /bin/python

configure: using python 2.7.5 (default, Jun 28 2022, 15:30:04)

......

2)python和python-config指向的是python3的版本

image.png

PG源码中执行./configure时,使用的是python3

[pg10_python@localhost postgresql-10.21]$ ./configure --prefix=/home/pg10_python/pgdb --with-python

......

checking for python... /bin/python

configure: using python 3.10.5 (main, Jul 21 2022, 16:11:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

......

二、PG源码中包含python模块的源码,在/src/pl/plpython目录下,该目录下包含plpython2u和plpython3u两个版本,plpythonu默认使用python2的版本。

image.png

plpython2u对应python2,plpython3u对应python3

三、以python3为例,编译PG源码实现对python的支持

1、编译PG源码

[pg10_python@localhost ~]$ cd tmp/postgresql-10.21/

[pg10_python@localhost postgresql-10.21]$ ./configure --prefix=/home/pg10_python/pgdb --with-python

[pg10_python@localhost postgresql-10.21]$ make

[pg10_python@localhost postgresql-10.21]$ make install

2、PG安装完成后,查看生成的python3的相关文件

image.png

3、初始化data目录,然后在数据库中创建python扩展

##连接数据库

[pg10_python@localhost bin]$ ./psql -U postgres -d postgres -p 5432

##创建plpython扩展

postgres=# create extension plpython3u;

CREATE EXTENSION

postgres=# \dx plpython3u

                         List of installed extensions

    Name    | Version |   Schema   |                Description

------------+---------+------------+-------------------------------------------

 plpython3u | 1.0     | pg_catalog | PL/Python3U untrusted procedural language

(1 row)

##创建plpython3u语言的函数

postgres=# CREATE OR REPLACE FUNCTION pyclean(arg text)

  RETURNS text

AS $$

global arg

import re

arg=str(arg)

arg=arg.strip(' ,')#去掉首尾空格

if arg == '' or arg == 'None':

    arg=None

return arg

$$ LANGUAGE plpython3u;

CREATE FUNCTION

##测试python函数

postgres=# select length(pyclean('abc d e f  '));

 length

--------

      9

(1 row)

四、正在运行的PG库中如何创建python扩展

一个场景是安装PG库时,并没有配置–with-python,导致PG库不能编写python函数。

那么在不重新安装且不重启数据库的前提下如何支持python,有以下步骤:

1、执行当前数据库的bin目录下的pg_config命令,用于查看CONFIGURE的配置内容

[pg10_python@localhost bin]$ ./pg_config

......

CONFIGURE = '--prefix=/home/pg10_python/pgdb_nopython'

......

2、跳转到PG源码目录,加上–with-python重新配置一下

注:只做配置,不执行make和make install

[pg10_python@localhost ~]$ cd tmp/postgresql-10.21/

[pg10_python@localhost postgresql-10.21]$ ./configure --prefix=/home/pg10_python/pgdb_nopython --with-python

3、配置完成后,单独编译安装PG源码中的plpython源码

[pg10_python@localhost postgresql-10.21]$ cd src/pl/plpython/

[pg10_python@localhost plpython]$ make

[pg10_python@localhost plpython]$ make install

4、编译安装后,在数据库中就可以查到该扩展

postgres=# select * from pg_available_extensions where name like '%plpython%';
    name    | default_version | installed_version |                  comment

------------+-----------------+-------------------+-------------------------------------------

 plpython3u | 1.0             | 1.0               | PL/Python3U untrusted procedural language

(1 row)

5、创建plpython3u扩展,编写函数测试即可。

注:必须加上–with-python重新配置一下,否则直接编译plpython会失败

五、查看PG的lib目录下编译生成的plpython库文件的依赖

plpython3.so依赖python3版本的libpython3.10.so.1.0库文件

image.png

更多推荐

神领物流 day01-项目概述 Spring Cloud Alibaba 微服务

课程安排了解神领物流了解物流行业了解项目的技术架构了解项目的业务功能项目功能演示搭建开发环境基于现有代码进行bug修复阅读已有的代码1、场景说明现在的你,已经学习了目前最主流的系统架构技术《微服务技术栈》,并且呢也拿到了满意的offer,入职了一家物流公司,公司名叫:神领物流公司。现在你的心情还是比较复杂的,既开心又担

腾讯K线修复运营版 股票配资系统安装搭建 二次开发 新接口

实盘接口心跳publicstaticfunctionheart(){$heart=newHeart();$heart->heart();return;}预警线=配资金额+保证金*比例先搜索配资表(条件操盘中)搜子账号ID去持仓表查询股票数量如何数量是0不继续做判断搜到的股票数量用z_market_bat函数,查询股票返

Nacos身份绕过漏洞复现(QVD-2023-6271)

一、背景nacos安全预警,对问题复现后进行修复。漏洞原理为开源服务管理平台Nacos在默认配置下未对token.secret.key进行修改,导致远程攻击者可以绕过密钥认证进入后台造成系统受控等后果。漏洞信息漏洞类型:身份认证绕过漏洞等级:高危漏洞编号:NVDB-CNVDB-2023674205漏洞影响范围:0.1.

【QT--使用百度地图API显示地图并绘制路线】

QT--使用百度地图API显示地图并绘制路线前言准备工作申请百度地图密钥(AK)安装开发环境开发过程新建项目ui界面GPSManager类主窗口Map效果展示前言先吐槽一下下,本身qt学的就不咋滴,谁想到第一件事就是让写一个上位机工具,根据CAN总线传来的位置信息,在地图上去绘制路线,并获取当前路段的限速信息等。当听到

android系统编译

本文主要参考官方文档(http://source.android.com/download)和网上相关资料(http://blog.csdn.net/HKjinzhao/archive/2009/03/18/4002326.aspx,http://www.williamhua.com/2009/04/30/how-to

pg常用插件

pg软件包自带插件前言pg的插件是基于库的;pg的数据字典介绍:1、pg_stat_statements插件Pg_stat_statements是一个扩展,而不是核心数据库的一部分。它是一个contrib扩展,随postgres源代码一起提供。pg_stat_statements的功能位于一个名为pg_stat_sta

项目进度管理有哪些方法?项目管理中的进度管理

项目进度管理是项目实施过程中,根据制定的计划对各阶段的任务和项目最终完成的期限所进行的管理。在执行该计划的过程中,检查实际进度是否按计划要求进行,若出现偏差,便要及时找出原因,采取必要的措施或调整,直至项目完成。保证项目能在满足其时间约束条件的前提下实现总体目标。管事:项目进度管理主要涉及到对项目的任务进行分解,并设计

uniapp 使用subNVue原生子窗体显示弹框或悬浮框

效果展示在uniapp中,我们可以使用subNVue原生子窗体来解决web-view等原生页面中弹框无法显示的问题。subNVue原生子窗体是uniapp提供的一种原生组件,可以在uniapp中嵌入原生页面,并且可以与uniapp页面进行通信。我们可以在原生页面中使用uniapp提供的API来与uniapp页面进行通信

【开发篇】二、属性绑定与校验

文章目录1、@ConfigurationProperties自定义Bean属性绑定2、@EnableConfigurationProperties注解3、@ConfigurationProperties第三方Bean属性绑定4、松散绑定5、常用计量单位6、数据校验7、yaml绑定值的坑--关于进制1、@Configur

玩转 gpgpu sim 02记 —— 构建了什么

1.设置环境变量编译gpgpu-sim需要先运行脚本setup_environment,sourcesetup_environment,注释如下,主要是设置一些Makefile中会用到的环境变量#seeREADMEbeforerunningthis#下面这句用来检测当前的shell环境是不是bash或者sh或者zsh,

Jtti:新加坡云服务器怎么部署javaweb

在新加坡云服务器上部署JavaWeb应用程序需要执行以下步骤:1.准备云服务器:首先,您需要租用或创建一个新加坡地区的云服务器,确保服务器的操作系统和硬件资源满足您的需求。2.安装Java环境:确保您的服务器上已经安装了Java开发环境(JDK)。您可以使用以下命令来检查是否已经安装:java-version如果未安装

热文推荐