postgresql - 根据选定的过滤器动态修改查询
问题描述
在现有的代码库中,一些表现在在同一个数据库中水平分片,但在不同的命名空间中。
例如,假设以前有一个大表users
,现在由国家字段分片,所以现在有以下表:us.users
、ca.users
等es.users
。
由于对表的每个查询都已经包含country
过滤器,因此我正在考虑进行以下简约调整,因此无需手动或动态地为每个国家/地区的原始模型子类化:
class SessionWithShardedTableSupport(Session):
""" Use sharded tables on the fly """
def connection(self, mapper=None, clause=None, bind=None, close_with_result=None, **kw):
if mapper and mapper.local_table.name == 'users':
mapper.local_table.schema = '???' # `us` or `ca` or `es`
return super().connection(mapper, clause, bind, close_with_result, **kw)
如果有一种方法可以country
从会话中的查询中获取过滤器,但似乎没有(至少检查两个mapper
&clause
参数没有显示它们),则该解决方案将正常工作。
1)有没有办法从会话中获取 where 子句/过滤器?
2) 是否有更好的方法通过对现有代码的最小更改来动态调整表名/表命名空间?
解决方案
推荐阅读
- python - 使用 Pythorch 翻转 2 张量蒙版
- python - 负 SKlearn 线性回归分数
- reactjs - 如何使用多个选择的选项 React
- java - 在 for 循环中侦听鼠标单击事件,并在以后的代码中使用该事件的坐标
- google-apps-script - 使用 Google Apps 脚本将项目符号列表插入 Google Doc 的首选方法是什么?
- node.js - 如何在我的 socket.io 项目中添加多个房间?
- laravel - firstOrCreate 是否尊重演员表?
- rust - 使用 std::iter::IntoIterator 的代码不起作用
- chef-infra - 在本地机器上使用 Packer 配置 Chef
- python - 使用 pandas 数据框列作为键创建嵌套字典的有效方法