Usando SQLite3 em Python, estou tentando armazenar uma versão compactada de um fragmento de código HTML UTF-8.
O código é parecido com este:
...
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)))
Em que ponto em obter o erro:
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.
Se eu usar 'texto' em vez de 'blob' e não compactar o trecho de HTML, tudo funciona bem (db é muito grande). Quando eu uso 'blob' e faço compactação por meio da biblioteca Python zlib, recebo a mensagem de erro acima. Olhei em volta, mas não consegui encontrar uma resposta simples para essa pergunta.
Encontrei a solução, deveria ter gasto um pouco mais de tempo pesquisando.
A solução é 'lançar' o valor como um 'buffer' Python, assim:
Espero que isso ajude mais alguém.
fonte
Para trabalhar com o tipo BLOB, você deve primeiro converter sua string compactada zlib em dados binários - caso contrário, o sqlite tentará processá-la como uma string de texto. Isso é feito com sqlite3.Binary (). Por exemplo:
fonte
Sintaxe:
5 tipos de armazenamento possíveis: NULL, INTEGER, TEXT, REAL e BLOB
BLOB é geralmente usado para armazenar modelos em conserva ou modelos em conserva de endro
fonte
Você pode armazenar o valor usando repr (html) em vez da saída bruta e, em seguida, usar eval (html) ao recuperar o valor para uso.
fonte