2012-10-25 14 views
6

文字列をgzipしてpsycopg2を使用してbytea列に書き込もうとしています。psycopg - データをバイト列に挿入する

テーブル:

CREATE TABLE test 
(
    data bytea 
) 

挿入:

import psycopg2 

data = "some string".encode("zlib") # 'x\x9c+\xce\xcfMU(.)\xca\xccK\x07\x00\x1ak\x04l' 

conn = psycopg2.connect("my parameters") 
cur = conn.cursor() 
cur.execute("INSERT INTO public.test VALUES (%s)", (data,)) 

    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x9c 

これは、ライブラリの問題ですか?何とかエンコーディングを変更する必要がありますか?どんな助けもありがとう。

答えて

15

データベースにバイナリデータを挿入する場合は、psycopg2.Binary()ラッパーを使用する必要があります。あなたが行ったような文字列を使用すると、データがテキストとして扱われます。エンコードの問題により拒否されるか、受け入れられますが、再度読み込もうとすると文字化けします。単一のフィールドのためか、単に行全体のために、この作業を行い

cur.execute("INSERT INTO public.test VALUES (%s)", (psycopg2.Binary(data),)) 
+0

をして、最後の実行の呼び出しを交換してみてください? – amphibient

+0

複数の 'psycopg2.Binary'型の位置パラメータを提供することを止めるものは何もありません。これは標準のPython DB-APIです。 –

関連する問題