У меня есть django проект, который использует sqlite базу данных, которая может быть записана во внешним инструментом. Текст, как предполагается, является UTF-8, но в некоторых случаях в кодировании будут ошибки. Текст из внешнего источника, таким образом, я не могу управлять кодированием. Да, я знаю, что мог записать "переносящийся слой" между внешним источником и базой данных, но я предпочитаю не иметь необходимость сделать это, тем более, что база данных уже содержит много "плохих" данных.
Решение в sqlite состоит в том, чтобы изменить text_factory на что-то как: lambda x: unicode(x, "utf-8", "ignore")
Однако я не знаю, как сказать драйвер модели Django это.
Исключение, которое я получаю:
'Could not decode to UTF-8 column 'Text' with text' in /var/lib/python-support/python2.5/django/db/backends/sqlite3/base.py in execute
Так или иначе я должен сказать sqlite драйверу не пытаться декодировать текст как UTF-8 (по крайней мере, не использующий стандартный алгоритм, но он должен использовать мой отказоустойчивый вариант).
Решение в sqlite - изменить text_factory на что-то вроде: лямбда x: unicode (x, "utf-8", "ignore")
Однако я не знаю, как сообщить об этом драйверу модели Django.
Вы пробовали
from django.db import connection
connection.connection.text_factory = lambda x: unicode(x, "utf-8", "ignore")
перед выполнением каких-либо запросов?
Загрузите данные с помощью одной из волшебных функций str из Django:
smart_str(s, encoding='utf-8', strings_only=False, errors='strict')
или
smart_unicode(s, encoding='utf-8', strings_only=False, errors='strict')