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下创建文件夹,并将文件夹权限修改为可读可写可执行状态。
1. unix_socket_directory = '/user-set-dir-path'
配置完成,启动数据库。
将plpython加入数据库编译,并设置好GUC参数unix_socket_directory后,在启动数据库的过程中,自动创建fenced-Master进程。在数据库不进行python编译的情况下,fenced模式需要手动拉起master进程,在GUC参数设置完成后,输入创建master进程命令。
启动fenced-Master进程,命令为:
1. gaussdb --fenced -k /user-set-dir-path -D /user-set-dir-path &
完成fence模式配置,针对plpython-fenced UDF数据库将在fenced-worker进程中执行UDF计算。
使用指导
-
创建extension
-
当编译的plpython为python2时:
1. openGauss=# create extension plpythonu; 2. CREATE EXTENSION- 当编译的plpython为python3时:1. openGauss=# create extension plpython3u; 2. CREATE EXTENSION
下面示例是以python2为例。 - 创建plpython-fenced UDF
1. openGauss=# create or replace function pymax(a int, b int)
2. openGauss-# returns INT
3. openGauss-# language plpythonu fenced
4. openGauss-# as $$
5. openGauss$# import numpy
6. openGauss$# if a > b:
7. openGauss$# return a;
8. openGauss$# else:
9. openGauss$# return b;
10. openGauss$# $$;
11. CREATE FUNCTION
- 查看UDF信息
1. openGauss=# select * from pg_proc where proname='pymax';
2. -[ RECORD 1 ]----+--------------
3. proname | pymax
4. pronamespace | 2200
5. proowner | 10
6. prolang | 16388
7. procost | 100
8. prorows | 0
9. provariadic | 0
10. protransform | -
11. proisagg | f
12. proiswindow | f
13. prosecdef | f
14. proleakproof | f
15. proisstrict | f
16. proretset | f
17. provolatile | v
18. pronargs | 2
19. pronargdefaults | 0
20. prorettype | 23
21. proargtypes | 23 23
22. proallargtypes |
23. proargmodes |
24. proargnames | {a,b}
25. proargdefaults |
26. prosrc |
27. | import numpy
28. | if a > b:
29. | return a;
30. | else:
31. | return b;
32. |
33. probin |
34. proconfig |
35. proacl |
36. prodefaultargpos |
37. fencedmode | t
38. proshippable | f
39. propackage | f
40. prokind | f
41. proargsrc |
- 运行UDF
-
创建一个数据表:
1. openGauss=# create table temp (a int ,b int) ; 2. CREATE TABLE 3. openGauss=# insert into temp values (1,2),(2,3),(3,4),(4,5),(5,6); 4. INSERT 0 5- 运行UDF:1. openGauss=# select pymax(a,b) from temp; 2. pymax 3. ------- 4. 2 5. 3 6. 4 7. 5 8. 6 9. (5 rows)
