SQLAlchemy 2.0 文档
水平分片¶
水平分片支持。
定义一个基本的“水平分片”系统,允许会话将查询和持久化操作分布到多个数据库中。
有关使用示例,请参阅源代码发行版中包含的 水平分片 示例。
深层炼金术
水平分片扩展是一个高级功能,涉及复杂的语句 -> 数据库交互,以及在非平凡情况下使用半公开 API。在使用这种更复杂、测试程度较低的系统之前,应始终首先考虑更简单的方案,例如使用不同的 Session
来引用多个数据库“分片”。
API 文档¶
对象名称 | 描述 |
---|---|
语句的加载器选项,用于将特定分片 ID 应用于主查询以及其他关系和列加载器。 |
|
与 |
|
- class sqlalchemy.ext.horizontal_shard.ShardedSession¶
-
-
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 子句,返回一个分片 ID。此 ID 可以基于对象中存在的属性,或基于某种循环方案。如果该方案基于选择,它应该在实例上设置任何状态以将其标记为将来参与该分片。
identity_chooser¶ –
一个可调用对象,传递一个 Mapper 和主键参数,它应该返回一个包含此主键可能存在的分片 ID 列表。
更改版本 2.0:
identity_chooser
参数取代了id_chooser
参数。execute_chooser¶ –
对于给定的
ORMExecuteState
,返回应该在其中发出查询的分片 ID 列表。来自所有返回分片的的结果将合并到一个列表中。更改版本 1.4:
execute_chooser
参数取代了query_chooser
参数。
-
method
sqlalchemy.ext.horizontal_shard.ShardedSession.
connection_callable(mapper: Mapper[_T] | None = None, instance: Any | None = None, shard_id: ShardIdentifier | None = None, **kw: Any) → Connection¶ 为工作单元刷新过程中提供一个要使用的
Connection
。
-
方法
sqlalchemy.ext.horizontal_shard.ShardedSession.
get_bind(mapper: _EntityBindKey[_O] | None = None, *, shard_id: ShardIdentifier | None = None, instance: Any | None = None, clause: ClauseElement | None = None, **kw: Any) → _SessionBind¶ 返回此
Session
绑定的“绑定”。“绑定”通常是
Engine
的实例,除非Session
已明确绑定到Connection
。对于多重绑定或未绑定
Session
,mapper
或clause
参数用于确定要返回的适当绑定。请注意,“mapper”参数通常在通过 ORM 操作(如
Session.query()
、Session.flush()
内的每个单独的 INSERT/UPDATE/DELETE 操作、调用等)调用Session.get_bind()
时出现。解析顺序为
如果给定 mapper 且
Session.binds
存在,则首先根据正在使用的 mapper 定位绑定,然后根据正在使用的映射类定位绑定,然后根据__mro__
中存在的映射类的任何基类定位绑定,从更具体的超类到更一般的超类。如果给定 clause 且
Session.binds
存在,则根据Session.binds
中存在的给定 clause 中找到的Table
对象定位绑定。如果
Session.binds
存在,则返回该绑定。如果给定 clause,则尝试返回与 clause 最终关联的
MetaData
链接的绑定。如果给定 mapper,则尝试返回与 mapper 映射到的
Table
或其他可选择对象最终关联的MetaData
链接的绑定。找不到绑定,将引发
UnboundExecutionError
。
请注意,可以在
Session
的用户定义子类上覆盖Session.get_bind()
方法以提供任何类型的绑定解析方案。有关示例,请参阅 自定义垂直分区。
-
method
- 类 sqlalchemy.ext.horizontal_shard.set_shard_id¶
语句的加载器选项,用于将特定分片 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
选项的范围远大于在Session.execute.bind_arguments
字典中使用“shard_id”参数。2.0.0 版中的新功能。
类签名
类
sqlalchemy.ext.horizontal_shard.set_shard_id
(sqlalchemy.orm.ORMOption
)-
方法
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
,分片选项将应用于延迟加载器,例如lazyload()
和defer()
; 如果为 False,该选项将不会传播到已加载的对象。请注意,defer()
在任何情况下都始终限制为父行的 shard_id,因此该参数仅对lazyload()
策略的行为产生影响。
-
属性
sqlalchemy.ext.horizontal_shard.set_shard_id.
propagate_to_loaders¶ 如果为 True,则表示该选项应传递给关系延迟加载器以及属性加载/刷新操作发生的“次要” SELECT 语句。
-
方法
- 类 sqlalchemy.ext.horizontal_shard.ShardedQuery¶
与
ShardedSession
一起使用的查询类。遗留功能
该
ShardedQuery
是遗留Query
类的子类。该ShardedSession
现在通过ShardedSession.execute()
方法支持 2.0 风格的执行。成员
-
方法
sqlalchemy.ext.horizontal_shard.ShardedQuery.
set_shard(shard_id: str) → Self¶ 返回一个新的查询,限制为单个分片 ID。
返回的查询的所有后续操作都将针对单个分片,而不管其他状态如何。
该 shard_id 可以传递给
Session.execute()
的 bind_arguments 字典以进行 2.0 风格的执行。results = session.execute( stmt, bind_arguments={"shard_id": "my_shard"} )
-
方法
flambé! 龙和 炼金术士 图像设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。上次生成文档时间:2024 年 11 月 8 日星期五上午 8:41:19 EST