首页 > 解决方案 > SQL alchemy 对 LIMIT 查询应用默认过滤器

问题描述

在我们的代码中,我们有一个 before_compile 方法,该方法在所有查询上运行,并自动添加一些额外的过滤器(基于当前上下文)以获取同一张表上的多租户结果。当 before_compile 钩子运行并添加额外的过滤器时,当我们有一个在原始查询中具有限制/偏移量的查询时,我们会收到此错误。

Query.filter() 在已经应用了 LIMIT 或 OFFSET 的 Query 上被调用。要修改查询的行限制结果,请先调用 from_self()。否则,在应用 limit() 或 offset() 之前调用 filter()。

我们有钩子,以便能够将查询标记为未在编译钩子中应用通用过滤器的查询,并且只需要确保在钩子之前将正确的多租户逻辑应用于查询,但它会是很高兴能够依赖该钩子进行所有查询。有没有办法以这种方式在限制后应用过滤器?在这种情况下 from_self 不起作用,因为它在完成额外过滤之前将限制应用于查询,这可能意味着由于限制,原始结果集中的行受到限制,但是由于添加了额外的过滤器,进一步的行受到限制限制之后。

这是我们正在运行的 before_compile 方法的 jist。

@event.listens_for(Query, "before_compile", retval=True)
def ensure_project_identified(query: Query):
    context = getattr(query, 'context', None)
    safe_mode = getattr(query, 'safe', True)
    if not safe_mode:
        return query
    # Logic to get partitioned entities based on their mixin classes. 
    for partitioned_entity in partitioned_models:
        _LOGGER.debug("Adding tenant id of %s qualifier to %s entity." % (context.tenant_id, str(partitioned_entity)))
        query = query.filter(partitioned_entity.tenant_id == context.tenant_id)
    return query

标签: pythonsqlalchemy

解决方案


推荐阅读