python - 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
解决方案
推荐阅读
- c++ - 关于将irrKlang音频引擎集成到opengl cmake项目中的问题
- ios - 可可豆荚在 Mac OS Monterey 上不起作用
- c# - 动态读取输入 Razor MVC C#
- c# - 如何在 Xamarin 表单中使用 MVVM 仅为集合视图中的选定框架设置颜色?
- asp.net-mvc - 当http错误500.19或隐藏配置源时如何重定向到错误页面
- android - AR 场景活动崩溃
- flutter - 如何从列表中获取分页数据表从开始日期到结束日期的行并添加搜索栏,如图所示?
- git - 是否有使用 git 存储“主代码”的选项?
- php - 如何从 Laravel 日期范围内未创建的数据库中获取记录?
- swift - 带有 AVAudioPlayerNode 的 SpriteKit 位置音频