Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLAlchemy:将表与对象的子对象连接起来_Sqlalchemy - Fatal编程技术网

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.