Django SQL Logging as UTF-8 : 避免 UnicodeDecodeError 而设置.调试=真


很长一段时间

以来,我不得不与"UnicodeDecodeError:ascii 编解码器无法解码..."保存()-处理模型时出错,直到我"不小心"设置设置。调试=假。 然后我意识到Unicode异常不是来自我的数据,也不是来自我的代码,而是来自Django的SQL日志记录,这显然是在ascii中。

问题是,有没有一种简单的方法可以将日志记录从 ascii 转换为 utf-8,以便我仍然可以使用日志记录功能而无需处理异常?

非常感谢!=)

我发现了一个似乎暂时有效的黑客。 In django/db/backends/util.py:

class CursorDebugWrapper(CursorWrapper):
    # XXX callproc isn't instrumented at this time.
    def execute(self, sql, params=None):
        start = time()
        try:
            return super(CursorDebugWrapper, self).execute(sql, params)
        finally: 
            stop = time()
            duration = stop - start
            sql = self.db.ops.last_executed_query(self.cursor, sql, params)
            self.db.queries.append({
                'sql': sql,
                'time': "%.3f" % duration,
             })
            logger.debug('(%.3f) %s; args=%s' % (duration, sql, params),
                extra={'duration': duration, 'sql': sql, 'params': params}
            )

我将最后一行更改为:

            logger.debug('(%.3f) %s; args=%s' % (duration, sql.decode('utf-8'), params),
                extra={'duration': duration, 'sql': sql, 'params': params}
            )

如果有人能给出更好/更优雅的解决方案,那就太好了。

最新更新