PLPGSQL вернул массив, как разобрать в Python? - PullRequest
1 голос
/ 13 декабря 2010

Я получаю массив из plpgsql, который выглядит следующим образом:

[0:2]={
"(ab023500-ceef-41d6-af33-635964dbffde,Koen,\"\",Schmeets,{koen@heizoo.com},31631205427},\"{\"\"Test categorie\"\"}\",{ff0000})",
"(384cb1e9-58b9-4bdf-9da6-eb3d9355471b,Marc,\"\",Vrijhof,{},{},\"{\"\"Test categorie\"\"}\",{ff0000})",
"(9c19ec5c-6b95-456a-af6f-c3388835b780,Michael,\"\",\"Baas ;)\",{},{},    \"{\"\"Subcategorie test\"\",\"\"Test categorie\"\"}\",\"{NULL,ff0000}\")"}

Я создал свой собственный интерпретатор, чтобы получить массив в списке Python, но, похоже, он не сработает-доказательство.Кто-нибудь знает, как разобрать этот массив в Python?

Edit

unnest() позволил мне получить хороший массив со следующей функцией:

CREATE FUNCTION array_to_json_string(in_varchararray character varying[])
  RETURNS character varying LANGUAGE plpythonu AS
$_$
import cjson

plan = plpy.prepare("SELECT * FROM unnest($1)", ["varchar[]"])
rv = plpy.execute(plan, [in_varchararray])

retList = []
for r in rv:
    retList .append(r["unnest"])
return cjson.encode(retList)
$_$;

Хотя ... это довольно медленно!

Кто-нибудь знает, как превратить массив plpgsql в значения, разделенные запятыми?

Ответы [ 2 ]

0 голосов
/ 01 марта 2012

Используйте array_to_string() для преобразования массива в строку, разделенную запятыми.
Например:

SELECT array_to_string(
    $$[0:2]={
    "(ab023500-ceef-41d6-af33-635964dbffde,Koen,\"\",Schmeets,{koen@heizoo.com},{31631205427},\"{\"\"Test categorie\"\"}\",{ff0000})",
    "(384cb1e9-58b9-4bdf-9da6-eb3d9355471b,Marc,\"\",Vrijhof,{},{},\"{\"\"Test categorie\"\"}\",{ff0000})",
    "(9c19ec5c-6b95-456a-af6f-c3388835b780,Michael,\"\",\"Baas ;)\",{},{},\"{\"\"Subcategorie test\"\",\"\"Test categorie\"\"}\",\"{NULL,ff0000}\")"
    }$$::text[]
    , ',');
0 голосов
/ 13 декабря 2010

Рассмотрите возможность удаления массива до того, как он попадет в python, либо используйте unnest в 8.4, либо сверните свое собственное с помощью:

create or replace function unnest(anyarray) returns setof anyelement as $$
  select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) i;
$$ language'sql' immutable;
...