わかりました、私は答えを見つけました。 PostgreSQLでは、Pythonを使用して関数を記述できます。 Pythonを使用できるようにするには、PostgreSQLのインストールに必要な特定のバージョンのPythonをインストールし、PATH環境変数で使用できるようにする必要があります。インストールノートを見ると、PostgreSQLのインストールに必要なPythonのバージョンを見つけることができます。現在、WindowsでPostgreSQL 9.6.5を使用しており、Python3.3が必要です。最初に最新のPython3.6を試しましたが、機能しませんでした。私はWindows用の最新のPython3.3である3.3.5に落ち着きました。
Pythonをインストールした後、 CREATE EXTENSION plpython3u;
を実行して、PostgreSQLでPythonを有効にします。 ここに記載されているデータベース上
bytea
から変換する私の特定のケースについて 倍精度[]
へ そして戻って、私は次の関数を書きました:
CREATE FUNCTION bytea_to_double_array(b bytea)
RETURNS double precision[]
LANGUAGE 'plpython3u'
AS $BODY$
if 'struct' in GD:
struct = GD['struct']
else:
import struct
GD['struct'] = struct
return struct.unpack('<' + str(int(len(b) / 8)) + 'd', b)
$BODY$;
CREATE FUNCTION double_array_to_bytea(dblarray double precision[])
RETURNS bytea
LANGUAGE 'plpython3u'
AS $BODY$
if 'struct' in GD:
struct = GD['struct']
else:
import struct
GD['struct'] = struct
# dblarray here is really a list.
# PostgreSQL passes SQL arrays as Python lists
return struct.pack('<' + str(int(len(dblarray))) + 'd', *dblarray)
$BODY$;
私の場合、すべてのdoubleはリトルエンディアンで格納されるため、<
を使用します。 。
struct
のインポートもキャッシュします https://stackoverflow.com/a/15025425/5274457で説明されているグローバルディクショナリのモジュールa> 。 SDの代わりにGDを使用しました。これは、作成する可能性のある他の関数でインポートを使用できるようにするためです。 GDとSDの詳細については、https://www.postgresqlを参照してください。 .org / docs / current / static / plpython-sharing.html
。
データベース内のblobがリトルエンディアンとして保存されていることを確認して、実際に動作することを確認します。
SELECT bytea_to_double_array(decode('efbeaddeefbeadde', 'hex')), encode(double_array_to_bytea(array[-1.1885959257070704E148]), 'hex');
そして私が得る答えは
ですbytea_to_double_array | encode
double precision[] | text
-------------------------+------------------
{-1.18859592570707e+148} | efbeaddeefbeadde
ここで、'efbeaddeefbeadde'
'deadbeefdeadbeef'
です リトルエンディアンで。