Python 使用joinedload的sqlalchemy查询在每个新的筛选子句中都会以指数级的速度减慢
我有一个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
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())