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