Горизонтальное разделение

Поддержка горизонтального чередования.

Определяет рудиментарную систему «горизонтального шардинга», которая позволяет сеансу распределять запросы и операции сохранения по нескольким базам данных.

Пример использования приведен в примере Горизонтальное разделение, включенном в дистрибутив исходного кода.

Deep Alchemy

Расширение горизонтального шардинга является расширенной функцией, предполагающей сложное взаимодействие оператор -> база данных, а также использование полупубличных API для нетривиальных случаев. Более простые подходы к обращению к нескольким «осколкам» базы данных, чаще всего с использованием отдельного Session для каждого «осколка», всегда должны рассматриваться в первую очередь перед использованием этой более сложной и менее проверенной на практике системы.

Документация по API

Object Name Description

set_shard_id

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

ShardedQuery

Класс запросов, используемый с ShardedSession.

ShardedSession

class sqlalchemy.ext.horizontal_shard.ShardedSession

Классическая подпись.

класс sqlalchemy.ext.horizontal_shard.ShardedSession (sqlalchemy.orm.session.Session)

method sqlalchemy.ext.horizontal_shard.ShardedSession.__init__(shard_chooser: ShardChooser, identity_chooser: Optional[IdentityChooser] = None, execute_chooser: Optional[Callable[[ORMExecuteState], Iterable[Any]]] = None, shards: Optional[Dict[str, Any]] = None, query_cls: Type[Query[_T]] = <class 'sqlalchemy.ext.horizontal_shard.ShardedQuery'>, *, id_chooser: Optional[Callable[[Query[_T], Iterable[_T]], Iterable[Any]]] = None, query_chooser: Optional[Callable[[Executable], Iterable[Any]]] = None, **kwargs: Any) None

Сконструировать ShardedSession.

Параметры:
  • shard_chooser – Вызываемый модуль, который, передав Mapper, сопоставленный экземпляр и, возможно, предложение SQL, возвращает идентификатор шарда. Этот идентификатор может быть основан на атрибутах, присутствующих в объекте, или на некоторой схеме круговой выборки. Если схема основана на выборе, то она должна установить любое состояние экземпляра, чтобы в будущем пометить его как участвующий в этом шарде.

  • identity_chooser – Вызываемый модуль, передающий аргумент Mapper и первичный ключ, который должен вернуть список идентификаторов шардов, в которых может находиться этот первичный ключ. … versionchanged:: 2.0 Параметр identity_chooser заменяет параметр id_chooser.

  • execute_chooser – Для заданного ORMExecuteState возвращает список shard_ids, по которым должен быть выполнен запрос. Результаты по всем возвращенным шардам будут объединены в один список. … versionchanged:: 1.4 Параметр execute_chooser заменяет параметр query_chooser.

  • shards – Словарь строковых имен осколков к объектам Engine.

method sqlalchemy.ext.horizontal_shard.ShardedSession.connection_callable(mapper: Optional[Mapper[_T]] = None, instance: Optional[Any] = None, shard_id: Optional[ShardIdentifier] = None, **kw: Any) Connection

Предоставьте Connection для использования в процессе смыва единицы работы.

method sqlalchemy.ext.horizontal_shard.ShardedSession.get_bind(mapper: Optional[_EntityBindKey[_O]] = None, *, shard_id: Optional[ShardIdentifier] = None, instance: Optional[Any] = None, clause: Optional[ClauseElement] = None, **kw: Any) _SessionBind

Возвращает «привязку», с которой связан данный Session.

Связка» обычно представляет собой экземпляр Engine, за исключением случая, когда Session был явно привязан непосредственно к Connection.

Для мультисвязанного или несвязанного Session аргументы mapper или clause используются для определения соответствующей привязки для возврата.

Отметим, что аргумент «mapper» обычно присутствует, когда Session.get_bind() вызывается через операцию ORM, такую как Session.query(), каждая отдельная операция INSERT/UPDATE/DELETE внутри Session.flush(), вызов и т.д.

