在plpython函数间传递real[]作为参数
我刚开始学习Python,想用pl/python做一些服务器编程(这样处理速度会更快),经过多次尝试后,我决定在这个列表上寻求帮助。
我想从一个pl/python函数中调用另一个函数,并传递一个名为vessel_speed的自定义类型。
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函数调用dummy函数:
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.
有没有人知道怎么解决这个问题?或者有什么替代方案?非常感谢,Juan
1 个回答
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;
$$;
另外一个选择是,你可以把sog存储为一个字符分隔的值。可以这样做:
CREATE TABLE c_vessal (
id serial primary key,
sog text not null,
check(array_upper(string_to_array(sog, ':')::real[], 1) > 0)
);