2010-06-13 95 views
4

使用SQLAlchemy将对象插入到数据库时,所有对应于String()列的属性都会自动从<类型'str'>转换为<类型'unicode'>。有没有办法来防止这种行为?SQLAlchemy在提交时自动将str转换为unicode

下面是代码:

from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData 
from sqlalchemy.orm import mapper, sessionmaker 

engine = create_engine('sqlite:///:memory:', echo=False) 
metadata = MetaData() 

table = Table('projects', metadata, 
    Column('id', Integer, primary_key=True), 
    Column('name', String(50)) 
) 

class Project(object): 
    def __init__(self, name): 
     self.name = name 

mapper(Project, table) 
metadata.create_all(engine) 

session = sessionmaker(bind=engine)() 

project = Project("Lorem ipsum") 

print(type(project.name)) 

session.add(project) 
session.commit() 

print(type(project.name)) 

这里是输出:

<type 'str'> 
<type 'unicode'> 

我知道我应该可能只是使用Unicode工作,但是这将需要通过一些第三方的代码挖掘我还没有Python技能:)

+2

这里的二丑黑客:要么使用二进制,而不是字符串或'engine.connect()connection.connection .text_factory = str' – jfs 2010-06-13 21:09:13

+0

非常感谢你,如果你已经发布了答案,我会接受这个解决方案:) – 2010-06-13 21:25:14

回答

12

实际上,有一种方法可以做到这一点。创建引擎后,只需执行这行代码:

engine.raw_connection()connection.text_factory = STR

6

不幸的是,你运气不好,这似乎并不适用于sqlite。从SQLAlchemy 0.6.2 Documentation - SQLite - Unicode引述:

相较于SQLAlchemy中的积极 处理日期和时间类型为 pysqlite,关于统一pysqlite的默认行为 的是,作为Python的Unicode对象在所有情况下 所有字符串 返回。所以,即使没有使用Unicode 类型,您仍然会从 返回一个结果集,但始终会收到来自 的unicode数据。强烈推荐 建议您使用Unicode类型 来表示字符串 ,因为如果 非Unicode Unicode字符串从用户应用程序传递 会引发警告。混合 使用非unicode对象与返回 Unicode对象可以快速 产生混淆,特别是当 使用ORM作为内部数据不总是 由实际 数据库结果字符串表示。

+0

啊,所以我只会对SQLite有这个问题,很高兴知道。我打算在将来使用unicode :) – 2010-06-13 21:26:18

+0

好吧,从zifot的回答可以明显看出,这真的取决于底层驱动程序;但是sqlite是SA文档中提到的唯一一个 – van 2010-06-14 05:54:29