2016-10-29 94 views
0

我正在构建一个扩展unicode类和其他一些方法的库,我发现MySQLdb在使用我的unicode类时失败。MySQLdb execute()适用于unicode,但不适用于unicode的子类

这工作:

In [23]: c.execute("""SELECT * FROM django_site WHERE domain LIKE %s""",(u'éric',)) 
Out[23]: 0L 

但是,这并不:

In [24]: class UnicodeExtended(unicode): 
    ...:  pass 
    ...: 

In [25]: c.execute("""SELECT * FROM django_site WHERE domain LIKE %s""",(UnicodeExtended(u'éric'),)) 
--------------------------------------------------------------------------- 
UnicodeEncodeError      Traceback (most recent call last) 
<ipython-input-25-9145669d2b00> in <module>() 
----> 1 c.execute("""SELECT * FROM django_site WHERE domain LIKE %s""",(UnicodeExtended(u'éric'),)) 

/usr/lib/python2.7/dist-packages/MySQLdb/cursors.pyc in execute(self, query, args) 
    205     args = dict((key, db.literal(item)) for key, item in args.items()) 
    206    else: 
--> 207     args = tuple(map(db.literal, args)) 
    208    if not PY2 and isinstance(query, bytes): 
    209     query = query.decode(db.unicode_literal.charset) 

/usr/lib/python2.7/dist-packages/MySQLdb/connections.pyc in literal(self, o) 
    302 
    303   """ 
--> 304   s = self.escape(o, self.encoders) 
    305   # Python 3 doesn't support % operation for bytes object. 
    306   # We should decode it before using %. 

/usr/lib/python2.7/dist-packages/MySQLdb/connections.pyc in string_literal(obj, dummy) 
    213    # Note: string_literal() is called for bytes object on Python 3. 
    214    def string_literal(obj, dummy=None): 
--> 215     return db.string_literal(obj) 
    216    return string_literal 
    217 

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128) 

是否有可能使用unicode到SQL的sublass以任何方式查询参数?

可能是我的UnicodeExtended类缺少的东西...任何想法?

林正在使用Python 2.7和1.3.7 MySQLdb的

回答

0

我发现MySQLdb的直接测试UnicodeType,它不支持Unicode的子类。作为默认,MySQLdb将对无法识别的对象类型执行str()。所以技巧是添加__str_方法:

class UnicodeExtended(unicode): 
    def __str__(self): 
     return self.encode('utf-8') 

这是行得通的。这也避免了使用UnicodeExtended对象时django的“_last_executed”错误。

相关问题