gpt4 book ai didi

SQLAlchemy 的 with_polymorphic 忽略鉴别器

转载 作者:行者123 更新时间:2023-12-01 11:44:15 27 4
gpt4 key购买 nike

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

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

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'

我只是想不通发生了什么。一切似乎都与文档示例完全一样。谢谢。

最佳答案

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

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

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

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

关于SQLAlchemy 的 with_polymorphic 忽略鉴别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914922/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com