Python 使用joinedload的sqlalchemy查询在每个新的筛选子句中都会以指数级的速度减慢

Python 使用joinedload的sqlalchemy查询在每个新的筛选子句中都会以指数级的速度减慢,python,sqlalchemy,Python,Sqlalchemy,我有一个sqlalchemy查询: query = session.query(Store).options(joinedload('salesmen'). joinedload('comissions'). joinedload('orders')).\ filter(Store.store_code.in_(selec

我有一个sqlalchemy查询:

query = session.query(Store).options(joinedload('salesmen').
                                        joinedload('comissions').
                                        joinedload('orders')).\
        filter(Store.store_code.in_(selected_stores))

stores = query.all()
for store in stores:
    for salesman in store.salesmen:
        for comission in salesman.comissions:
            #generate html for comissions for each salesman in each store

#print html document using PySide
这非常有效,但是我添加了两个新的过滤器查询:

        filter(Comissions.payment_status == 0).\
        filter(Order.order_date <= self.dateEdit.date().toPython())
filter(commissions.payment\u status==0)\

filter(Order.Order_date您的
FROM
子句正在生成一个笛卡尔乘积,并包含每个表两次,一次用于过滤结果,一次用于急切地加载关系

要停止此操作,请在选项中使用而不是joinedload。这将在查询的列中查找相关属性,而不是构造额外的联接。您还需要显式联接到查询中的其他表,例如:

query = session.query(Store)\
               .join(Store.salesmen)\   
               .join(Store.commissions)\    
               .join(Store.orders)\     
               .options(contains_eager('salesmen'),
                        contains_eager('comissions'),
                        contains_eager('orders'))\
               .filter(Store.store_code.in_(selected_stores))\
               .filter(Comissions.payment_status == 0)\
               .filter(Order.order_date <= self.dateEdit.date().toPython())
query=session.query(存储)\
.加入(商店销售人员)\
.加入(商店.佣金)\
.加入(商店订单)\
.options(包含“销售人员”),
包含“佣金”,
包含_eager('orders'))\
.filter(Store.Store_code.in_(所选_存储))\
.filter(佣金支付状态==0)\

.filter(Order.Order_date)SQL是什么样子的?您可以通过打印str(query.statement.compile())来查看它@MattiJohn刚刚添加了查询。这有帮助吗?我可以发布您需要的任何信息非常感谢Matti,只需稍作修改,它就工作得非常好!
query = session.query(Store)\
               .join(Store.salesmen)\   
               .join(Store.commissions)\    
               .join(Store.orders)\     
               .options(contains_eager('salesmen'),
                        contains_eager('comissions'),
                        contains_eager('orders'))\
               .filter(Store.store_code.in_(selected_stores))\
               .filter(Comissions.payment_status == 0)\
               .filter(Order.order_date <= self.dateEdit.date().toPython())