sqlite3.ProgrammingError: no debe usar bytestrings de 8 bits a menos que use un text_factory que pueda interpretar bytestrings de 8 bits

Al usar 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 se recibe 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 código HTML, funciona bien (db es demasiado grande). Cuando uso ‘blob’ y comprimo a través de la biblioteca zlib de Python, aparece el mensaje de error anterior. Miré a mi alrededor pero no pude encontrar una respuesta simple para esta.

Si desea usar cadenas de 8 bits en lugar de cadenas de Unicode en sqlite3, establezca la fábrica de texto apropiada para la conexión de sqlite:

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

Encontré la solución, debería haber pasado un poco más de tiempo buscando.

La solución es ’emitir’ el valor como un ‘búfer’ de Python, así:

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

Esperemos que esto ayude a alguien más.

Para trabajar con el tipo BLOB, primero debe convertir su cadena comprimida 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)))) 

Puede almacenar el valor utilizando repr (html) en lugar de la salida sin procesar y luego usar eval (html) cuando recupere el valor para usar.

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

Sintaxis:

5 tipos de almacenamiento posible: 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]))