centos-postgresql-plpython3.md 5.6 KB

centos7/postgresql(安装pl/python3扩展插件, 编写pl/python3方法)

安装python3

1. 安装相关包: 
    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
    yum install libffi-devel -y
    cd /usr/bin

2. 备份旧python命令(软连接): 
    mv python python.bak
    cd

3. 下载压缩包: wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
解压: tar -xvJf Python-3.7.3.tar.xz

4. 编译安装:./configure --enable-shared --prefix=/usr/local/python3 --enable-optimizations LDFLAGS="-Wl,--rpath=/usr/local/python3/lib"
    或编译安装(非linux版本, 此处不选用): ./configure --enable-shared --prefix=/usr/local  LDFLAGS="-R/usr/local/lib"
make && make install
cd /usr/bin
制作软连接: ln -s /usr/local/python3/bin/python3 /usr/bin/python

5. 检查版本: python -V
因为yum使用python2, 所以修改yum使用python版本为2:
vi /usr/bin/yum
把#! /usr/bin/python修改为#! /usr/bin/python2
同理 vi /usr/libexec/urlgrabber-ext-down 文件里面的#! /usr/bin/python 也要修改为#! /usr/bin/python2

这样python3版本就安装完成;同时python2也存在
python -V   版本3 
python2 -V 版本2

编译安装postgresql(Centos7)

1. 编译环境和下载安装包
    更新yum: yum update
    安装wget: yum install wget
    下载源码: wget https://ftp.postgresql.org/pub/source/v11.3/postgresql-11.3.tar.gz
    解压: tar zxvf postgresql-11.3.tar.gz
    安装编译需要的命令库: yum install gcc   yum install readline-devel    yum install zlib-devel

2. 编译安装
    ./configure --with-python
    make (确保执行完最后一行出现All of PostgreSQL successfully made. Ready to install.)
    make install (最后一行出现PostgreSQL installation complete.为正常安装完成)

3. 创建用户并授权
    useradd postgres
    chown -R postgres:postgres /usr/local/pgsql


4. 配置环境变量
    切换到用户: su - postgres
    打开.bash_profile: vi ~/.bash_profile

image

    修改为如下:
        PGHOME=/usr/local/pgsql
        export PGHOME
        PGDATA=/usr/local/pgsql/data
        export PGDATA

        PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin
        export PATH

    修改完执行: source ~/.bash_profile

5. 初始化数据库
    执行: initdb(初始化完毕后有提示开启服务的命令)
    开启数据库服务: pg_ctl -D /usr/local/pgsql/data -l logfile start     (关闭 stop/重启restart)
    查看版本: psql -V
    进入控制台: psql
    进入控制台后修改密码 \password postgres

6. 配置连接规则
    在/usr/local/pgsql/data下, 有两个配置文件需要修改:
    postgresql.conf文件中, 需要配置

        listen_addresses = '*'     # 监听规则, *为监听所有

    pg_hba.conf文件中, 配置访问规则
    最后面加入一行

        host   all    all    0.0.0.0/0   trust

    详细配置可参考: 
    (https://www.cnblogs.com/flying-tiger/p/5983588.html)
    官网: https://www.postgresql.org/docs/current/auth-pg-hba-conf.html
    注: 比如对于IPv4地址来说, 172.20.143.89/32指定单个主机的IP,172.20.143.0/24代表一个小的子网。
        对于IPv6地址来说,::1/128指定单个主机(这里是本机环回地址),fe80::7a31:c1ff:0000:0000/96 指定一个IPv6的子网。
        0.0.0.0/0代表所有IPv4地址,::0/0代表所有IPv6地址。
    配置完毕之后, 需要重启数据库服务方可生效.

7. 启用并使用pl/python(plpython3u), create function
    1). 使用数据库浏览工具(比如navicat, pgAdmin4)连接刚配置完成的数据库
    2). 执行: create language plpython3u;  即创建对于python3的支持
    3). 如果需要import的库不存在, 则可以在python3/bin目录下执行pip3命令安装需要的库
        (例如: python pip3 install matplotlib 或./pip3 install matplotlib, 下面例子需要用到, 
        安装一般在python3目录下的lib/python3.7/site-packages目录下, pip3 show matplotlib可查)
    4). pip3 install matplotlib -i   
    5). 可以创建一个数据库function, 判断一个点是否在一个由多个点依次顺时针组成的面内.

示例 (注意: 输入参数名不能有大写字母)

CREATE OR REPLACE FUNCTION is_point_in_polygon(IN the_point jsonb, IN the_polygon jsonb) RETURNS boolean AS
$$
from matplotlib.path import Path
import json


points = []
poly = []
a_point = json.loads(the_point)
a_polygon = json.loads(the_polygon)
points.append(a_point["x"])
points.append(a_point["y"])
points = tuple(points)

l = len(a_polygon)
for i in range(l):
    ele = a_polygon[i]
    single_point = []
    single_point.append(ele["x"])
    single_point.append(ele["y"])
    poly.append(tuple(single_point))
p = Path(poly)
return p.contains_points([points])
$$
LANGUAGE 'plpython3u' VOLATILE;


验证
select is_point_in_polygon('{"x":1.2, "y":3}', '[{"x":1.1, "y":1.1},{"x":1.1, "y":4.1},{"x":4.1, "y":4.1},{"x":4.1, "y":1.1}]')

select is_point_in_polygon('{"x":1.1, "y":3}', '[{"x":1.1, "y":1.1},{"x":1.1, "y":4.1},{"x":4.1, "y":4.1},{"x":4.1, "y":1.1}]')