Изменение запросов на лету в зависимости от выбранных фильтров - PullRequest
0 голосов
/ 30 октября 2019

В существующей кодовой базе некоторые таблицы теперь горизонтально сегментированы в одной и той же базе данных, но в разных пространствах имен.

Например, скажем, ранее была большая таблица 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) Возможно, есть лучший способ скорректировать имя таблицы / пространство имен таблицы на лету с минимальными изменениями в существующихкод звонка?

...