Mit SQLite3 in Python versuche ich, eine komprimierte Version eines Ausschnitts aus UTF-8-HTML-Code 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 welcher Stelle erhalten Sie den Fehler:
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 alles einwandfrei (db ist jedoch zu groß). Wenn ich 'blob' verwende und über die Python zlib-Bibliothek komprimiere, wird die obige Fehlermeldung angezeigt. Ich sah mich um, konnte aber keine einfache Antwort auf diese Frage finden.
Wenn ich die Lösung gefunden habe, hätte ich etwas mehr Zeit mit der Suche verbringen sollen.
Die Lösung besteht darin, den Wert wie folgt in einen Python-Puffer umzuwandeln:
Hoffentlich hilft das jemand anderem.
quelle
Um mit dem BLOB-Typ arbeiten zu können, müssen Sie zuerst Ihre komprimierte zlib-Zeichenfolge in Binärdaten konvertieren. Andernfalls versucht sqlite, sie als Textzeichenfolge zu verarbeiten. Dies geschieht mit sqlite3.Binary (). Beispielsweise:
quelle
Syntax:
5 Arten möglicher Speicher: NULL, INTEGER, TEXT, REAL und BLOB
BLOB wird im Allgemeinen verwendet, um eingelegte Modelle oder eingelegte Dillmodelle zu lagern
quelle
Sie können den Wert mit repr (html) anstelle der Rohausgabe speichern und dann eval (html) verwenden, um den zu verwendenden Wert abzurufen.
quelle