SQLAlchemy的with_polymorphic忽略鉴别符

roc*_*erd 3 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'}
Run Code Online (Sandbox Code Playgroud)

我有一个Device对象和一个Line对象。当我尝试进行此类查询时:

Sip.query.with_polymorphic(Device).all()
Run Code Online (Sandbox Code Playgroud)

它返回所有对象

[<myapp.models.Device at 0x45cfc50>, <myapp.models.Line at 0x45cfa90>]
Run Code Online (Sandbox Code Playgroud)

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

>> Sip.query.with_polymorphic(Device).all()[0].identity
>> u'dev'
>> Sip.query.with_polymorphic(Device).all()[1].identity
>> u'line'
Run Code Online (Sandbox Code Playgroud)

我只是不知道发生了什么事。一切似乎都完全像doc示例。谢谢。

van*_*van 5

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

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

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

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

  • 可以,但是我想一次从Device和Sip中获取所有列,据我所知,with_polymorphic()确实可以。 (2认同)