В настоящее время я пытаюсь написать процедуру на 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
В каждом есть четыре байта (должно быть ~ 130). Если я перестану связывать файлы, станет понятно почему; есть четыре байта, отличных от NUL, за которыми следует пара NUL, и кажется, что на каком-то этапе эти NUL рассматриваются как терминаторы при преобразовании из Python в Postgres!
Кто-нибудь знает, почему это происходит или как это остановить? Документы не просвещают.
Спасибо!
Редактировать : Я нашел кого-то с такой же проблемой , но решение довольно неудовлетворительное.