it-swarm.com.de

sqlite3.ProgrammingError: Sie dürfen 8-Bit-Bytestrings nur verwenden, wenn Sie eine text_factory verwenden, die 8-Bit-Bytestrings interpretieren kann

Mit SQLite3 in Python versuche ich, eine komprimierte Version eines UTF-8-HTML-Codeausschnitts zu speichern.

Code sieht so aus:

...
c = connection.cursor()
c.execute('create table blah (cid integer primary key,html blob)')
...
c.execute('insert or ignore into blah values (?, ?)',(cid, zlib.compress(html)))

An welchem ​​Punkt um den Fehler zu bekommen:

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

Wenn ich 'text' anstelle von 'blob' verwende und das HTML-Snippet nicht komprimiere, funktioniert es gut (db ist jedoch zu groß). Wenn ich 'blob' verwende und über die Python zlib-Bibliothek komprimiere, erhalte ich die obige Fehlermeldung. Ich sah mich um, konnte aber keine einfache Antwort finden.

85
R. Hill

Wenn Sie 8-Bit-Zeichenfolgen anstelle von Unicode-Zeichenfolgen in sqlite3 verwenden möchten, setzen Sie die entsprechende text_factory für die sqlite-Verbindung:

connection = sqlite3.connect(...)
connection.text_factory = str
87
zag

Als ich die Lösung gefunden hatte, hätte ich nur etwas mehr Zeit mit der Suche verbringen müssen.

Die Lösung besteht darin, den Wert als Python-Puffer 'umzuwandeln':

c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))

Hoffentlich hilft das jemand anderen.

35
R. Hill

Um mit dem BLOB-Typ arbeiten zu können, müssen Sie Ihre komprimierte zlib-Zeichenfolge zunächst in Binärdaten konvertieren. Andernfalls versucht sqlite, sie als Textzeichenfolge zu verarbeiten. Dies geschieht mit sqlite3.Binary (). Zum Beispiel:

c.execute('insert or ignore into blah values (?, ?)',(cid, 
sqlite3.Binary(zlib.compress(html))))
32
MarioVilas

Sie können den Wert mit repr (html) anstelle der Rohausgabe speichern und dann eval (html) verwenden, wenn Sie den Wert abrufen möchten.

c.execute('insert or ignore into blah values (?, ?)',(1, repr(zlib.compress(html))))
0
zwalker

Syntax:

5 mögliche Speicherarten: NULL, INTEGER, TEXT, REAL und BLOB

BLOB wird im Allgemeinen zum Speichern von eingelegten Modellen oder von Dill eingelegten Modellen verwendet

> cur.execute('''INSERT INTO Tablename(Col1, Col2, Col3, Col4) VALUES(?,?,?,?)''', 
                                      [TextValue, Real_Value, Buffer(model), sqlite3.Binary(model2)])
> conn.commit()

> # Read Data:
> df = pd.read_sql('SELECT * FROM Model, con=conn) 
> model1 = str(df['Col3'].values[0]))
> model2 = str(df['Col'].values[0]))
0
Pranzell