我是python的新手,我正在尝试在pl / python中进行一些服务器编程(为了实现更快的处理),经过多次尝试后,我决定在此列表上寻找帮助。
我想通过传递vessel_speed创建的类型
来调用另一个pl / python函数CREATE TYPE vessel_speed AS (
mmsi integer,
sog real[]
);
CREATE OR REPLACE FUNCTION dummy(c_vessel vessel_speed)
RETURNS real[]
AS $$
return c_vessel["sog"]
$$ LANGUAGE plpython3u;
我试图以这种方式从另一个pl / python中调用虚函数:
st = "SELECT dummy(($1,ARRAY[$2])::vessel_speed)"
pst = plpy.prepare(st, ["integer", "real[]"])
rv = plpy.execute(pst, [112, (1.2,3.1)])
返回错误:
ERROR: spiexceptions.FeatureNotSupported: cannot convert multidimensional array to Python list
Estado SQL:0A000
Detalle:PL/Python only supports one-dimensional arrays.
任何人都知道如何解决这个问题?......或者任何其他解决方案?非常感谢, 涓
答案 0 :(得分:1)
你的问题如果我理解正确的是你试图将数组作为元组的成员传递给python而PL / Python不支持这个。您的dummy()函数中存在此问题。你可以做的是使用一个sql包装函数只将数组传递给dummy函数。类似的东西:
CREATE OR REPLACE FUNCTION dummy(c_vessel vessel_speed)
RETURNS real[]
AS $$
SELECT dummy(c_vessal.sog);
$$ language sql;
CREATE OR REPLACE FUNCTION dummy(sog real[]) returns real[] LANGUAGE plpython3u AS
$$
return sog;
$$;
您的另一个选择是您可以将字符存储在字符分隔值中。类似的东西:
CREATE TABLE c_vessal (
id serial primary key,
sog text not null,
check(array_upper(string_to_array(sog, ':')::real[], 1) > 0)
);