私はpostgresqlと関数の作成に非常に慣れていないので、ご容赦ください。Python スクリプトを postgresql 関数に変換する必要があり、そのために PL/Python を使用するつもりです。しかし、私はそうすることでいくつかの問題を抱えています。関数を実行すると、次のエラーが表示されます。
エラー: TypeError: サポートされていないオペランド型 +: 'int' および 'dict' SQL 状態: XX000 コンテキスト: トレースバック (最新の呼び出しが最後): PL/Python 関数 "ellipse"、5 行目、平均 X=float( sum(Xarray))/len(Xarray) if len(Xarray) > 0 else float('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;