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示例。谢谢。
with_polymorphic 不会按类型过滤对象,而仅定义在初始查询期间要从中提取其他表的列。因此,如果您不使用with_polymorphic查询,并且想要获取Line存储在lines表中的属性的值,则SA将发出另一条SQL语句以从数据库中获取该属性。
echo=True在引擎中启用,您将看到根据with_polymorphic用法生成了不同的SQL语句:
sips查询期间仅加载表中的属性with_polymorphic(Device):还将加载devices表的属性(使用LEFT JOIN)with_polymorphic("*"):将在同一查询中加载所有子类的属性。有关该主题的更多信息,请阅读查询哪些表的基本控制。
| 归档时间: |
|
| 查看次数: |
1243 次 |
| 最近记录: |