Порядок разрешения следующий:

  1. Если задан mapper и присутствует Session.binds, найти привязку, основываясь сначала на используемом mapper, затем на используемом mapped class, затем на любых базовых классах, присутствующих в __mro__ mapped class, от более конкретных суперклассов к более общим.

  2. если дано предложение и присутствует Session.binds, найти привязку на основе объектов Table, найденных в данном предложении, присутствующих в Session.binds.

  3. Если Session.binds присутствует, то вернуть его.

  4. если дано предложение, попытаться вернуть привязку, связанную с MetaData, в конечном счете ассоциированную с этим предложением.

  5. если задан mapper, попытаться вернуть привязку, связанную с MetaData, в конечном счете ассоциированную с Table или другим selectable, с которым сопоставлен mapper.

  6. Связка не найдена, выдается сообщение UnboundExecutionError.

Заметим, что метод Session.get_bind() может быть переопределен в пользовательском подклассе Session для обеспечения любой схемы разрешения привязки. См. пример в Нестандартные вертикальные перегородки.

Параметры:
  • mapper – Необязательный сопоставленный класс или соответствующий экземпляр Mapper. Связка может быть получена из Mapper, во-первых, путем обращения к карте «binds», связанной с этой Session, и, во-вторых, путем обращения к MetaData, связанной с Table, к которой привязана Mapper для привязки.

  • clauseClauseElement (т.е. select(), text() и т.д.). Если аргумент mapper отсутствует или не может привести к связыванию, то в данной конструкции выражения будет произведен поиск связанного элемента, обычно это Table, связанный со связанным MetaData.

class sqlalchemy.ext.horizontal_shard.set_shard_id

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

Опция set_shard_id может быть применена методом Executable.options() в любом исполняемом операторе:

stmt = (
    select(MyObject).
    where(MyObject.name == 'some name').
    options(set_shard_id("shard1"))
)

Вышеприведенный оператор при вызове ограничится идентификатором шарда «shard1» для первичного запроса, а также для всех стратегий загрузки отношений и столбцов, в том числе и для таких загрузчиков как selectinload(), отложенных загрузчиков столбцов defer() и ленивого загрузчика отношений lazyload().

Таким образом, опция set_shard_id имеет гораздо более широкую область применения, чем использование аргумента «shard_id» в словаре Session.execute.bind_arguments.

Добавлено в версии 2.0.0.

Классическая подпись.

класс sqlalchemy.ext.horizontal_shard.set_shard_id (sqlalchemy.orm.ORMOption)

method sqlalchemy.ext.horizontal_shard.set_shard_id.__init__(shard_id: str, propagate_to_loaders: bool = True)

Сконструировать опцию set_shard_id.

Параметры:
  • shard_id – идентификатор осколка

  • propagate_to_loaders – если оставить значение по умолчанию True, то опция shard будет иметь место для ленивых загрузчиков, таких как lazyload() и defer(); если False, то опция не будет распространяться на загружаемые объекты. Заметим, что defer() в любом случае всегда ограничивается shard_id родительской строки, поэтому параметр оказывает чистое влияние только на поведение стратегии lazyload().

attribute sqlalchemy.ext.horizontal_shard.set_shard_id.propagate_to_loaders

если True, то указывает, что эта опция должна переноситься на «вторичные» операторы SELECT, которые возникают для ленивых загрузчиков отношений, а также для операций загрузки/обновления атрибутов.

class sqlalchemy.ext.horizontal_shard.ShardedQuery

Класс запросов, используемый с ShardedSession.

Legacy Feature

Класс ShardedQuery является подклассом унаследованного класса Query. Класс ShardedSession теперь поддерживает выполнение в стиле 2.0 с помощью метода ShardedSession.execute().

Members

set_shard()

Классическая подпись.

класс sqlalchemy.ext.horizontal_shard.ShardedQuery (sqlalchemy.orm.Query)

method sqlalchemy.ext.horizontal_shard.ShardedQuery.set_shard(shard_id: str) Self

Возвращает новый запрос, ограниченный одним идентификатором шарда.

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

Для выполнения в стиле 2.0 идентификатор shard_id может быть передан в словарь bind_arguments из Session.execute():

results = session.execute(
    stmt,
    bind_arguments={"shard_id": "my_shard"}
)
Вернуться на верх