PLPGSQL返回数组,如何在Python中解析?
我从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中解析这个数组?
编辑
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
使用 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
在数据到达Python之前,可以考虑先把数组展开。你可以使用PostgreSQL 8.4中的unnest功能,或者自己写一个方法来实现:
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;