假设我有一张简单的表格:
class MyTable(...):
__tablename__ = 'my_table'
id = ...
unicode_col = Column(UnicodeText())
现在我想从中获取一些数据:
assert type(session.query(MyTable).first().unicode_col) == unicode # this fails
但事实并非如此。它给了我一个str
回来。
根据this page,this page和this page,我认为应该给我unicode
而不是str
,因为我正在通过{ {1}}在我的连接URI中。
我正在使用的解决方法是一个简单的类型装饰器,它工作正常:
charset=utf8
但是sqlalchemy不应该首先给我class CoercedUTF8UnicodeText(sqlalchemy.types.TypeDecorator):
impl = UnicodeText
def process_result_value(self, value, dialect):
if isinstance(value, str):
return value.decode('UTF-8')
return value
class MyTable(...):
__tablename__ = 'my_table'
id = ...
unicode_col = Column(CoercedUTF8UnicodeText())
个对象吗?
其他信息
如果我使用sqlite数据库,我会得到unicode
。
Here's a self-contained runnable example.
我使用的是Python 2.7.5,sqlalchemy 0.8.2和MySQL-Python 1.2.3。
答案 0 :(得分:1)
您使用的是mysql-python驱动程序吗?我建议尝试使用oursql:
pip install oursql
...
create_engine('mysql+oursql://...')
甚至不需要添加charset = utf8,因为它是我们的默认值。
答案 1 :(得分:1)
我通过升级到MySQL-Python 1.2.5(从1.2.3开始)解决了这个问题。
问题实际上是由sqlalchemy尚未考虑的MySQL-Python错误引起的。在此处提交并讨论:http://www.sqlalchemy.org/trac/ticket/2906
答案 2 :(得分:0)
创建引擎时,您可以使用convert_unicode
标记,请参阅sqlalchemy docs:
如果设置为True,则将String类型的convert_unicode的默认行为设置为True,而不管单个String类型的False设置如何,从而导致所有基于String的列都适应Python unicode对象。当使用本身不支持Python unicode对象的DBAPI并在收到错误时引发错误(例如带有FreeTDS的pyodbc)时,此标志可用作引擎范围的设置。
即:
engine = create_engine('mysql://filename', convert_unicode=True)