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;
$$;

もう 1 つのオプションは、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 に答える