SQLAlchemy:将表与对象的子对象连接起来
我有三种对象类型和相应的表:SQLAlchemy:将表与对象的子对象连接起来,sqlalchemy,Sqlalchemy,我有三种对象类型和相应的表: class Order: suborders = relationship('Suborder', lazy='dynamic') class Suborder: ... class PurchaseOrder: suborder = relationship('Suborder', foreign_keys=[suborder_id], lazy='joined') 现在,我需要获取与订单的子订单匹配的所有PurchaseOrder实例。在纯SQ
class Order:
suborders = relationship('Suborder', lazy='dynamic')
class Suborder:
...
class PurchaseOrder:
suborder = relationship('Suborder', foreign_keys=[suborder_id], lazy='joined')
现在,我需要获取与订单的子订单匹配的所有PurchaseOrder实例。在纯SQL中,我会这样写:
SELECT po.*
FROM purchase_orders AS po JOIN suborders AS so ON po.suborder_id = so.id
WHERE so.order_id = 'order-007'
我如何使用SQLAlchemy实现它?我试过这个:
o = Order.query.get('order-007')
PurchaseOrder.query.join(o.suborders)
但这给了我一个错误:
AttributeError:'AppenderQuery'对象没有属性'is\u可选'
正确的方法是什么?只需一次查询即可获取所需数据:
query = (
PurchaseOrder.query
.join(Suborder)
.filter(Suborder.order_id == 'order-007')
)
如果您已经拥有订单实例o,则可以执行以下操作:
o = Order.query.get('order-007') # already have the order instance
query = (
session.query(PurchaseOrder)
.join(Suborder)
.with_parent(o)
)
,但您仍需要加入子订单
我不赞成这种做法。但是.filterSuborder.order_id=='order-007'不是以某种方式嵌入到关系类型中吗?我不太理解这个问题。但如果您执行printquery,您将看到它应该生成您正在查找的SQL\nFROM suborders\n此处%s=suborders.order_id',因此我希望能够将PurchaseOrder与o.suborder表连接起来,请参见。不,不是你想的那样。实际上,stro.suborders甚至打印某种SQL的唯一原因是您将suborders关系定义为lazy='dynamic'。否则,可以将is视为两个实体之间关系的定义。我发布的解决方案将只提供一个SQL查询结果。当然,你可以用不同的方式来做,我将用选项来扩展我的答案。
But again, the first one would correspond to the SQL query you provided as the SQL implementation.