Python Sqlalchemy超出了最大递归深度

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

我编写这个循环是为了使用Sqlalchemy动态构建select语句,以减少数据库命中率

我不明白为什么调用
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])