首页 > 解决方案 > 根据选定的过滤器动态修改查询

问题描述

在现有的代码库中,一些表现在在同一个数据库中水平分片,但在不同的命名空间中。

例如,假设以前有一个大表users,现在由国家字段分片,所以现在有以下表:us.usersca.userses.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) 是否有更好的方法通过对现有代码的最小更改来动态调整表名/表命名空间?

标签: postgresqlsqlalchemyshardingdatabase-partitioning

解决方案


推荐阅读