sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings
Solution 1:
If you want to use 8-bit strings instead of unicode string in sqlite3, set approptiate text_factory for sqlite connection:
connection = sqlite3.connect(...)
connection.text_factory = str
Solution 2:
Found the solution, I should have spent just a little more time searching.
Solution is to 'cast' the value as a Python 'buffer', like so:
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))
Hopefully this will help somebody else.
Solution 3:
In order to work with the BLOB type, you must first convert your zlib compressed string into binary data - otherwise sqlite will try to process it as a text string. This is done with sqlite3.Binary(). For example:
c.execute('insert or ignore into blah values (?, ?)',(cid,
sqlite3.Binary(zlib.compress(html))))