Zlib nel database - Django
-
22-08-2019 - |
Domanda
Quando si tenta di inserire una stringa zlibbed in models.TextField
>>> f = VCFile(head = 'blahblah'.encode('zlib'))
>>> f.save()
non riesce:
...
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'>)
C'è un modo per risolvere questo problema (a parte la fuoriuscita della stringa - deve essere spazio-efficiente)
?Soluzione
Come Marcus dice, si dovrà utilizzare BLOB se si desidera mantenere in formato binario. Se sei OK con la codifica, è possibile utilizzare la codifica Base64:
from base64 import binascii
f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))
Nel mio test molto semplici con 33k caratteri, la stringa zlib è stata del 28% la dimensione della stringa originale, i base64 stringa zlib era 37% la dimensione della stringa originale. Non era così buono sulla compressione, ma ancora un grande miglioramento.
Altri suggerimenti
Se non si desidera codificare, bisogna conservarlo come un oggetto binario (BLOB), non è una stringa. Django non sembra supportare BlobFields fuori dalla scatola, in modo da andare a trovarlo in rete o incidere qualcosa insieme.