92 votes

sqlite3.ProgrammingError: Vous ne devez pas utiliser 8 bits bytestrings sauf si vous utilisez un text_factory qui peut interpréter de 8 bits bytestrings

À l'aide de SQLite3 en Python, je suis en train de stocker une version compressée d'un extrait de l'UTF-8 du code HTML.

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 point obtiens 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 "texte" plutôt que de "blob" et de ne pas compresser le fragment de code HTML, cela fonctionne toute fine (db est grand). Lorsque j'utilise "blob" et compresser via Python bibliothèque zlib, j'obtiens le message d'erreur ci-dessus. J'ai regardé autour, mais ne pouvait pas trouver une réponse simple pour celui-ci.

96voto

zag Points 1674

Si vous souhaitez utiliser 8 bits de chaînes au lieu de chaîne unicode dans sqlite3, ensemble approptiate text_factory pour connexion sqlite:

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

35voto

R. Hill Points 1877

A trouvé la solution, je devrais avoir dépensé un peu plus de temps à chercher.

La Solution est de "cast" la valeur comme un Python "tampon", comme ceci:

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

J'espère que cela va aider quelqu'un d'autre.

35voto

MarioVilas Points 410

Afin de travailler avec le type BLOB, vous devez d'abord convertir votre zlib comprimé chaîne de caractères en données binaires - sinon, sqlite vais essayer de la traiter comme une chaîne de texte. C'est fait avec sqlite3.Binary(). Par exemple:

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

0voto

zwalker Points 86

Vous pouvez stocker la valeur à l'aide de repr(html) au lieu de la première sortie, puis utiliser la fonction eval(html) lors de la récupération de la valeur pour l'utiliser.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X