Zlib no banco de dados - Django
-
22-08-2019 - |
Pergunta
Quando tento colocar uma string zlibbed em models.textfield
>>> f = VCFile(head = 'blahblah'.encode('zlib'))
>>> f.save()
Falha:
...
raise DjangoUnicodeDecodeError(s, *e.args)
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0x9c in position 1: unexpected code byte. You passed in 'x\x9cK\xcaI\xccH\x02b\x00\x0eP\x03/' (<type 'str'>)
Existe alguma maneira de corrigir isso (além de escapar da corda - ela deve ser eficaz)?
Solução
Como Marcus diz, você terá que usar o BLOB se quiser mantê -lo em formato binário. Se você está bem em codificá -lo, pode usar a codificação Base64:
from base64 import binascii
f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))
Nos meus testes muito básicos com caracteres de 33k, a sequência ZLIB era 28% do tamanho da string original, a sequência ZLIB codificada base64 era 37% do tamanho da string original. Não é tão bom na compressão, mas ainda é uma grande melhoria.
Outras dicas
Se você não deseja codificá -lo, precisará armazená -lo como um objeto binário (blob), não uma string. O Django não parece suportar Blobfields para fora da caixa, então encontre -o na rede ou hackear algo juntos.