PostgreSQL如何支持PL/Python过程语言
  m0tkEH0JaYWA 2023年11月02日 37 0

瀚高数据库

目录

环境

文档用途

详细信息


环境

系统平台:Linux x86-64 Red Hat Enterprise Linux 7

版本:10.4


文档用途

本文档主要介绍PostgreSQL如何支持PL/Python过程语言,如何创建plpython扩展。


详细信息

一、PostgreSQL支持python语言的前提条件

1、本地必须安装python

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

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

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的版本

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

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的版本

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

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的版本。

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

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的相关文件

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

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库文件

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



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 达梦笔记 下一篇: 单元测试之测试目的
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月31日   26   0   0 PostgreSQL
  xaeiTka4h8LY   2024年05月31日   44   0   0 MySQL数据库
  xaeiTka4h8LY   2024年05月17日   54   0   0 数据库JavaSQL
  xaeiTka4h8LY   2024年05月17日   54   0   0 数据库SQL
  xaeiTka4h8LY   2024年05月17日   38   0   0 MySQL数据库
  xaeiTka4h8LY   2024年05月31日   41   0   0 数据库mongodb
m0tkEH0JaYWA