Zlib في قاعدة البيانات - Django
-
22-08-2019 - |
سؤال
عندما أحاول وضع سلسلة zlibbed في models.textfield
>>> f = VCFile(head = 'blahblah'.encode('zlib'))
>>> f.save()
يفشل:
...
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'>)
هل هناك أي طريقة لإصلاح هذا (بصرف النظر عن الهروب من السلسلة - يجب أن تكون أكثر فعالية للفضاء)؟
المحلول
كما يقول ماركوس ، سيتعين عليك استخدام Blob إذا كنت ترغب في الاحتفاظ بها بتنسيق ثنائي. إذا كنت موافقًا على ترميزه ، فيمكنك استخدام ترميز BASE64:
from base64 import binascii
f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))
في اختباراتي الأساسية للغاية مع 33K حرفًا ، كانت سلسلة ZLIB 28 ٪ من حجم السلسلة الأصلية ، وكان سلسلة ZLIB المشفرة BASE64 37 ٪ من حجم السلسلة الأصلية. ليس جيدًا على الضغط ، ولكن لا يزال تحسنًا كبيرًا.
نصائح أخرى
إذا كنت لا ترغب في تشفيره ، فيجب عليك تخزينه ككائن ثنائي (Blob) ، وليس سلسلة. لا يبدو أن Django يدعم Blobfields خارج الصندوق ، لذا اذهب إلى العثور عليه على الشبكة أو اختراق شيئًا معًا.
لا تنتمي إلى StackOverflow