SQLAlchemy的with_polymorphic忽略了鉴别器

时间:2013-06-04 10:01:09

标签: sqlalchemy flask-sqlalchemy

我正在尝试从已加入的固定表中进行多态加载(我使用Flask-Sqlalchemy)。

class Sip(db.Model):
    id = db.Column(db.Integer, primety_key=True)
    identity = db.Column(db.String(10))
    __mapper_args__ = {'polymorphic_identity': 'sip', 'polymorphic_on': identity}

class Device(Sip):
    id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'dev'}

class Line(Sip):
    id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'line'}

我有一个Device对象和一个Line对象。当我尝试进行这样的查询时:

Sip.query.with_polymorphic(Device).all()

它返回所有对象

[<myapp.models.Device at 0x45cfc50>, <myapp.models.Line at 0x45cfa90>]

当我使用Line作为with_polymorphic()的参数时,情况相同。表“sip”包含所有必需的身份,我可以检查它:

>> Sip.query.with_polymorphic(Device).all()[0].identity
>> u'dev'
>> Sip.query.with_polymorphic(Device).all()[1].identity
>> u'line'

我无法弄清楚发生了什么。一切似乎都与doc示例完全一样。 感谢。

1 个答案:

答案 0 :(得分:4)

with_polymorphic 不按类型过滤对象,但仅定义在初始查询期间从中获取其他表的列。因此,如果您未在查询中使用with_polymorphic,并且想要获取存储在Line表中的lines属性的值,则SA将发出另一个SQL从数据库中获取属性的语句。

在引擎中启用echo=True,您将看到根据with_polymorphic用法生成了不同的SQL语句:

  • 无用法:在查询期间仅加载sips表中的属性
  • with_polymorphic(Device):也会加载devices表的属性(使用LEFT JOIN s)
  • with_polymorphic("*"):将为同一查询中的所有子类加载属性。

有关该主题的更多信息,请阅读Basic Control of Which Tables are Queried