En utilisant SQLite3 en Python, j'essaie de stocker une version compressée d'un extrait de code HTML UTF-8.
Le code ressemble à ceci:
...
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)))
À quel moment obtenir l'erreur:
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 j'utilise «text» plutôt que «blob» et que je ne compresse pas l'extrait de code HTML, cela fonctionne très bien (la base de données est trop grande cependant). Lorsque j'utilise 'blob' et que je compresse via la bibliothèque Python zlib, j'obtiens le message d'erreur ci-dessus. J'ai regardé autour de moi mais je n'ai pas trouvé de réponse simple pour celle-ci.
J'ai trouvé la solution, j'aurais dû passer un peu plus de temps à chercher.
La solution consiste à `` convertir '' la valeur en `` tampon '' Python, comme ceci:
J'espère que cela aidera quelqu'un d'autre.
la source
Afin de travailler avec le type BLOB, vous devez d'abord convertir votre chaîne compressée zlib en données binaires - sinon sqlite essaiera de la traiter comme une chaîne de texte. Ceci est fait avec sqlite3.Binary (). Par exemple:
la source
Syntaxe:
5 types de stockage possibles: NULL, INTEGER, TEXT, REAL et BLOB
BLOB est généralement utilisé pour stocker des modèles marinés ou des modèles marinés à l'aneth
la source
Vous pouvez stocker la valeur en utilisant repr (html) au lieu de la sortie brute, puis utiliser eval (html) lors de la récupération de la valeur à utiliser.
la source