SQLAlchemy经典映射不会将所选行映射到模型类的实例

时间:2016-01-29 20:55:02

标签: python orm sqlalchemy

我很难过。我真的必须遗漏一些关于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,)

0 个答案:

没有答案