Zlib no banco de dados - Django

votos
1

Quando eu tento colocar uma corda 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 string - que tem que ser espaço-eficiente)?

Publicado 17/05/2009 em 19:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Como Marcus diz, você terá que usar BLOB se você quiser mantê-lo em formato binário. Se você é OK com codificação-lo, você pode usar codificação base64:

from base64 import binascii

f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))

Nos testes muito básicos com 33k caracteres, a cadeia zlib foi de 28% do tamanho da cadeia original, as base64 codificados cadeia zlib foi de 37% do tamanho da cadeia original. Não é tão bom na compressão, mas ainda uma grande melhoria.

Respondeu 18/05/2009 em 17:59
fonte usuário

votos
0

Se você não quiser codificá-lo, você tem que armazená-lo como um objeto binário (BLOB), e não uma string. O Django não parecem apoiar BlobFields fora da caixa, então vá encontrá-lo na rede ou cortar alguma coisa juntos.

Respondeu 17/05/2009 em 19:24
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more