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


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

    环境
    系统平台: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
    
    • 1

    执行该配置命令时,会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)
    
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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)]
    
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    四、正在运行的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'
    
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    • 1
    • 2
    • 3

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

    [pg10_python@localhost postgresql-10.21]$ cd src/pl/plpython/
    
    [pg10_python@localhost plpython]$ make
    
    [pg10_python@localhost plpython]$ make install
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

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

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

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

    image.png

  • 相关阅读:
    【RT-Thread】nxp rt10xx 设备驱动框架之--pwm搭建和使用
    事件修饰符
    day31-JQuery04
    【校招VIP】专业课考点之网络存储
    JAVA毕设项目客服管理系统(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)
    深度学习损失函数 分类损失回归损失
    KDE(Kernel Density Estimation)(核密度估计)是什么?
    Vue2:路由history模式的项目部署后页面刷新404问题处理
    基于Nodejs的心理咨询微信小程序的设计和实现
    A. Row GCD(更相减损术+gcd的性质)
  • 原文地址:https://blog.csdn.net/pg_hgdb/article/details/133171743