首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django/sqlite中更改text_factory

在Django/sqlite中更改text_factory
EN

Stack Overflow用户
提问于 2010-04-30 21:00:49
回答 6查看 4.5K关注 0票数 6

我有一个使用sqlite数据库的django项目,该数据库可以由外部工具写入。文本应该是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 (至少不使用标准算法,但它需要使用我的故障保护变体)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-19 05:11:36

忽略sqlite中的解决方案是将text_factory更改为: lambda x: unicode(x,"utf-8",“

”)

然而,我不知道如何告诉Django模型驱动程序这一点。

你试过了吗?

代码语言:javascript
复制
from django.db import connection
connection.connection.text_factory = lambda x: unicode(x, "utf-8", "ignore")

在运行任何查询之前?

票数 9
EN

Stack Overflow用户

发布于 2015-03-01 22:29:07

受Milla的回答的启发,考虑下面的猴子补丁,它将一个更容错的text_factory安装到django sqlite连接中。当您无法控制如何将文本添加到sqlite数据库中,并且它可能不是utf-8格式时使用。当然,这里使用的编码可能不正确,但至少您的应用程序不会崩溃。

代码语言:javascript
复制
import types
from django.db.backends.sqlite3.base import DatabaseWrapper

def to_unicode( s ):
    ''' Try a number of encodings in an attempt to convert the text to unicode. '''
    if isinstance( s, unicode ):
        return s
    if not isinstance( s, str ):
        return unicode(s)

    # Put the encodings you expect here in sequence.
    # Right-to-left charsets are not included in the following list.
    # Not all of these may be necessary - don't know.
    encodings = (
        'utf-8',
        'iso-8859-1', 'iso-8859-2', 'iso-8859-3',
        'iso-8859-4', 'iso-8859-5',
        'iso-8859-7', 'iso-8859-8', 'iso-8859-9',
        'iso-8859-10', 'iso-8859-11',
        'iso-8859-13', 'iso-8859-14', 'iso-8859-15',
        'windows-1250', 'windows-1251', 'windows-1252',
        'windows-1253', 'windows-1254', 'windows-1255',
        'windows-1257', 'windows-1258',
        'utf-8',     # Include utf8 again for the final exception.
    )
    for encoding in encodings:
        try:
            return unicode( s, encoding )
        except UnicodeDecodeError as e:
            pass
    raise e

if not hasattr(DatabaseWrapper, 'get_new_connection_is_patched'):
    _get_new_connection = DatabaseWrapper.get_new_connection
    def _get_new_connection_tolerant(self, conn_params):
        conn = _get_new_connection( self, conn_params )
        conn.text_factory = to_unicode
        return conn

    DatabaseWrapper.get_new_connection = types.MethodType( _get_new_connection_tolerant, None, DatabaseWrapper )
    DatabaseWrapper.get_new_connection_is_patched = True
票数 2
EN

Stack Overflow用户

发布于 2010-04-30 21:16:28

用Django中的一个神奇的str function输入数据:

代码语言:javascript
复制
smart_str(s, encoding='utf-8', strings_only=False, errors='strict')

代码语言:javascript
复制
smart_unicode(s, encoding='utf-8', strings_only=False, errors='strict')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2744632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档