2

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

任何人都知道如何解决这个问题?...或任何替代解决方案?非常感谢,胡安

4

1 回答 1

1

如果我理解正确,您的问题是您试图将数组作为元组的成员传递给 python,而 PL/Python 不支持这一点。此问题存在于您的 dummy() 函数中。您可以做的是使用 sql 包装函数仅将数组传递给虚拟函数。就像是:

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)
);
于 2013-05-04T08:24:37.870 回答