3

我正在尝试从连接的继承表中进行多态加载(我使用 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'

我只是不知道发生了什么事。一切似乎都与文档示例完全相同。谢谢。

4

1 回答 1

5

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

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

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

有关该主题的更多信息,请阅读查询哪些表的基本控制

于 2013-06-05T10:15:20.073 回答