gpt4 book ai didi

arrays - Postgres SQL 函数转换可以应用于数组类型吗?

转载 作者:行者123 更新时间:2023-11-29 13:40:45 28 4
gpt4 key购买 nike

我正在尝试对 Postgres 中的数组类型进行一些数值处理。我发现我可以在 Postgres PL/Python 中使用 Numpy 库,但对于我的目的而言,该操作运行速度太慢,而且比直接在 Python 中或使用 C 扩展要慢得多。

我怀疑从 Postgres Array Type -> Python List -> Numpy Arrray 转到 Numpy Arrray 可能会有开销,然后在返回时执行相反的操作。

为了测试(并可能修复)我正在尝试构建一个 C 扩展,它将跳过 Python 列表并直接从 Postgres 数组转换为 Numpy 数组,反之亦然。

我创建了一个 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”的转换不存在

我的猜测是转换正试图应用于基本的“真实”类型而不是数组。有什么方法可以专门为数组指定转换吗?

最佳答案

事实证明这是不可能的。

lsyscache.c (get_transform_oid) 中,它将转换类型转换为其基本类型,从而剥离“数组”,因此该函数始终应用于基础类型。

看看我是否可以打补丁来允许这种行为,但目前(postgres <=11.0)你不能为数组对象创建自定义转换。

关于arrays - Postgres SQL 函数转换可以应用于数组类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55765476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com