我很难过。我真的必须遗漏一些关于SQLAlchemy ORM如何工作的基本知识。
出于同样的原因,我希望我的Java模型是POJO(Plain Old Java Objects),我希望我的Python对象独立于ORM。 (我可以称它们为POPO吗?)。
这就是为什么我选择使用SQLAlchemy ORM的“经典”映射。文档反复声明声明性和经典映射方法是等价的,事实上,前者使用后者。
问题在于它对我来说不起作用。具体来说,当我选择读取一个对象时,它没有被映射到我的对象类的实例。我正在找回我的调试器标记“结果”对象 - 原始行对象。
作为证据,我提交了两个最小的申请。第一个使用声明性映射并且工作得很好。我的模型作为一个类实例进入,并作为一个实例出现。第二个使用经典映射,我的模型作为类实例进入,并作为行结果出现。
我在这里缺少什么?
我正在使用Python 2.7.10和SQLAlchemy 1.0.11。
声明性映射,它确实有效:
from sqlalchemy import create_engine, Column, Integer, orm
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Thing(Base):
__tablename__ = 'thing'
id = Column(Integer, primary_key=True)
engine = create_engine("sqlite://")
Base.metadata.create_all(engine)
Session = orm.sessionmaker(bind=engine)
session = Session()
thing = Thing()
print "In: " + str(thing)
session.add(thing)
session.commit()
thing = session.query(Thing).one()
print "Out: " + str(thing)
输出:
In: <__main__.Thing object at 0x10c94c490>
Out: <__main__.Thing object at 0x10c94c490>
经典地图版本,不起作用:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, orm
class Thing(object):
pass
engine = create_engine("sqlite://")
metadata = MetaData()
thing_table = Table(
'thing',
metadata,
Column('id', Integer, primary_key=True)
)
orm.mapper(Thing, thing_table)
metadata.create_all(engine)
Session = orm.sessionmaker(bind=engine)
session = Session()
thing = Thing()
print "In: " + str(thing)
session.add(thing)
session.commit()
thing = session.query(thing_table).one()
print "Out: " + str(thing)
输出:
In: <__main__.Thing object at 0x10cda2b10>
Out: (1,)