水平分片¶
水平分片支持。
定义一个基本的“水平分片”系统,它允许 Session 在多个数据库之间分配查询和持久化作。
有关使用示例,请参阅源代码分配中包含的水平分片示例。
深度炼金术
水平分片扩展是一项高级功能,
涉及复杂的语句 -> 数据库交互以及
对非平凡情况使用半公开 API。 更简单的方法
引用多个数据库“分片”,最常见的是使用不同的
在使用这个更复杂且经过较少生产测试的系统之前,应始终首先考虑每个“分片”的会话。
API 文档¶
对象名称 |
描述 |
|---|---|
|
|
-
sqlalchemy.ext.horizontal_shard 类。分片会话¶ -
-
方法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) 无¶
构造 ShardedSession。
参数
shard_chooser¶– 一个可调用对象,通过传递 Mapper、映射实例和可能的 SQL 子句,返回分片 ID。此 ID 可能基于对象中存在的属性,也可能基于某些循环方案。如果方案基于选择,则应在实例上设置任何状态,以便将来将其标记为参与该分片。identity_chooser¶ –
一个可调用对象,传递了一个 Mapper 和主键参数,该参数应返回此主键可能所在的分片 ID 列表。
在 2.0 版更改:identity_chooser参数取代id_chooser参数。execute_chooser¶ –
对于给定的ORMExecuteState,返回应向其中发出查询的 shard_ids 的列表。返回的所有分片的结果将合并到一个列表中。
在 1.4 版本发生变更:execute_chooser参数取代query_chooser参数。
shards¶—Engine 对象的字符串分片名称字典。
-
方法sqlalchemy.ext.horizontal_shard.ShardedSession.connection_callable(mapper:Mapper[_T]None=None, instance:AnyNone=None, shard_id:ShardIdentifierNone=None, **kw: Any)连接¶
提供Connection (连接) 以用于工作单元刷新流程。
-
方法sqlalchemy.ext.horizontal_shard.ShardedSession.get_bind(mapper:_EntityBindKey[_O]None=None, *, shard_id:ShardIdentifierNone=None, instance:AnyNone=None, clause:ClauseElementNone=None, **kw: Any)→ _SessionBind¶
返回此Session绑定到的 “bind”。
“bind” 通常是Engine的一个实例,除非Session已经显式地直接绑定到Connection。
对于多重绑定或未绑定的Session,mapper或clause参数用于确定要返回的适当 BIND。
请注意,当通过 ORM作(例如Session.query())调用Session.get_bind()时,通常存在 “mapper” 参数,每个 单个 INSERT/UPDATE/DELETE作Session.flush()、调用等。
解决顺序为:
如果存在 mapper given 和Session.binds,则首先根据正在使用的 mapper 找到一个 bind,然后是正在使用的 Map 类,然后是 Map 类的__mro__中存在的任何基类,从更具体的超类到更通用的超类。
if 子句给定且Session.binds存在,则根据Session.binds中存在的给定子句中找到的Table对象找到绑定。
如果存在Session.binds,则返回该 Session.binds。
if 子句,尝试返回链接到最终与子句关联的MetaData的 bind。
如果给定 mapper,则尝试返回链接到MetaData的绑定,该 MetaData 最终与Table或 mapper 映射到的其他可选内容相关联。
找不到bind,UnboundExecutionError被提升。
请注意,可以在Session的用户定义子类上覆盖Session.get_bind()方法以提供任何类型的 的绑定解析方案。 请参阅以下示例 自定义垂直分区。
-
-
sqlalchemy.ext.horizontal_shard 类。set_shard_id¶
一个 loader 选项,用于将特定分片 ID 应用于主查询以及其他关系和列加载程序的语句。set_shard_id选项可以使用任何可执行语句的Executable.options()方法应用:stmt = ( select(MyObject) .where(MyObject.name == "some name") .options(set_shard_id("shard1")) )
在上面,调用该语句时将限制为 “shard1” 分片 identifier 以及 all relationship 和 列加载策略,包括 Eager Loader,例如selectInLoad()、延迟列加载器(如defer())和惰性关系加载器lazyload()。
这样,set_shard_id选项的范围要宽得多 范围,而不是shard_id在Session.execute.bind_arguments字典。
2.0.0 版本的新Function。
类签名
类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,则 shard 选项将用于惰性加载器,例如lazyload()和defer();如果为 False,则该选项将不会传播到已加载的对象。请注意,defer()在任何情况下,始终限制为父行的shard_id,因此 参数对lazyload()策略。
-
属性sqlalchemy.ext.horizontal_shard.set_shard_id.propagate_to_loaders¶
如果为 True,则指示此选项应应用于关系延迟加载器以及属性加载/刷新作的“辅助”SELECT 语句。
-
-
sqlalchemy.ext.horizontal_shard 类。分片查询¶ -
旧版功能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"})
-