VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

PLPython Fenced模式

在fenced模式中添加plpython非安全语言。在数据库编译时需要将python集成进数据库中,在configure阶段加入--with-python选项。同时也可指定安装plpython的python路径,添加选项--with-includes='/python-dir=path'

在启动数据库之前配置GUC参数unix_socket_directory,用于指定unix_socket进程间通讯的文件地址。用户需要提前在user-set-dir-path下创建文件夹,并将文件夹权限修改为可读可写可执行状态。

unix_socket_directory = '/user-set-dir-path'

配置完成,启动数据库。

将plpython加入数据库编译,并设置好GUC参数unix_socket_directory后,在启动数据库的过程中,自动创建fenced-Master进程。在数据库不进行python编译的情况下,fenced模式需要手动拉起master进程,在GUC参数设置完成后,输入创建master进程命令。

启动fenced-Master进程,命令为:

gaussdb --fenced -k /user-set-dir-path -D /user-set-dir-path &

完成fence模式配置,针对plpython-fenced UDF数据库将在fenced-worker进程中执行UDF计算。

使用指导

创建extension

  • 当编译的plpython为python2时:

    create extension plpythonu;
    
  • 当编译的plpython为python3时:

    create extension plpython3u;
    

下面示例是以python2为例。

  • 创建plpython-fenced UDF

    create or replace function pymax(a int, b int)
    returns INT
    language plpythonu fenced
    as $$
    import numpy
    if a > b:
    return a;
    else:
    return b;
    $$;
    
  • 查看UDF信息

    select * from pg_proc where proname='pymax';
    

    列式展示,返回结果为:

    -[ RECORD 1 ]----+--------------
    proname          | pymax
    pronamespace     | 2200
    proowner         | 10
    prolang          | 16388
    procost          | 100
    prorows          | 0
    provariadic      | 0
    protransform     | -
    proisagg         | f
    proiswindow      | f
    prosecdef        | f
    proleakproof     | f
    proisstrict      | f
    proretset        | f
    provolatile      | v
    pronargs         | 2
    pronargdefaults  | 0
    prorettype       | 23
    proargtypes      | 23 23
    proallargtypes   |
    proargmodes      |
    proargnames      | {a,b}
    proargdefaults   |
    prosrc           |
                     | import numpy
                     | if a > b:
                     |     return a;
                     | else:
                     |     return b;
                     |
    probin           |
    proconfig        |
    proacl           |
    prodefaultargpos |
    fencedmode       | t
    proshippable     | f
    propackage       | f
    prokind          | f
    proargsrc        |
    

运行UDF

  • 创建一个数据表

    create table temp (a int ,b int) ;
    insert into temp values (1,2),(2,3),(3,4),(4,5),(5,6);
    
  • 运行UDF

    select pymax(a,b) from temp;
    

    返回结果为:

        pymax
    -------------
            2
            3
            4
            5
            6
    (5 rows)