访客和遍历工具¶
sqlalchemy.sql.visitors
模块由类和函数组成,这些类和函数通常用于遍历 Core SQL 表达式结构。这与 Python ast
模块没有什么不同,因为它提供了一个系统,程序可以通过该系统对 SQL 表达式的每个组件进行作。它的常见用途是查找各种元素(如 Table
或 BindParameter
对象),以及更改结构的状态(如将某些 FROM 子句替换为其他子句)。
注意
sqlalchemy.sql.visitors
模块是内部 API,并非完全公开。它可能会发生变化,并且对于 SQLAlchemy 自己的内部结构中未考虑的使用模式,它可能无法按预期运行。
sqlalchemy.sql.visitors
模块是
SQLAlchemy 的 API,它通常不通过调用应用程序代码来使用。 是的
但是,在某些边缘情况下使用,例如在构造缓存例程时
以及使用
自定义 SQL 构造和编译扩展。
访客/遍历界面和库函数。
对象名称 |
描述 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
类 sqlalchemy.sql.visitors。ExternalTraversal(外部遍历)¶
访客对象的基类,这些对象可以使用traverse()
函数在外部遍历。
通常最好直接使用traverse()
函数。
类签名
类sqlalchemy.sql.visitors.ExternalTraversal
(sqlalchemy.util.langhelpers.MemoizedSlots
)-
methodsqlalchemy.sql.visitors.ExternalTraversal.
chain(visitor: ExternalTraversal)_ExtT ¶
将额外的 ExternalTraversal 'Chain' 到这个 ExternalTraversal 上
链式访客将收到此事件之后的所有访问事件。
-
methodsqlalchemy.sql.visitors.ExternalTraversal.
iterate(obj:ExternallyTraversibleNone)Iterator[ExternallyTraversible] ¶
遍历给定的表达式结构,返回所有元素的迭代器。
-
methodsqlalchemy.sql.visitors.ExternalTraversal.
traverse(obj:ExternallyTraversibleNone)→ExternallyTraversibleNone)¶
遍历并访问给定的表达式结构。
-
属性sqlalchemy.sql.visitors.ExternalTraversal.
visitor_iterator¶
遍历此访客和每个“链式”访客。
-
-
类 sqlalchemy.sql.visitors。InternalTraversal¶
定义用于内部遍历的访客符号。InternalTraversal
类有两种使用方式。一个是它可以作为实现类的各种访问方法的对象的超类。另一个是InternalTraversal
的 symbol 本身在_traverse_internals
集合中使用。例如,案例
object 将_traverse_internals
定义为class Case(ColumnElement[_T]): _traverse_internals = [ ("value", InternalTraversal.dp_clauseelement), ("whens", InternalTraversal.dp_clauseelement_tuples), ("else_", InternalTraversal.dp_clauseelement), ]
在上面,Case
类将其内部状态指示为名为value
、when's
和else_
的属性。它们都链接到一个InternalTraversal
方法,该方法指示每个属性所引用的数据结构类型。
使用_traverse_internals
结构,类型为InternalTraversible
将自动实现以下方法:HasTraverseInternals.get_children()
HasTraverseInternals._copy_internals()
HasCacheKey._gen_cache_key()
子类也可以直接实现这些方法,特别是对于HasTraverseInternals._copy_internals()
方法。
在 1.4 版本加入.
成员
dp_annotations_key、dp_anon_name、dp_boolean、dp_clauseelement、dp_clauseelement_list、dp_clauseelement_tuple、dp_clauseelement_tuples、dp_dialect_options、dp_dml_multi_values、dp_dml_ordered_values、dp_dml_values dp_fromclause_canonical_column_collection、dp_fromclause_ordered_set、dp_has_cache_key、dp_has_cache_key_list、dp_has_cache_key_tuples、dp_ignore、dp_inspectable、dp_inspectable_list、dp_multi、dp_multi_list、dp_named_ddl_element dp_运算符、dp_plain_dict、dp_plain_obj、dp_prefix_sequence、dp_propagate_attrs、dp_statement_hint_list、dp_string、dp_string_clauseelement_dict、dp_string_list、dp_string_multi_dict、dp_table_hint_list dp_type、dp_unknown_structure
类签名
classsqlalchemy.sql.visitors.InternalTraversal
(enum.枚举
)-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_annotations_key = 'AK'¶
访问 _annotations_cache_key 元素。
这是有关修改其角色的 ClauseElement 的其他信息的字典。在比较或缓存对象时应包含它,但是生成此密钥的成本相对较高。在创建此键之前,访问者应先检查 “_annotations” dict 中的非 None。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_anon_name = 'AN'¶
访问可能 “匿名” 的字符串值。
字符串值被认为对于缓存键生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_boolean = 'B'¶
访问布尔值。
布尔值被认为对于缓存键的生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_clauseelement = 'CE'¶
访问ClauseElement
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_clauseelement_list = 'CL'¶
访问ClauseElement
对象的列表。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_clauseelement_tuple = 'CT'¶
访问ClauseElement
对象的元组。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_clauseelement_tuples = 'CTS'¶
访问包含ClauseElement
的元组列表 对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_dialect_options = 'DO'¶
访问 dialect 选项结构。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_dml_multi_values = 'DML_MV'¶
访问 values() 的多值字典列表Insert
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_dml_ordered_values = 'DML_OV'¶
访问 values() 的有序元组列表Update
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_dml_values = 'DML_V'¶
访问ValuesBase
的 values() 字典 (例如 Insert 或 Update)对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_fromclause_canonical_column_collection = 'FC'¶ -
列集合是“规范的”,这意味着它是ColumnClause
对象最初定义的位置。 马上 这意味着正在访问的对象是一个TableClause
或Table
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_fromclause_ordered_set = 'CO'¶
访问一组有序的FromClause
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_has_cache_key = 'HC'¶
访问HasCacheKey
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_has_cache_key_list = 'HL'¶
访问HasCacheKey
对象的列表。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_has_cache_key_tuples = 'HT'¶
访问包含HasCacheKey
的元组列表 对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_ignore = 'IG'¶
指定应完全忽略的对象。
这当前应用函数调用参数缓存,其中某些参数不应被视为缓存键的一部分。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_inspectable = 'IS'¶
访问返回值为HasCacheKey
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_inspectable_list = 'IL'¶
访问可检查对象列表,这些对象在检查时是 HasCacheKey 对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_multi = 'M'¶
访问可能是HasCacheKey
或普通可哈希对象的对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_multi_list = 'MT'¶
访问包含元素的 Tuples,这些元素可能是HasCacheKey
也可能是普通的可哈希对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_named_ddl_element = 'DD'¶
访问一个简单的命名 DDL 元素。
此方法当前使用的对象是Sequence
。
就其名称而言,该对象仅被认为对缓存键生成很重要,而对其任何其他方面都不重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_operator = 'O'¶
访问运营商。
运算符是sqlalchemy.sql.operators
中的函数 模块。
运算符值被认为对于缓存键生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_plain_dict = 'PD'¶
访问带有字符串键的字典。
字典的键应该是字符串,值应该是不可变的和可哈希的。该字典被认为对缓存键生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_plain_obj = 'PO'¶
访问普通 python 对象。
该值应该是不可变且可哈希的,例如整数。该值被认为对于缓存密钥生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_prefix_sequence = 'PS'¶
访问HasPrefixes
表示的序列 或HasSuffixes 的 HasSuffixes
中。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_propagate_attrs = 'PA'¶
访问 propagate attrs dict。这与我们现在关心的特定元素进行了硬编码。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_statement_hint_list = 'SH'¶
访问_statement_hints
的集合选择
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_string = 'S'¶
访问纯字符串值。
示例包括表名和列名、绑定参数键、特殊关键字(如 “UNION”、“UNION ALL”)。
字符串值被认为对于缓存键生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_string_clauseelement_dict = 'CD'¶
访问ClauseElement
的字符串键字典 对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_string_list = 'SL'¶
访问字符串列表。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_string_multi_dict = 'MD'¶
访问字符串键的字典,这些值可能是普通的不可变/可哈希的,也可能是HasCacheKey
对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_table_hint_list = 'TH'¶
访问Select
的_hints
集合 对象。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_type = 'T'¶
访问TypeEngine
对象
类型对象被认为对缓存键生成很重要。
-
属性sqlalchemy.sql.visitors.InternalTraversal.
dp_unknown_structure = 'UK'¶
访问未知结构。
-
类 sqlalchemy.sql.visitors。可访问¶
可访问对象的基类。Visitable
用于实现 SQL 编译器调度函数。其他形式的遍历(例如用于缓存键生成)使用HasTraverseInternals
单独实现 接口。
-
属性sqlalchemy.sql.visitors..
sqlalchemy.sql.visitors 访问。anon_map¶ cache_anon_map
的别名
-
函数 sqlalchemy.sql.visitors。cloned_traverse(obj:ExternallyTraversibleNone, opts: Mapping[str, Any], 访客: Mapping[str, Callable[[Any], None]])→ExternallyTraversibleNone¶
克隆给定的表达式结构,允许访问者对可变对象进行修改。
遍历用法与traverse()
相同。随着遍历的进行,Visitors
字典中存在的 visitor 函数也可以修改给定结构的内部结构。cloned_traverse()
函数不提供属于immutable
接口的对象给访问方法(这主要包括ColumnClause
、Column
、TableClause
和Table
对象)。由于此遍历仅用于允许对象的就地更改,因此 Immutable
将跳过对象。Immutable._clone()
方法仍被调用 以允许对象将自身替换为不同的 对象(例如,一个ColumnClause 的 ColumnClause
中,克隆其子查询以返回新的ColumnClause 的 ColumnClause
中)。
在 2.0 版更改:cloned_traverse()
函数省略了属于Immutable
接口的对象。cloned_traverse()
使用的中央 API 功能 和replacement_traverse()
函数,以及ClauseElement.get_children()
用于实现 迭代是ClauseElement._copy_internals()
方法。 对于ClauseElement
支持克隆和替换的结构 遍历,它需要能够将克隆函数传入 其内部成员,以便复制它们。
-
函数 sqlalchemy.sql.visitors。iterate(obj:ExternallyTraversibleNone, opts: Mapping[str, Any] = {})Iterator[ExternallyTraversible] ¶
遍历给定的表达式结构,返回一个迭代器。
遍历配置为广度优先。iterate()
使用的核心 API 功能 function 是ClauseElement.get_children()
方法ClauseElement
对象。此方法应返回与特定ClauseElement
对象关联的所有ClauseElement
对象。例如,案例
结构将参考一系列ColumnElement
对象else_。
参数
obj¶– 要遍历的ClauseElement
结构
opts¶ —— 迭代选项字典。在现代用法中,此字典通常是空的。
-
函数 sqlalchemy.sql.visitors。replacement_traverse(obj:ExternallyTraversibleNone, opts: Mapping[str, Any], replace: _TraverseTransformCallableType[Any])→ExternallyTraversibleNone¶
克隆给定的表达式结构,允许用给定的替换函数替换元素。
此函数与cloned_traverse()
非常相似 函数,而不是传递访问者字典,而是 all 元素无条件地传递到给定的 replace 函数中。 然后,replace 函数可以选择返回一个全新的对象 它将替换给定的那个。 如果返回None
,则对象将保留在原位。cloned_traverse()
和replacement_traverse()
是指在前一种情况下,已经克隆的对象被传递给 visitor 函数,然后 visitor 函数可以作对象的内部状态。在后者的情况下,visitor 函数应该只返回一个完全不同的对象,或者什么都不做。replacement_traverse()
的用例是将 SQL 结构内的 FROM 子句替换为不同的子句,这是 ORM 中的常见用例。
-
函数 sqlalchemy.sql.visitors。traverse(obj:ExternallyTraversibleNone, opts: Mapping[str, Any], visitors: Mapping[str, Callable[[Any], None]])→ExternallyTraversibleNone¶
使用默认迭代器遍历并访问给定的表达式结构。
例如:from sqlalchemy.sql import visitors stmt = select(some_table).where(some_table.c.foo == "bar") def visit_bindparam(bind_param): print("found bound value: %s" % bind_param.value) visitors.traverse(stmt, {}, {"bindparam": visit_bindparam})
对象的迭代使用iterate()
函数,该函数使用堆栈进行广度优先遍历。
参数
obj¶– 要遍历的ClauseElement
结构
opts¶ —— 迭代选项字典。在现代用法中,此字典通常是空的。
visitors¶ —— 访问函数字典。 字典应该 将字符串作为键,每个字符串都对应于__visit_name__
特定类型的 SQL 表达式对象,并将可调用函数作为值,每个函数都表示该类型对象的一个访问者函数。
-
函数 sqlalchemy.sql.visitors。traverse_using(iterator: Iterable[ExternallyTraversible], obj:ExternallyTraversibleNone, visitors: Mapping[str, Callable[[any], None]])→ExternallyTraversibleNone¶
使用给定的对象迭代器访问给定的表达式结构。traverse_using()
通常作为traverse()
函数的结果在内部调用。
参数
iterator¶ —— 一个可迭代对象或序列,它将产生子句元素
结构;迭代器假定为的 product 的 Iterate()
函数。
obj¶ ——ClauseElement
,该iterate()
函数。
visitors¶ —— 访问函数字典。参见traverse()
了解此词典的详细信息。
另请参阅