Python Sqlalchemy超出了最大递归深度
我编写这个循环是为了使用Sqlalchemy动态构建select语句,以减少数据库命中率 我不明白为什么调用Python Sqlalchemy超出了最大递归深度,python,recursion,sqlalchemy,Python,Recursion,Sqlalchemy,我编写这个循环是为了使用Sqlalchemy动态构建select语句,以减少数据库命中率 我不明白为什么调用query.all()时会出现最大递归深度超过错误 当我将递归深度max更改为2000时,这个查询工作正常 代码: 目前,您正在for循环中递归地构建以下嵌套逻辑条件 or(...or(or(false, condition1), condition2), ... conditionN) 相反,如果表示等效条件: or(condition1, condition2, ... condit
query.all()
时会出现最大递归深度超过错误
当我将递归深度max更改为2000时,这个查询工作正常
代码:
目前,您正在for循环中递归地构建以下嵌套逻辑条件
or(...or(or(false, condition1), condition2), ... conditionN)
相反,如果表示等效条件:
or(condition1, condition2, ... conditionN)
使用列表理解和解包,避免了递归
def condition(model, asset):
return and_(model.version == asset.get("version"),
model.id == asset.get("id"),
model.account_id == account_id)
filter_cond = or_(*[condition(model, asset) for asset in assets])
如果完全避免列表编译和解包,只需这样做生成器是否会更快:
filter\u cond=或((AuthorizationTool.build\u statement(model,asset,account\u id)for asset in assets))
不确定生成器表达式是否实际工作,如果性能有问题,请重新说明速度,请使用各种大小的资产测试块
@RustyShackleford生成器通过根据需要生成元素而不是预先生成元素来优化内存使用,而不是速度。代价是为每个元素额外调用生成器的next
方法。@Haleemur-Ali我认为它确实有效,或者接受任何可迭代的
def condition(model, asset):
return and_(model.version == asset.get("version"),
model.id == asset.get("id"),
model.account_id == account_id)
filter_cond = or_(*[condition(model, asset) for asset in assets])