SQLAlchemy的UnicodeText列给我一个str我的MySQL表;不应该是unicode吗?

时间:2014-01-09 22:54:14

标签: python mysql unicode sqlalchemy

假设我有一张简单的表格:

class MyTable(...):
    __tablename__ = 'my_table'
    id = ...
    unicode_col = Column(UnicodeText())

现在我想从中获取一些数据:

assert type(session.query(MyTable).first().unicode_col) == unicode  # this fails

但事实并非如此。它给了我一个str回来。

根据this pagethis pagethis 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。

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)