sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでbyteaを倍精度に変換する

    わかりました、私は答えを見つけました。 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を有効にします。 ここに記載されているデータベース上 https://www.postgresql.org/docs /current/static/plpython.html 。そこから、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 。 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'です リトルエンディアンで。




    1. mysql varbinary vs varchar

    2. postgresはスライドウィンドウを使用して配列を生成します

    3. ORA-28040:一致する認証プロトコルの例外はありません

    4. trunc(date、'IW')とは正確には何ですか?