2

我正在尝试调用一个函数来执行查询:

def run(self,query):       
        try:
            self.cursor = self.conn.cursor ()
            self.cursor.execute(query)
        except MySQLdb.Error, e:
            logger.info( "Run function with query: %s Error %d: %s" % (query,e.args[0], e.args[1]))
        except:
            logger.info( "Errorin Run function with query %s" % (query))

此功能适用于大多数查询。

我正在尝试运行一个查询:

insert into NewBooks (title,WikiLink) values
   ('Five Point Someone – What not to do at IIT!',
    'http://en.wikipedia.org/wiki/Five Point Someone – What not to do at IIT!')

此查询引发异常,输出为Errorin Run function with query %s" % (query) Traceback 错误:错误:我得到的是 UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 120: ordinal not in range(256)

当我在 Mysql 命令行上复制并运行时,它起作用了。有人可以解释一下我可能出了什么问题吗?

4

1 回答 1

0

您在该查询中有一些特殊字符,并且您的默认语言环境是 latin-1 (iso-8859-1)。当 python 尝试打印出错误消息并包含您的查询时,它无法将您的 unicode 对象编码为字节(它必须这样做,因为您只能通过管道发送字节,而不是代码点)。

您可以尝试使用支持 utf-8 的终端运行,确保您的语言环境对 utf-8 友好,或者明确指定您希望如何编码查询数据以进行输出。

一个很好的快速更改是%r在该行上使用而不是%s.

logger.info( "Errorin Run function with query %r" % (query,))

这只会以您可以将其粘贴回 Python 的方式显示查询对象,因此特殊字符将被转义。

此外,您正在吞下应该显示的实际错误,方法是用一个裸露的“除外”捕获所有内容。你真的应该要么把它拿出来,让 Python 向你展示回溯本身,要么放

import traceback
traceback.print_exc()

那最后光秃秃的下except:

于 2012-05-18T01:41:27.033 回答