2012-10-25 13 views
6

Próbuję zgasić ciąg znaków, a następnie zapisać go w kolumnie bytea, używając psycopg2.psycopg - WSTAWIĆ spakowane dane do kolumny bytea

tabela:

CREATE TABLE test 
(
    data bytea 
) 

Wkładka:

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 

jest to problem z biblioteki? Czy muszę w jakiś sposób zmienić kodowanie? każda pomoc jest doceniana.

Odpowiedz

15

Jeśli chcesz wstawić dane binarne do bazy danych, musisz użyć opakowania psycopg2.Binary(). Użycie napisu, jaki zrobiłeś, spowoduje, że dane będą traktowane jako tekst, który albo zostanie odrzucony z powodu problemów z kodowaniem, albo zostanie zaakceptowany, ale zniekształcony, gdy spróbujesz go ponownie przeczytać.

Spróbuj zastępując ostatnią wykonania połączenia z:

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

to działa dla jednego pola lub po prostu dla całego rzędu? – amphibient

+0

Nic nie stoi na przeszkodzie, aby podać wiele parametrów pozycji 'psycopg2.Binary'. To tylko standardowe Python DB-API. –