【问题标题】:PLPGSQL returned array, how to parse in Python?PLPGSQL 返回的数组,如何在 Python 中解析?
【发布时间】:2010-12-13 18:25:08
【问题描述】:

我从 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 数组转换为逗号分隔值吗?

【问题讨论】:

    标签: python arrays parsing plpgsql plpython


    【解决方案1】:

    考虑在数组进入 python 之前取消嵌套,在 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;
    

    【讨论】:

    • 谢谢!我让它使用以下函数 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)$_$;虽然速度很慢! unnest 把它变成行,但有没有办法让它用逗号分隔或什么?再次感谢!
    • 您想将这些行连接成一个长字符串吗?您可以使用自定义聚合 create aggregate concat(basetype = text, sfunc = textcat, stype = text, initcond = ''); 但我不确定这是否真的是您所要求的,是吗?
    • 嗯,现在我在想,有一个分隔符可能是不安全的,有没有办法将结果传递到 json 中?
    【解决方案2】:

    使用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[]
        , ',');
    

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 2021-03-21
      • 2013-09-03
      • 2011-02-14
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多