2012-10-25 3 views
6

Ich versuche, eine Zeichenfolge gzip und dann schreiben Sie es in eine bytea Spalte mit psycopg2.psycopg - INSERT gzippte Daten in Bytea Spalte

Tabelle:

CREATE TABLE test 
(
    data bytea 
) 

einfügen:

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 

ist dies ein Problem mit der Bibliothek? Muss ich die Codierung irgendwie ändern? jede Hilfe wird geschätzt.

Antwort

15

Wenn Sie Binärdaten in die Datenbank einfügen möchten, müssen Sie den Wrapper psycopg2.Binary() verwenden. Wenn Sie eine Zeichenkette wie diese verwenden, werden die Daten als Text behandelt, der entweder aufgrund von Codierungsproblemen zurückgewiesen wird oder akzeptiert wird, aber beim Versuch, sie erneut zu lesen, zerfällt.

Versuchen Sie, die zuletzt ausführen Anruf mit dem Ersetzen:

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

funktionierts für ein einzelnes Feld oder einfach nur für die ganze Reihe? – amphibient

+0

Es gibt nichts, was Sie daran hindert, mehrere Positionsparameter vom Typ 'psycopg2.Binary' bereitzustellen. Es ist nur die Standard Python DB-API. –

Verwandte Themen