私は現在、いくつかのデータの変換を実行し、結果をとして返すためにPL/Pythonでプロシージャを作成しようとしていますbytea
。(実際にはかなり醜いです:OCamlでデータをマーシャリングします!PythonとOCamlで同時に醜いです;メダルを取得する必要がありますか?)
外観は次のとおりです。
CREATE OR REPLACE FUNCTION ml_marshal(data varchar) RETURNS bytea as $$
import tempfile, os
fn = tempfile.mktemp()
f = open(fn, 'w')
dest_fn = tempfile.mktemp()
f.write("let outch = open_out_bin \"" + dest_fn + "\" in " +
"Marshal.to_channel outch (" + data + ") [Marshal.No_sharing]; " +
"close_out outch")
f.close()
os.system("ocaml " + fn)
os.unlink(fn)
f = open(dest_fn, 'r')
res = f.read()
f.close()
os.unlink(dest_fn)
return res
$$ LANGUAGE plpythonu;
つまり、小さなOCamlプログラムを一時ファイルに書き込み、必要なデータを使用して別の一時ファイルを作成します。次に、その一時ファイルを読み込み、両方を破棄して、結果を返します。
それだけではうまくいきません:
meidi=# select * from tblmodel;
modelid | polies
---------+------------------
1 | \204\225\246\276
2 | \204\225\246\276
それぞれに4バイトあります(約130バイトあるはずです)。ファイルのリンクを解除するのをやめると、その理由が明らかになります。非NULバイトが4つあり、その後に2つのNULが続きます。これらのNULは、PythonからPostgresへの変換によって、ある段階でターミネータとして扱われるようです。
なぜこれが起こるのか、それを止める方法を誰かが知っていますか?ドキュメントは啓発的ではありません。
ありがとう!
編集:私は同じ問題を抱えている他の誰かを見つけましたが、解決策はかなり不十分です。