我目前正在尝试编写一个PL/Python过程来执行一些数据转换,然后将结果作为
这是它的样子:
简而言之,它将一个小的OCaml程序写入一个临时文件中,该程序创建另一个包含我们想要数据的临时文件。然后我们读取该临时文件,销毁两个文件,并返回结果。
只是它并没有完全起作用:
每个中有四个字节(应该有大约130个)。如果我停止解除文件的链接,就会变得很明显;有四个非NUL字节,然后是几个NUL,似乎这些NUL在某个阶段被转换从Python到Postgres时被视为终止符!
有人知道为什么会发生这种情况,或者如何停止它吗?文档没有提供启示。
谢谢!
编辑:我找到了有相同问题的其他人,但解决方案相当不令人满意。
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
每个中有四个字节(应该有大约130个)。如果我停止解除文件的链接,就会变得很明显;有四个非NUL字节,然后是几个NUL,似乎这些NUL在某个阶段被转换从Python到Postgres时被视为终止符!
有人知道为什么会发生这种情况,或者如何停止它吗?文档没有提供启示。
谢谢!
编辑:我找到了有相同问题的其他人,但解决方案相当不令人满意。