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

news/2024/7/9 22:26:54 标签: postgresql, python, 数据库

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

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

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

1、本地必须安装python

pythonpython2和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)pythonpython-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)pythonpython-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


http://www.niftyadmin.cn/n/5042364.html

相关文章

【Stm32】【Lin通信协议】Lin通信点亮灯实验

Lin通信点亮灯实验 通过STM32的串口发送数据,然后通过串口转换模块将数据转换成LIN(Local Interconnect Network)协议,最终控制点亮灯。需要工程和入门资料的可以私信我,看到了马上回。 入门书本推荐: 一…

多模块和分布式项目

一、什么是多模块项目 多模块项目是一种软件项目组织结构,其中一个大型项目被分成多个独立的子模块或子项目。每个子模块通常具有自己的功能、目录结构和开发周期,但它们可以协同工作以构建一个完整的应用程序。这种项目结构有助于提高代码的可维护性、…

知识付费平台开发技术实践:构建数字学习的未来

引言 知识付费平台的兴起正在塑造着数字学习的未来。本文将介绍一些关键的技术实践,帮助开发者构建强大的知识付费平台,提供出色的数字学习体验。 1. 选择适当的技术栈 在开始知识付费平台的开发之前,首要任务是选择适当的技术栈。这包括…

【java打包下载zip树形结构】打包的时候在zip里创建文件夹自定义路径

1、测试类 import lombok.Data;Data public class ZipVo {//文件路径:开始和结束都要/斜杠,生成属性文件夹private String pathName;//文件数据private String data;private String type;//后缀suffixprivate String suffix; }2、控制器 import com.ek…

brpc 学习(一)M1 MacOS构建方法

tags: brpc categories: brpc 写在前面 实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来,…

A Survey on Fairness in Large Language Models

本文是LLM系列文章,针对《A Survey on Fairness in Large Language Models》的翻译。 大型语言模型中的公平性研究综述 摘要1 引言2 评估度量3 内在去偏4 外部去偏5 大型LLM的公平性6 讨论7 结论 摘要 大型语言模型(LLM)已经显示出强大的性…

前端三件套速成

一、HTML 1、基本的文档结构 <!doctype html> <html lang"en-US"><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width" /><title>My test page</title></…

通过实现HandlerInterceptor接口实现一个拦截器

1. 简介 web应用开发中&#xff0c;拦截器的应用场景非常广泛&#xff0c;主要用于&#xff1a; 登陆验证&#xff1a;提取request中请求头携带的token信息&#xff1b;鉴权&#xff1a;判断该用户是否有权限访问某个资源日志记录&#xff1a;记录该handler的入 和 出性能监控…