从plpython函数之间传递一个real []作为参数

时间:2013-03-05 18:42:20

标签: python postgresql plpython

我是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.

任何人都知道如何解决这个问题?......或者任何其他解决方案?非常感谢, 涓

1 个答案:

答案 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)
);