Горизонтальное разделение¶
Поддержка горизонтального чередования.
Определяет рудиментарную систему «горизонтального шардинга», которая позволяет сеансу распределять запросы и операции сохранения по нескольким базам данных.
Пример использования приведен в примере Горизонтальное разделение, включенном в дистрибутив исходного кода.
Deep Alchemy
Расширение горизонтального шардинга является расширенной функцией, предполагающей сложное взаимодействие оператор -> база данных, а также использование полупубличных API для нетривиальных случаев. Более простые подходы к обращению к нескольким «осколкам» базы данных, чаще всего с использованием отдельного Session для каждого «осколка», всегда должны рассматриваться в первую очередь перед использованием этой более сложной и менее проверенной на практике системы.
Документация по API¶
| Object Name | Description |
|---|---|
опция загрузчика для операторов, позволяющая применить к первичному запросу определенный идентификатор шарда, а также дополнительные загрузчики отношений и столбцов. |
|
Класс запросов, используемый с |
|
- class sqlalchemy.ext.horizontal_shard.ShardedSession¶
Members
Классическая подпись.
класс
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(), вызов и т.д.Порядок разрешения следующий:
Если задан mapper и присутствует
Session.binds, найти привязку, основываясь сначала на используемом mapper, затем на используемом mapped class, затем на любых базовых классах, присутствующих в__mro__mapped class, от более конкретных суперклассов к более общим.если дано предложение и присутствует
Session.binds, найти привязку на основе объектовTable, найденных в данном предложении, присутствующих вSession.binds.Если
Session.bindsприсутствует, то вернуть его.если дано предложение, попытаться вернуть привязку, связанную с
MetaData, в конечном счете ассоциированную с этим предложением.если задан mapper, попытаться вернуть привязку, связанную с
MetaData, в конечном счете ассоциированную сTableили другим selectable, с которым сопоставлен mapper.Связка не найдена, выдается сообщение
UnboundExecutionError.
Заметим, что метод
Session.get_bind()может быть переопределен в пользовательском подклассеSessionдля обеспечения любой схемы разрешения привязки. См. пример в Нестандартные вертикальные перегородки.- Параметры:
mapper – Необязательный сопоставленный класс или соответствующий экземпляр
Mapper. Связка может быть получена изMapper, во-первых, путем обращения к карте «binds», связанной с этойSession, и, во-вторых, путем обращения кMetaData, связанной сTable, к которой привязанаMapperдля привязки.clause –
ClauseElement(т.е.select(),text()и т.д.). Если аргументmapperотсутствует или не может привести к связыванию, то в данной конструкции выражения будет произведен поиск связанного элемента, обычно этоTable, связанный со связаннымMetaData.
-
method
- 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.
Members
Классическая подпись.
класс
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, которые возникают для ленивых загрузчиков отношений, а также для операций загрузки/обновления атрибутов.
-
method
- class sqlalchemy.ext.horizontal_shard.ShardedQuery¶
Класс запросов, используемый с
ShardedSession.Legacy Feature
Класс
ShardedQueryявляется подклассом унаследованного классаQuery. КлассShardedSessionтеперь поддерживает выполнение в стиле 2.0 с помощью методаShardedSession.execute().Members
Классическая подпись.
класс
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"} )
-
method