Usando SQLite3 en Python, estoy tratando de almacenar una versión comprimida de un fragmento de código HTML UTF-8.
El código se ve así:
...
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)))
En qué punto aparece el error:
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.
Si utilizo 'texto' en lugar de 'blob' y no comprimo el fragmento de HTML, todo funciona bien (aunque db es demasiado grande). Cuando uso 'blob' y comprimo a través de la biblioteca zlib de Python, obtengo el mensaje de error anterior. Miré a mi alrededor pero no pude encontrar una respuesta simple para esta.
Encontré la solución, debería haber pasado un poco más de tiempo buscando.
La solución es 'lanzar' el valor como un 'búfer' de Python, así:
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))
Con suerte, esto ayudará a alguien más.
fuente
Para trabajar con el tipo BLOB, primero debe convertir la cadena comprimida de zlib en datos binarios; de lo contrario, sqlite intentará procesarla como una cadena de texto. Esto se hace con sqlite3.Binary (). Por ejemplo:
c.execute('insert or ignore into blah values (?, ?)',(cid, sqlite3.Binary(zlib.compress(html))))
fuente
Sintaxis:
5 tipos de almacenamiento posibles: NULL, INTEGER, TEXT, REAL y BLOB
BLOB se utiliza generalmente para almacenar modelos en escabeche o modelos en escabeche con eneldo
> 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]))
fuente
Puede almacenar el valor usando repr (html) en lugar de la salida sin procesar y luego usar eval (html) cuando recupere el valor para su uso.
c.execute('insert or ignore into blah values (?, ?)',(1, repr(zlib.compress(html))))
fuente