Горизонтальное разделение¶
Поддержка горизонтального чередования.
Определяет рудиментарную систему «горизонтального шардинга», которая позволяет сеансу распределять запросы и операции сохранения по нескольким базам данных.
Пример использования приведен в примере Горизонтальное разделение, включенном в дистрибутив исходного кода.
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