step1:为数据库添加python支持
先保证$GPHOME/ext/中包含python文件夹,否则无法增加python扩展
执行扩展命令(注意是在shell中执行,不是进入gp的命令行)
createlang plpythonu -d fb09
注意:上面的命令中只需要替换 fb09为需要扩展的数据库即可
step2:创建gp自定义函数
create or replace function public.uuid_python() returns varchar(36)
AS $
import uuid
return uuid.uuid1()
$ LANGUAGE plpythonu;
上一张实际应用的图
完事儿!!!
之前发过一个帖子,是用c编写的postgresql中的uuid扩展包,移植到了greenplum中。但是有一个很重要的问题没有解决:函数只能返回uuid类型,而uuid是自定义类型,自定义类型无法当做分片字段,并且已知的类型转换函数都无法成功把uuid类型转换为varchar等类型。因为对c是十窍通了九窍,所以这个问题困扰了我很多天,最后无意中看到greenplum支持python扩展,而最近也才刚开始学习python,就找资料试了一下,没想到竟然成功了,而且竟然如此简单!!!真是踏破铁鞋无觅处得来全不费工夫,这个月的作业有着落啦!!!
参考资料:http://gpdb.docs.pivotal.io/4370/ref_guide/extensions/pl_python.html
PS:
另外请忽略我的char(36),应该是char(32),我只是懒得替换 - 符号了而已!!!
另外2:python中uuid生成规则有多种,根据说明我认为gp环境下应该使用第一种,所以我选择的uuid.uuid1()。参考资料:http://www.cnblogs.com/dkblog/archive/2011/10/10/2205200.html
另外3:请参照另外4
另外4:请参照另外6
另外5:貌似没有了,想起来再说
另外6:请参照另外5
PSS:GP5.X已原生支持uuid
请忽略我very bad的chinglish!!!推荐大家在GP5.0发版以后,升级最新版GP来实现该功能!!!据说在17年第一季度上线哦
PSSS:请注意所属扩展语言的语法定义规范。python是区分大小写的,所以请注意如下代码。
--正确:
create or replace function public.uuid_python1() returns varchar(36)
AS $$
import uuid
return uuid.uuid1()
$$ LANGUAGE plpythonu;
--错误:
create or replace function public.uuid_python1() returns varchar(36)
AS $$
import uuid
RETURN uuid.uuid1()
$$ LANGUAGE plpythonu;
因为被$$包围的代码块属于扩展语言python的语法,所以需要遵循其语言的语法定义。其他语言扩展注意点相同