我对postgresql和编写函数很新,所以请耐心等待。我需要将Python脚本转换为postgresql函数,我打算将PL / Python用于此目的。但是我在这方面遇到了一些问题。执行该功能时,我收到错误:
错误:TypeError:+:'int'和'dict'不支持的操作数类型 SQL状态:XX000 上下文:回溯(最近一次调用最后一次): PL / Python函数“ellipse”,第5行,in meanX = float(sum(Xarray))/ len(Xarray)if len(Xarray)> 0其他浮动('nan') PL / Python函数“ellipse”
据我所知,查询将结果存储在字典中,然后导致此错误(因为我尝试使用脚本中的列表操作)。至少我认为这可能是问题所在。所以我的问题是 - 有没有办法将查询结果存储在列表变量中?
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;
答案 0 :(得分:0)
plpy.execute会给你一个dict列表,所以你需要像
这样的东西sum([x['laius'] for x in Xarray])
此处文档中的更多信息http://www.postgresql.org/docs/devel/static/plpython-database.html
编辑:我读得太快并浏览了整个函数 - 您可能希望将列表构造函数放在更高位置,可能是在执行查询之后,以便您有一个值列表供以后使用(我没有'注意后面的代码中有多少假设数据在一个简单的列表中。)