2012-10-25 17 views
6

我試圖gzip一個字符串,然後將它寫入bytea列使用psycopg2psycopg - INSERT gzipip數據到bytea列

表:

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。 –