Sqlalchemy中递归深度超过最大限制

3
我写了这个循环,使用Sqlalchemy动态构建选择语句,以尽量减少对数据库的访问。但是当调用query.all()时,我不明白为什么会出现“超过最大递归深度”的错误。将递归深度最大值更改为2000后,此查询正常工作。
代码:
filter_cond = False
for asset in assets:
    filter_cond = or_(filter_cond, and_(model.version == asset.get("version"),
                                        model.id == asset.get("id"),
                                        model.account_id == account_id))
query = session.query(model).filter(filter_cond)
result_set = query.all()
1个回答

3

目前您正在使用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_cond = or_((AuthorizationTool.build_statement(model, asset, account_id) for asset in assets)) - RustyShackleford
不确定你的生成器表达式是否真正有效,关于速度,如果性能是一个问题,请使用各种大小的“资产”测试该块。 - Haleemur Ali
2
@RustyShackleford 生成器通过按需生成元素而不是预先生成来优化内存使用,而不是速度。代价是对于每个元素都需要额外调用生成器的“next”方法。 - chepner
@Haleemur Ali,它确实有效,我想它接受任何可迭代对象。 - RustyShackleford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接