在plpython函数间传递real[]作为参数

2 投票
1 回答
727 浏览
提问于 2025-04-17 18:02

我刚开始学习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)
);

撰写回答