我正在尝试对Postgres中的数组类型进行一些数值处理。我发现我可以在Postgres PL / Python中使用Numpy库,但是出于我的目的,该操作运行太慢,并且比直接在Python中或使用C扩展的运行速度慢得多。
我的怀疑是Postgres数组类型-> Python列表-> Numpy Arrray可能需要一些开销,然后返回时做相反的操作。
为了测试(并可能修复),我正在尝试构建一个C扩展名,该扩展名将跳过Python列表,直接从Postgres Array转换为Numpy Array,反之亦然。
我创建了一个C扩展,它定义了以下内容:
CREATE FUNCTION arr_to_np(val internal) RETURNS internal LANGUAGE C AS 'MODULE_PATHNAME', 'arr_to_np';
CREATE FUNCTION np_to_arr(val internal) RETURNS real[] LANGUAGE C
AS 'MODULE_PATHNAME', 'np_to_arr';
CREATE TRANSFORM FOR real[] LANGUAGE plpythonu (
FROM SQL WITH FUNCTION arr_to_np(internal),
TO SQL WITH FUNCTION np_to_arr(internal)
);
模块加载没有问题,但是当我尝试在函数中使用它
CREATE FUNCTION fn (a integer[])
RETURNS integer
TRANSFORM FOR TYPE real[]
AS $$ return a $$ LANGUAGE plpythonu;
我得到:错误:实型语言“ plpythonu”类型的转换不存在
我的评价是,转换尝试应用于基本的“真实”类型,而不是数组。有什么方法可以专门为数组指定转换吗?
答案 0 :(得分:0)
事实证明这是不可能的。
在lsyscache.c
(get_transform_oid
)中,它将转换的类型转换为基本类型,从而去除了“数组”,因此该函数始终应用于基础类型。
要查看我是否可以拼凑一个补丁来允许这种行为,但是目前(postgres <= 11.0)您不能为数组对象创建自定义转换。