使用SQLAlchemy将对象插入数据库时,与String()列对应的所有属性都会自动转换为< type'str'>到< type'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技能:)
答案 0 :(得分:12)
实际上,有一种方法可以做到这一点。只需在创建引擎后执行以下代码行:
engine.raw_connection()。connection.text_factory = str
答案 1 :(得分:6)
不幸的是,你运气不好,这似乎不适用于sqlite
。来自SQLAlchemy 0.6.2 Documentation - SQLite - Unicode的引用:
与SQLAlchemy的活跃相反 处理日期和时间类型 pysqlite,pysqlite的默认行为 关于Unicode是所有字符串 作为Python unicode对象返回 在所有情况下。所以即使是Unicode 不使用类型,你仍然会 总是从中接收unicode数据 结果集。这是强烈的 建议您使用 Unicode类型表示字符串, 因为它会引发警告 传递非unicode Python字符串 来自用户应用程序。混合 使用非unicode对象 可以快速返回unicode对象 制造混乱,特别是在何时 使用ORM作为内部数据不是 总是由实际代表 数据库结果字符串。