Postgresql 将查询结果存储在plpython函数的列表变量中

Postgresql 将查询结果存储在plpython函数的列表变量中,postgresql,plpython,Postgresql,Plpython,我对postgresql和编写函数非常陌生,请耐心等待。我需要将Python脚本转换为postgresql函数,我打算使用PL/Python实现这一目的。然而,我在这样做时遇到了一些问题。执行函数时,我收到一个错误: 错误:TypeError:不支持+:“int”和“dict”的操作数类型 SQL状态:XX000 上下文:回溯(最近一次呼叫最后一次): PL/Python函数“椭圆”,第5行,在 meanX=浮点(和(Xarray))/len(Xarray)如果len(Xarray)>0,则为浮

我对postgresql和编写函数非常陌生,请耐心等待。我需要将Python脚本转换为postgresql函数,我打算使用PL/Python实现这一目的。然而,我在这样做时遇到了一些问题。执行函数时,我收到一个错误:

错误:TypeError:不支持+:“int”和“dict”的操作数类型 SQL状态:XX000 上下文:回溯(最近一次呼叫最后一次): PL/Python函数“椭圆”,第5行,在 meanX=浮点(和(Xarray))/len(Xarray)如果len(Xarray)>0,则为浮点('nan') PL/Python函数“椭圆”

据我所知,查询将结果存储在dictionary中,然后导致此错误(因为我试图在脚本中使用list进行操作)。至少我认为这是个问题。所以我的问题是-有没有办法将查询结果存储在列表变量中

CREATE OR REPLACE FUNCTION ellipse()
returns setof ellipse_param as $$

Xarray=plpy.execute("select laius from proov")
Yarray=plpy.execute("select pikkus from proov")
meanX=float(sum(Xarray))/len(Xarray) if len(Xarray) > 0 else float('nan')
meanY=float(sum(Yarray))/len(Yarray) if len(Yarray) > 0 else float('nan')
Xdevs=[]
Ydevs=[]
for x in Xarray:
    dev=x-meanX
    Xdevs.append(dev)
    dev=0
for y in Yarray:
    dev=y-meanY
    Ydevs.append(dev)
    dev=0

sumX=0 
sumY=0
for x in Xdevs:
    sumX+=x**2
for y in Ydevs:
    sumY+=y**2
Xaxes=sqrt(sumX/len(Xdevs))
Yaxes=sqrt(sumY/len(Ydevs))
A=sumX-sumY
B=sqrt(A**2+(((float(sum([a*b for a,b in zip(Xdevs,Ydevs)])))**2)*4))
C=float(sum([a*b for a,b in zip(Xdevs,Ydevs)]))*2
rotation=(atan(((A+B)/C)))
Sx=sqrt(((float(sum([(a*cos(rotation)-b*sin(rotation))**2 for a,b in  zip(Xdevs,Ydevs)])))/(len(Xdevs)-2))*2)
Sy=sqrt(((float(sum([(c*sin(rotation)+d*cos(rotation))**2 for c,d in zip(Xdevs,Ydevs)])))/(len(Xdevs)-2))*2)
return meanX, meanY, rotation, Xaxes, Yaxes
$$ LANGUAGE plpython3u;

execute将为您提供一个dict列表,因此您需要

sum([x['laius'] for x in Xarray])
更多信息请参见此处的文档


编辑:我读得太快,浏览了你的整个函数-你可能想把列表构造函数放在更高的位置,可能是在执行查询之后,这样你就有了一个值列表供以后使用(我没有注意到后面的代码中有多少代码假设数据在一个简单的列表中)。

谢谢!你的回答真的很有帮助!