SQLAlchemy 2.0 文档
SQLAlchemy Core
- SQL 语句和表达式 API
- 列元素和表达式
- 操作符参考
- SELECT 和相关结构¶
- 可选择的基础构造器
- 可选择的修饰符构造器
- 可选择的类文档
AliasAliasedReturnsRowsCompoundSelectCompoundSelect.add_cte()CompoundSelect.alias()CompoundSelect.as_scalar()CompoundSelect.cCompoundSelect.corresponding_column()CompoundSelect.cte()CompoundSelect.execution_options()CompoundSelect.exists()CompoundSelect.exported_columnsCompoundSelect.fetch()CompoundSelect.get_execution_options()CompoundSelect.get_label_style()CompoundSelect.group_by()CompoundSelect.is_derived_from()CompoundSelect.label()CompoundSelect.lateral()CompoundSelect.limit()CompoundSelect.offset()CompoundSelect.options()CompoundSelect.order_by()CompoundSelect.replace_selectable()CompoundSelect.scalar_subquery()CompoundSelect.select()CompoundSelect.selected_columnsCompoundSelect.self_group()CompoundSelect.set_label_style()CompoundSelect.slice()CompoundSelect.subquery()CompoundSelect.with_for_update()
CTEExecutableExistsFromClauseFromClause.alias()FromClause.cFromClause.columnsFromClause.descriptionFromClause.entity_namespaceFromClause.exported_columnsFromClause.foreign_keysFromClause.is_derived_from()FromClause.join()FromClause.outerjoin()FromClause.primary_keyFromClause.schemaFromClause.select()FromClause.tablesample()
GenerativeSelectHasCTEHasPrefixesHasSuffixesJoinLateralReturnsRowsScalarSelectSelectSelect.__init__()Select.add_columns()Select.add_cte()Select.alias()Select.as_scalar()Select.cSelect.column()Select.column_descriptionsSelect.columns_clause_fromsSelect.correlate()Select.correlate_except()Select.corresponding_column()Select.cte()Select.distinct()Select.except_()Select.except_all()Select.execution_options()Select.exists()Select.exported_columnsSelect.fetch()Select.filter()Select.filter_by()Select.from_statement()Select.fromsSelect.get_children()Select.get_execution_options()Select.get_final_froms()Select.get_label_style()Select.group_by()Select.having()Select.inherit_cacheSelect.inner_columnsSelect.intersect()Select.intersect_all()Select.is_derived_from()Select.join()Select.join_from()Select.label()Select.lateral()Select.limit()Select.offset()Select.options()Select.order_by()Select.outerjoin()Select.outerjoin_from()Select.prefix_with()Select.reduce_columns()Select.replace_selectable()Select.scalar_subquery()Select.select()Select.select_from()Select.selected_columnsSelect.self_group()Select.set_label_style()Select.slice()Select.subquery()Select.suffix_with()Select.union()Select.union_all()Select.where()Select.whereclauseSelect.with_for_update()Select.with_hint()Select.with_only_columns()Select.with_statement_hint()
SelectableSelectBaseSelectBase.add_cte()SelectBase.alias()SelectBase.as_scalar()SelectBase.cSelectBase.corresponding_column()SelectBase.cte()SelectBase.exists()SelectBase.exported_columnsSelectBase.get_label_style()SelectBase.inherit_cacheSelectBase.is_derived_from()SelectBase.label()SelectBase.lateral()SelectBase.replace_selectable()SelectBase.scalar_subquery()SelectBase.select()SelectBase.selected_columnsSelectBase.set_label_style()SelectBase.subquery()
SubqueryTableClauseTableClause.alias()TableClause.cTableClause.columnsTableClause.compare()TableClause.compile()TableClause.corresponding_column()TableClause.delete()TableClause.descriptionTableClause.entity_namespaceTableClause.exported_columnsTableClause.foreign_keysTableClause.get_children()TableClause.implicit_returningTableClause.inherit_cacheTableClause.insert()TableClause.is_derived_from()TableClause.join()TableClause.lateral()TableClause.outerjoin()TableClause.params()TableClause.primary_keyTableClause.replace_selectable()TableClause.schemaTableClause.select()TableClause.self_group()TableClause.table_valued()TableClause.tablesample()TableClause.unique_params()TableClause.update()
TableSampleTableValuedAliasTextualSelectTextualSelect.add_cte()TextualSelect.alias()TextualSelect.as_scalar()TextualSelect.cTextualSelect.compare()TextualSelect.compile()TextualSelect.corresponding_column()TextualSelect.cte()TextualSelect.execution_options()TextualSelect.exists()TextualSelect.exported_columnsTextualSelect.get_children()TextualSelect.get_execution_options()TextualSelect.get_label_style()TextualSelect.inherit_cacheTextualSelect.is_derived_from()TextualSelect.label()TextualSelect.lateral()TextualSelect.options()TextualSelect.params()TextualSelect.replace_selectable()TextualSelect.scalar_subquery()TextualSelect.select()TextualSelect.selected_columnsTextualSelect.self_group()TextualSelect.set_label_style()TextualSelect.subquery()TextualSelect.unique_params()
ValuesScalarValues
- 标签样式常量
- Insert, Updates, Deletes
- SQL 和通用函数
- 自定义 SQL 结构和编译扩展
- 表达式序列化器扩展
- SQL 表达式语言基础结构
- 访问者和遍历实用程序
- 模式定义语言
- SQL 数据类型对象
- 引擎和连接使用
- Core API 基础知识
项目版本
- 上一页: 操作符参考
- 下一页: Insert, Updates, Deletes
- 上一级: 首页
- 本页目录
- SELECT 和相关结构
- 可选择的基础构造器
- 可选择的修饰符构造器
- 可选择的类文档
AliasAliasedReturnsRowsCompoundSelectCompoundSelect.add_cte()CompoundSelect.alias()CompoundSelect.as_scalar()CompoundSelect.cCompoundSelect.corresponding_column()CompoundSelect.cte()CompoundSelect.execution_options()CompoundSelect.exists()CompoundSelect.exported_columnsCompoundSelect.fetch()CompoundSelect.get_execution_options()CompoundSelect.get_label_style()CompoundSelect.group_by()CompoundSelect.is_derived_from()CompoundSelect.label()CompoundSelect.lateral()CompoundSelect.limit()CompoundSelect.offset()CompoundSelect.options()CompoundSelect.order_by()CompoundSelect.replace_selectable()CompoundSelect.scalar_subquery()CompoundSelect.select()CompoundSelect.selected_columnsCompoundSelect.self_group()CompoundSelect.set_label_style()CompoundSelect.slice()CompoundSelect.subquery()CompoundSelect.with_for_update()
CTEExecutableExistsFromClauseFromClause.alias()FromClause.cFromClause.columnsFromClause.descriptionFromClause.entity_namespaceFromClause.exported_columnsFromClause.foreign_keysFromClause.is_derived_from()FromClause.join()FromClause.outerjoin()FromClause.primary_keyFromClause.schemaFromClause.select()FromClause.tablesample()
GenerativeSelectHasCTEHasPrefixesHasSuffixesJoinLateralReturnsRowsScalarSelectSelectSelect.__init__()Select.add_columns()Select.add_cte()Select.alias()Select.as_scalar()Select.cSelect.column()Select.column_descriptionsSelect.columns_clause_fromsSelect.correlate()Select.correlate_except()Select.corresponding_column()Select.cte()Select.distinct()Select.except_()Select.except_all()Select.execution_options()Select.exists()Select.exported_columnsSelect.fetch()Select.filter()Select.filter_by()Select.from_statement()Select.fromsSelect.get_children()Select.get_execution_options()Select.get_final_froms()Select.get_label_style()Select.group_by()Select.having()Select.inherit_cacheSelect.inner_columnsSelect.intersect()Select.intersect_all()Select.is_derived_from()Select.join()Select.join_from()Select.label()Select.lateral()Select.limit()Select.offset()Select.options()Select.order_by()Select.outerjoin()Select.outerjoin_from()Select.prefix_with()Select.reduce_columns()Select.replace_selectable()Select.scalar_subquery()Select.select()Select.select_from()Select.selected_columnsSelect.self_group()Select.set_label_style()Select.slice()Select.subquery()Select.suffix_with()Select.union()Select.union_all()Select.where()Select.whereclauseSelect.with_for_update()Select.with_hint()Select.with_only_columns()Select.with_statement_hint()
SelectableSelectBaseSelectBase.add_cte()SelectBase.alias()SelectBase.as_scalar()SelectBase.cSelectBase.corresponding_column()SelectBase.cte()SelectBase.exists()SelectBase.exported_columnsSelectBase.get_label_style()SelectBase.inherit_cacheSelectBase.is_derived_from()SelectBase.label()SelectBase.lateral()SelectBase.replace_selectable()SelectBase.scalar_subquery()SelectBase.select()SelectBase.selected_columnsSelectBase.set_label_style()SelectBase.subquery()
SubqueryTableClauseTableClause.alias()TableClause.cTableClause.columnsTableClause.compare()TableClause.compile()TableClause.corresponding_column()TableClause.delete()TableClause.descriptionTableClause.entity_namespaceTableClause.exported_columnsTableClause.foreign_keysTableClause.get_children()TableClause.implicit_returningTableClause.inherit_cacheTableClause.insert()TableClause.is_derived_from()TableClause.join()TableClause.lateral()TableClause.outerjoin()TableClause.params()TableClause.primary_keyTableClause.replace_selectable()TableClause.schemaTableClause.select()TableClause.self_group()TableClause.table_valued()TableClause.tablesample()TableClause.unique_params()TableClause.update()
TableSampleTableValuedAliasTextualSelectTextualSelect.add_cte()TextualSelect.alias()TextualSelect.as_scalar()TextualSelect.cTextualSelect.compare()TextualSelect.compile()TextualSelect.corresponding_column()TextualSelect.cte()TextualSelect.execution_options()TextualSelect.exists()TextualSelect.exported_columnsTextualSelect.get_children()TextualSelect.get_execution_options()TextualSelect.get_label_style()TextualSelect.inherit_cacheTextualSelect.is_derived_from()TextualSelect.label()TextualSelect.lateral()TextualSelect.options()TextualSelect.params()TextualSelect.replace_selectable()TextualSelect.scalar_subquery()TextualSelect.select()TextualSelect.selected_columnsTextualSelect.self_group()TextualSelect.set_label_style()TextualSelect.subquery()TextualSelect.unique_params()
ValuesScalarValues
- 标签样式常量
SELECT 和相关结构¶
术语 “selectable” 指的是任何表示数据库行的对象。在 SQLAlchemy 中,这些对象都派生自 Selectable,其中最突出的是 Select,它表示 SQL SELECT 语句。Selectable 的一个子集是 FromClause,它表示可以位于 Select 语句的 FROM 子句中的对象。FromClause 的一个显著特征是 FromClause.c 属性,它是包含在 FROM 子句中的所有列的命名空间(这些元素本身是 ColumnElement 子类)。
可选择的基础构造器¶
顶级 “FROM 子句” 和 “SELECT” 构造器。
| 对象名称 | 描述 |
|---|---|
except_(*selects) |
返回多个 selectable 的 |
except_all(*selects) |
返回多个 selectable 的 |
exists([__argument]) |
构造一个新的 |
intersect(*selects) |
返回多个 selectable 的 |
intersect_all(*selects) |
返回多个 selectable 的 |
select(*entities, **__kw) |
构造一个新的 |
table(name, *columns, **kw) |
生成一个新的 |
union(*selects) |
返回多个 selectable 的 |
union_all(*selects) |
返回多个 selectable 的 |
values(*columns, [name, literal_binds]) |
构造一个 |
- function sqlalchemy.sql.expression.except_(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
EXCEPT。返回的对象是
CompoundSelect的实例。
- function sqlalchemy.sql.expression.except_all(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
EXCEPT ALL。返回的对象是
CompoundSelect的实例。
- function sqlalchemy.sql.expression.exists(__argument: _ColumnsClauseArgument[Any] | SelectBase | ScalarSelect[Any] | None = None) → Exists¶
构造一个新的
Exists结构。exists()可以被单独调用以生成一个Exists结构,它将接受简单的 WHERE 条件exists_criteria = exists().where(table1.c.col1 == table2.c.col2)
但是,为了在构造 SELECT 时获得更大的灵活性,可以将现有的
Select结构转换为Exists,最方便的方法是使用SelectBase.exists()方法exists_criteria = ( select(table2.c.col2).where(table1.c.col1 == table2.c.col2).exists() )
然后 EXISTS 条件在封闭的 SELECT 内部使用
stmt = select(table1.c.col1).where(exists_criteria)
上述语句将采用以下形式
SELECT col1 FROM table1 WHERE EXISTS (SELECT table2.col2 FROM table2 WHERE table2.col2 = table1.col1)
- function sqlalchemy.sql.expression.intersect(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
INTERSECT。返回的对象是
CompoundSelect的实例。
- function sqlalchemy.sql.expression.intersect_all(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
INTERSECT ALL。返回的对象是
CompoundSelect的实例。
- function sqlalchemy.sql.expression.select(*entities: _ColumnsClauseArgument[Any], **__kw: Any) → Select[Any]¶
构造一个新的
Select。1.4 版本新增: -
select()函数现在接受位置列参数。顶级select()函数将根据传入的参数自动使用 1.x 或 2.x 风格的 API;从sqlalchemy.future模块使用select()将强制仅使用 2.x 风格的构造器。类似的功能也可通过任何
FromClause上的FromClause.select()方法获得。另请参阅
使用 SELECT 语句 - 在 SQLAlchemy 统一教程 中
- 参数:
*entities¶ –
要从中 SELECT 的实体。对于 Core 用法,这通常是一系列
ColumnElement和/或FromClause对象,它们将构成结果语句的列子句。对于那些作为FromClause实例的对象(通常是Table或Alias对象),将提取FromClause.c集合以形成ColumnElement对象的集合。此参数还将接受给定的
TextClause结构,以及 ORM 映射的类。
- function sqlalchemy.sql.expression.table(name: str, *columns: ColumnClause[Any], **kw: Any) → TableClause¶
生成一个新的
TableClause。返回的对象是
TableClause的实例,它表示模式级Table对象的 “语法” 部分。它可用于构造轻量级表结构。
- function sqlalchemy.sql.expression.union(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
UNION。返回的对象是
CompoundSelect的实例。所有
FromClause子类上都提供了类似的union()方法。
- function sqlalchemy.sql.expression.union_all(*selects: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶
返回多个 selectable 的
UNION ALL。返回的对象是
CompoundSelect的实例。所有
FromClause子类上都提供了类似的union_all()方法。
- function sqlalchemy.sql.expression.values(*columns: ColumnClause[Any], name: str | None = None, literal_binds: bool = False) → Values¶
构造一个
Values结构。Values的列表达式和实际数据分两步给出。构造器通常接收作为column()构造的列表达式,然后数据通过Values.data()方法作为列表传递,可以多次调用以添加更多数据,例如:from sqlalchemy import column from sqlalchemy import values value_expr = values( column("id", Integer), column("name", String), name="my_values", ).data([(1, "name1"), (2, "name2"), (3, "name3")])
可选择修饰符构造器¶
此处列出的函数更常见的是作为 FromClause 和 Selectable 元素的的方法提供,例如,alias() 函数通常通过 FromClause.alias() 方法调用。
| 对象名称 | 描述 |
|---|---|
alias(selectable[, name, flat]) |
返回给定 |
cte(selectable[, name, recursive]) |
返回一个新的 |
join(left, right[, onclause, isouter, ...]) |
生成一个 |
lateral(selectable[, name]) |
返回一个 |
outerjoin(left, right[, onclause, full]) |
返回一个 |
tablesample(selectable, sampling[, name, seed]) |
返回一个 |
- function sqlalchemy.sql.expression.alias(selectable: FromClause, name: str | None = None, flat: bool = False) → NamedFromClause¶
返回给定
FromClause的命名别名。对于
Table和Join对象,返回类型是Alias对象。对于其他类型的FromClause对象,可能会返回其他类型的NamedFromClause对象。命名别名表示在 SQL 中分配了备用名称的任何
FromClause,通常在使用AS子句生成时,例如SELECT * FROM table AS aliasname。等效的功能可通过所有
FromClause对象上可用的FromClause.alias()方法获得。- 参数:
selectable¶ – 任何
FromClause子类,例如表、select 语句等。name¶ – 要分配为别名的字符串名称。如果为
None,则将在编译时确定性地生成名称。确定性意味着名称保证对于同一语句中使用的其他构造是唯一的,并且对于同一语句对象的每次后续编译也将是相同的名称。flat¶ – 如果给定的 selectable 是
Join的实例,则将传递给它 - 有关详细信息,请参阅Join.alias()。
- function sqlalchemy.sql.expression.cte(selectable: HasCTE, name: str | None = None, recursive: bool = False) → CTE¶
返回一个新的
CTE,或通用表表达式实例。有关 CTE 用法的详细信息,请参阅
HasCTE.cte()。
- function sqlalchemy.sql.expression.join(left: _FromClauseArgument, right: _FromClauseArgument, onclause: _OnClauseArgument | None = None, isouter: bool = False, full: bool = False) → Join¶
生成一个
Join对象,给定两个FromClause表达式。例如:
j = join( user_table, address_table, user_table.c.id == address_table.c.user_id ) stmt = select(user_table).select_from(j)
将发出类似于以下的 SQL:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
通过使用
FromClause.join()方法,任何FromClause对象(例如Table)也可获得类似的功能。- 参数:
left¶ – 连接的左侧。
right¶ – 连接的右侧;这是任何
FromClause对象,例如Table对象,也可能是可选择的兼容对象,例如 ORM 映射的类。onclause¶ – 表示连接的 ON 子句的 SQL 表达式。如果保留为
None,FromClause.join()将尝试基于外键关系连接两个表。isouter¶ – 如果为 True,则呈现 LEFT OUTER JOIN,而不是 JOIN。
full¶ – 如果为 True,则呈现 FULL OUTER JOIN,而不是 JOIN。
- function sqlalchemy.sql.expression.lateral(selectable: SelectBase | _FromClauseArgument, name: str | None = None) → LateralFromClause¶
返回一个
Lateral对象。Lateral是Alias子类,表示应用了 LATERAL 关键字的子查询。LATERAL 子查询的特殊行为在于它出现在封闭 SELECT 的 FROM 子句中,但可能与该 SELECT 的其他 FROM 子句相关联。它是一种特殊的子查询,仅受少数后端支持,目前是较新版本的 PostgreSQL。
另请参阅
LATERAL 关联 - 用法概述。
- function sqlalchemy.sql.expression.outerjoin(left: _FromClauseArgument, right: _FromClauseArgument, onclause: _OnClauseArgument | None = None, full: bool = False) → Join¶
返回一个
OUTER JOIN子句元素。返回的对象是
Join的一个实例。通过任何
FromClause上的FromClause.outerjoin()方法也可获得类似的功能。要将连接链接在一起,请在生成的
Join对象上使用FromClause.join()或FromClause.outerjoin()方法。
- function sqlalchemy.sql.expression.tablesample(selectable: _FromClauseArgument, sampling: float | Function[Any], name: str | None = None, seed: roles.ExpressionElementRole[Any] | None = None) → TableSample¶
返回一个
TableSample对象。TableSample是Alias子类,表示应用了 TABLESAMPLE 子句的表。tablesample()也可从FromClause类通过FromClause.tablesample()方法获得。TABLESAMPLE 子句允许从表中选择随机选择的近似百分比的行。它支持多种抽样方法,最常见的是 BERNOULLI 和 SYSTEM。
例如:
from sqlalchemy import func selectable = people.tablesample( func.bernoulli(1), name="alias", seed=func.random() ) stmt = select(selectable.c.people_id)
假设
people具有列people_id,则上述语句将呈现为SELECT alias.people_id FROM people AS alias TABLESAMPLE bernoulli(:bernoulli_1) REPEATABLE (random())
可选择类文档¶
此处的类是使用 可选择基础构造器 和 可选择修饰符构造器 中列出的构造器生成的。
| 对象名称 | 描述 |
|---|---|
表示表或可选择别名 (AS)。 |
|
针对表、子查询和其他可选择对象的别名的基类。 |
|
构成 |
|
表示通用表表达式。 |
|
将 |
|
表示 |
|
表示可在 |
|
可在其中添加其他元素的 SELECT 语句的基类。 |
|
声明包含 CTE 支持的类的 Mixin。 |
|
表示两个 |
|
表示横向子查询。 |
|
核心构造的最基本类,这些构造具有可以表示行的列的概念。 |
|
表示标量子查询。 |
|
表示可在语句中用作 COLUMN 元素的标量 |
|
表示 |
|
将类标记为可选择。 |
|
SELECT 语句的基类。 |
|
表示 SELECT 的子查询。 |
|
表示最小的“表”构造。 |
|
表示 TABLESAMPLE 子句。 |
|
针对“表值”SQL 函数的别名。 |
|
将 |
|
表示可在语句中用作 FROM 元素的 |
- class sqlalchemy.sql.expression.Alias¶
表示表或可选择别名 (AS)。
表示别名,通常使用
AS关键字(或在某些数据库(例如 Oracle 数据库)上不使用关键字)应用于 SQL 语句中的任何表或子选择。此对象从
alias()模块级函数以及所有FromClause子类上可用的FromClause.alias()方法构造。另请参阅
类签名
class
sqlalchemy.sql.expression.Alias(sqlalchemy.sql.roles.DMLTableRole,sqlalchemy.sql.expression.FromClauseAlias)-
attribute
sqlalchemy.sql.expression.Alias.inherit_cache: bool | None = True¶ 指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
attribute
- class sqlalchemy.sql.expression.AliasedReturnsRows¶
针对表、子查询和其他可选择对象的别名的基类。
类签名
class
sqlalchemy.sql.expression.AliasedReturnsRows(sqlalchemy.sql.expression.NoInit,sqlalchemy.sql.expression.NamedFromClause)-
attribute
sqlalchemy.sql.expression.AliasedReturnsRows.description¶
-
method
sqlalchemy.sql.expression.AliasedReturnsRows.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
FromClause“派生自”给定的FromClause,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
attribute
sqlalchemy.sql.expression.AliasedReturnsRows.original¶ 用于引用 Alias.original 的方言的旧版。
-
attribute
- class sqlalchemy.sql.expression.CompoundSelect¶
构成
UNION、UNION ALL和其他基于 SELECT 的集合运算的基础。成员
add_cte(), alias(), as_scalar(), c, corresponding_column(), cte(), execution_options(), exists(), exported_columns, fetch(), get_execution_options(), get_label_style(), group_by(), is_derived_from(), label(), lateral(), limit(), offset(), options(), order_by(), replace_selectable(), scalar_subquery(), select(), selected_columns, self_group(), set_label_style(), slice(), subquery(), with_for_update()
类签名
class
sqlalchemy.sql.expression.CompoundSelect(sqlalchemy.sql.expression.HasCompileState,sqlalchemy.sql.expression.GenerativeSelect,sqlalchemy.sql.expression.TypedReturnsRows>)-
method
sqlalchemy.sql.expression.CompoundSelect.add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ inherited from the
HasCTE.add_cte()method ofHasCTE向此语句添加一个或多个
CTE构造。此方法会将给定的
CTE构造与父语句关联起来,以便它们在最终语句的 WITH 子句中被无条件地呈现,即使在该语句或任何子选择中的其他地方没有被引用。可选的
HasCTE.add_cte.nest_here参数设置为 True 时,将使每个给定的CTE在与此语句直接一起呈现的 WITH 子句中呈现,而不是被移动到最终呈现的语句的顶部,即使此语句在更大的语句中呈现为子查询。此方法有两个一般用途。一种是嵌入 CTE 语句,这些语句在没有被显式引用的情况下服务于某些目的,例如将 DML 语句(如 INSERT 或 UPDATE)作为 CTE 嵌入到可能间接从其结果中提取数据的主语句中。另一种是提供对特定系列 CTE 构造的精确位置的控制,这些构造应保持直接根据可能嵌套在较大语句中的特定语句呈现。
例如:
from sqlalchemy import table, column, select t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
将会呈现
WITH anon_1 AS ( INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) ) SELECT t.c1, t.c2 FROM t
在上面,“anon_1” CTE 在 SELECT 语句中没有被引用,但仍然完成了运行 INSERT 语句的任务。
类似地,在 DML 相关的上下文中,使用 PostgreSQL
Insert构造来生成 “upsert”from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
上面的语句呈现为
WITH deletions AS ( DELETE FROM t WHERE t.c1 < %(c1_1)s ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
1.4.21 版本新增。
- 参数:
*ctes¶ –
零个或多个
CTE构造。Changed in version 2.0: 接受多个 CTE 实例
nest_here¶ –
如果为 True,则给定的 CTE 或 CTEs 将被呈现,就好像它们在添加到此
HasCTE时,将HasCTE.cte.nesting标志指定为True。 假设给定的 CTEs 在外部封闭语句中也没有被引用,则当给定此标志时,给定的 CTEs 应在此语句的级别呈现。2.0 版本新增。
另请参阅
-
method
sqlalchemy.sql.expression.CompoundSelect.alias(name: str | None = None, flat: bool = False) → Subquery¶ inherited from the
SelectBase.alias()method ofSelectBase返回针对此
SelectBase的命名子查询。对于
SelectBase(而不是FromClause),这将返回一个Subquery对象,其行为与用于FromClause的Alias对象基本相同。Changed in version 1.4:
SelectBase.alias()方法现在是SelectBase.subquery()方法的同义词。
-
method
sqlalchemy.sql.expression.CompoundSelect.as_scalar() → ScalarSelect[Any]¶ inherited from the
SelectBase.as_scalar()method ofSelectBaseDeprecated since version 1.4:
SelectBase.as_scalar()方法已弃用,并将在未来的版本中删除。请参考SelectBase.scalar_subquery()。
-
attribute
sqlalchemy.sql.expression.CompoundSelect.c¶ inherited from the
SelectBase.cattribute ofSelectBaseDeprecated since version 1.4:
SelectBase.c和SelectBase.columns属性已弃用,并将在未来的版本中删除;这些属性隐式地创建一个子查询,该子查询应该是显式的。请首先调用SelectBase.subquery()以创建一个子查询,然后该子查询包含此属性。要访问此 SELECT 对象从中 SELECT 的列,请使用SelectBase.selected_columns属性。
-
method
sqlalchemy.sql.expression.CompoundSelect.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ inherited from the
Selectable.corresponding_column()method ofSelectable给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 要匹配的目标
ColumnElement。require_embedded¶ – 仅当给定的
ColumnElement实际上存在于此Selectable的子元素中时,才返回给定ColumnElement的相应列。 通常,如果该列仅与此Selectable的导出列之一共享一个公共祖先,则该列将匹配。
另请参阅
-
method
sqlalchemy.sql.expression.CompoundSelect.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ inherited from the
HasCTE.cte()method ofHasCTE返回一个新的
CTE,或通用表表达式实例。公共表表达式是一种 SQL 标准,其中 SELECT 语句可以利用与主语句一起指定的辅助语句,使用名为 “WITH” 的子句。 关于 UNION 的特殊语义也可以用于允许 “递归” 查询,其中 SELECT 语句可以利用先前已选择的行集。
CTE 也可以应用于某些数据库上的 DML 构造 UPDATE、INSERT 和 DELETE,既可以作为与 RETURNING 结合使用的 CTE 行的来源,也可以作为 CTE 行的使用者。
SQLAlchemy 检测
CTE对象,这些对象被视为类似于Alias对象,作为要传递到语句的 FROM 子句以及语句顶部的 WITH 子句的特殊元素。对于 PostgreSQL “MATERIALIZED” 和 “NOT MATERIALIZED” 等特殊前缀,可以使用
CTE.prefix_with()方法来建立这些前缀。Changed in version 1.3.13: 添加了对前缀的支持。特别是 - MATERIALIZED 和 NOT MATERIALIZED。
- 参数:
name¶ – 给公共表表达式指定的名称。 与
FromClause.alias()类似,名称可以保留为None,在这种情况下,将在查询编译时使用匿名符号。recursive¶ – 如果为
True,将呈现WITH RECURSIVE。 递归公共表表达式旨在与 UNION ALL 结合使用,以便从已选择的行中派生行。nesting¶ –
如果为
True,则将 CTE 本地呈现到引用它的语句中。 对于更复杂的情况,也可以使用HasCTE.add_cte()方法,并结合HasCTE.add_cte.nest_here参数,以更仔细地控制特定 CTE 的确切位置。1.4.24 版本新增。
另请参阅
以下示例包括两个来自 PostgreSQL 文档的示例,网址为 https://postgresql.ac.cn/docs/current/static/queries-with.html,以及其他示例。
示例 1,非递归
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() orders = Table( "orders", metadata, Column("region", String), Column("amount", Integer), Column("product", String), Column("quantity", Integer), ) regional_sales = ( select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) .group_by(orders.c.region) .cte("regional_sales") ) top_regions = ( select(regional_sales.c.region) .where( regional_sales.c.total_sales > select(func.sum(regional_sales.c.total_sales) / 10) ) .cte("top_regions") ) statement = ( select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales"), ) .where(orders.c.region.in_(select(top_regions.c.region))) .group_by(orders.c.region, orders.c.product) ) result = conn.execute(statement).fetchall()
示例 2,WITH RECURSIVE
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() parts = Table( "parts", metadata, Column("part", String), Column("sub_part", String), Column("quantity", Integer), ) included_parts = ( select(parts.c.sub_part, parts.c.part, parts.c.quantity) .where(parts.c.part == "our part") .cte(recursive=True) ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
示例 3,使用 UPDATE 和 INSERT 以及 CTE 的 upsert
from datetime import date from sqlalchemy import ( MetaData, Table, Column, Integer, Date, select, literal, and_, exists, ) metadata = MetaData() visitors = Table( "visitors", metadata, Column("product_id", Integer, primary_key=True), Column("date", Date, primary_key=True), Column("count", Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where( and_(visitors.c.product_id == product_id, visitors.c.date == day) ) .values(count=visitors.c.count + count) .returning(literal(1)) .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)).where( ~exists(update_cte.select()) ), ) connection.execute(upsert)
示例 4,嵌套 CTE (SQLAlchemy 1.4.24 及更高版本)
value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte( "value_a", nesting=True ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
上面的查询将呈现嵌套在第一个 CTE 内的第二个 CTE,如下所示,带有内联参数:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
可以使用
HasCTE.add_cte()方法设置相同的 CTE,如下所示(SQLAlchemy 2.0 及更高版本):value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n) .add_cte(value_a_nested, nest_here=True) .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
示例 5,非线性 CTE (SQLAlchemy 1.4.28 及更高版本)
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
上面的查询将在递归 CTE 内部呈现 2 个 UNION:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
另请参阅
Query.cte()-HasCTE.cte()的 ORM 版本。
-
method
sqlalchemy.sql.expression.CompoundSelect.execution_options(**kw: Any) → Self¶ inherited from the
Executable.execution_options()method ofExecutable为此语句设置在执行期间生效的非 SQL 选项。
可以使用多种作用域设置执行选项,包括每个语句、每个连接或每次执行,使用
Connection.execution_options()等方法,以及接受选项字典的参数,例如Connection.execute.execution_options和Session.execute.execution_options。执行选项的主要特征是,与其他类型的选项(如 ORM 加载程序选项)相比,执行选项永远不会影响查询的已编译 SQL,只会影响 SQL 语句本身的调用方式或结果的提取方式。 也就是说,执行选项不是 SQL 编译所容纳内容的一部分,也不被视为语句的缓存状态的一部分。
Executable.execution_options()方法是 generative 的,应用于Engine和Query对象的方法也是如此,这意味着当调用该方法时,将返回对象的副本,该副本将给定的参数应用于该新副本,但保持原始对象不变statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
此行为的一个例外是
Connection对象,其中Connection.execution_options()方法明确地不是 generative 的。可以传递给
Executable.execution_options()和其他相关方法和参数字典的选项类型包括 SQLAlchemy Core 或 ORM 显式使用的参数,以及 SQLAlchemy 未定义的任意关键字参数,这意味着这些方法和/或参数字典可以用于与自定义代码交互的用户定义的参数,自定义代码可以使用Executable.get_execution_options()和Connection.get_execution_options()等方法访问这些参数,或者在选定的事件挂钩中使用专用的execution_options事件参数,例如ConnectionEvents.before_execute.execution_options或ORMExecuteState.execution_options,例如:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
在 SQLAlchemy 显式识别的选项范围内,大多数选项适用于特定类别的对象,而不适用于其他对象。 最常见的执行选项包括
Connection.execution_options.isolation_level- 通过Engine设置连接或一类连接的隔离级别。 此选项仅被Connection或Engine接受。Connection.execution_options.stream_results- 指示应使用服务器端游标获取结果;此选项被Connection、Connection.execute.execution_options参数(在Connection.execute()上)以及 SQL 语句对象上的Executable.execution_options()接受,并且还被 ORM 构造(如Session.execute())接受。Connection.execution_options.compiled_cache- 指示一个字典,该字典将充当 SQL 编译缓存,用于Connection或Engine,以及 ORM 方法(如Session.execute())。 可以作为None传递以禁用语句的缓存。 此选项不被Executable.execution_options()接受,因为不建议在语句对象中携带编译缓存。Connection.execution_options.schema_translate_map- 模式转换映射 功能使用的模式名称映射,被Connection,Engine,Executable以及 ORM 构造(如Session.execute())接受。
另请参阅
Connection.execution_options()Connection.execute.execution_optionsSession.execute.execution_optionsORM 执行选项 - 关于所有 ORM 特定的执行选项的文档
-
method
sqlalchemy.sql.expression.CompoundSelect.exists() → Exists¶ 继承自
SelectBase.exists()方法,该方法属于SelectBase返回此 selectable 的
Exists表示形式,可用作列表达式。返回的对象是
Exists的实例。1.4 版本新增。
-
attribute
sqlalchemy.sql.expression.CompoundSelect.exported_columns¶ 继承自
SelectBase.exported_columns属性,该属性属于SelectBase一个
ColumnCollection,表示此Selectable的 “导出” 列,不包括TextClause构造。对于
SelectBase对象,“导出” 列与SelectBase.selected_columns集合同义。1.4 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ 继承自
GenerativeSelect.fetch()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 FETCH FIRST 条件。
这是一个数值,通常在生成的 select 中呈现为
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}表达式。此功能目前在 Oracle Database、PostgreSQL、MSSQL 中实现。使用
GenerativeSelect.offset()来指定偏移量。注意
GenerativeSelect.fetch()方法将替换任何使用GenerativeSelect.limit()应用的子句。1.4 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.get_execution_options() → _ExecuteOptions¶ 继承自
Executable.get_execution_options()方法,该方法属于Executable获取将在执行期间生效的非 SQL 选项。
1.3 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.get_label_style() → SelectLabelStyle¶ 继承自
GenerativeSelect.get_label_style()方法,该方法属于GenerativeSelect检索当前标签样式。
1.4 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.group_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 继承自
GenerativeSelect.group_by()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 GROUP BY 条件列表。
可以通过传递
None来抑制所有现有的 GROUP BY 设置。例如:
stmt = select(table.c.name, func.max(table.c.stat)).group_by(table.c.name)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 GROUP BY 子句。
-
method
sqlalchemy.sql.expression.CompoundSelect.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.CompoundSelect.label(name: str | None) → Label[Any]¶ 继承自
SelectBase.label()方法,该方法属于SelectBase返回此 selectable 的 “标量” 表示形式,嵌入为带有标签的子查询。
-
method
sqlalchemy.sql.expression.CompoundSelect.lateral(name: str | None = None) → LateralFromClause¶ 继承自
SelectBase.lateral()方法,该方法属于SelectBase返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
method
sqlalchemy.sql.expression.CompoundSelect.limit(limit: _LimitOffsetType) → Self¶ 继承自
GenerativeSelect.limit()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 LIMIT 条件。
这是一个数值,通常在生成的 select 中呈现为
LIMIT表达式。不支持LIMIT的后端将尝试提供类似的功能。注意
GenerativeSelect.limit()方法将替换任何使用GenerativeSelect.fetch()应用的子句。- 参数:
limit¶ – 整数 LIMIT 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
method
sqlalchemy.sql.expression.CompoundSelect.offset(offset: _LimitOffsetType) → Self¶ 继承自
GenerativeSelect.offset()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 OFFSET 条件。
这是一个数值,通常在生成的 select 中呈现为
OFFSET表达式。不支持OFFSET的后端将尝试提供类似的功能。- 参数:
offset¶ – 整数 OFFSET 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
method
sqlalchemy.sql.expression.CompoundSelect.options(*options: ExecutableOption) → Self¶ 继承自
Executable.options()方法,该方法属于Executable将选项应用于此语句。
从广义上讲,选项是任何可以被语句的 SQL 编译器解释的 Python 对象。这些选项可以被特定的方言或特定类型的编译器使用。
最常见的选项类型是 ORM 级别的选项,它将 “急切加载” 和其他加载行为应用于 ORM 查询。然而,理论上选项可以用于许多其他目的。
有关特定语句类型的特定选项类型的背景信息,请参阅这些选项对象的文档。
在 1.4 版本中更改: - 向 Core 语句对象添加了
Executable.options(),旨在实现统一的 Core / ORM 查询功能。
-
method
sqlalchemy.sql.expression.CompoundSelect.order_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 继承自
GenerativeSelect.order_by()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 ORDER BY 条件列表。
例如:
stmt = select(table).order_by(table.c.id, table.c.name)
多次调用此方法等同于使用所有连接的子句调用一次。可以通过单独传递
None来取消所有现有的 ORDER BY 条件。然后可以通过再次调用Query.order_by()来添加新的 ORDER BY 条件,例如# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 ORDER BY 子句。
-
method
sqlalchemy.sql.expression.CompoundSelect.replace_selectable(old: FromClause, alias: Alias) → Self¶ 继承自
Selectable.replace_selectable()方法,该方法属于Selectable替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
method
sqlalchemy.sql.expression.CompoundSelect.scalar_subquery() → ScalarSelect[Any]¶ inherited from the
SelectBase.scalar_subquery()method ofSelectBase返回此 selectable 的 ‘scalar’ 表示形式,可以用作列表达式。
返回的对象是
ScalarSelect的一个实例。通常,columns 子句中只有一列的 select 语句有资格用作标量表达式。然后,标量子查询可以在封闭的 SELECT 的 WHERE 子句或 columns 子句中使用。
请注意,标量子查询与可以使用
SelectBase.subquery()方法生成的 FROM 级别子查询区分开来。另请参阅
标量和关联子查询 - 在 2.0 教程中
-
method
sqlalchemy.sql.expression.CompoundSelect.select(*arg: Any, **kw: Any) → Select¶ inherited from the
SelectBase.select()method ofSelectBaseDeprecated since version 1.4:
SelectBase.select()方法已弃用,并将在未来的版本中移除;此方法隐式地创建了一个子查询,而这应该是显式的。请先调用SelectBase.subquery()以创建子查询,然后再进行选择。
-
attribute
sqlalchemy.sql.expression.CompoundSelect.selected_columns¶ 一个
ColumnCollection,表示此 SELECT 语句或类似构造在其结果集中返回的列,不包括TextClause构造。对于
CompoundSelect,CompoundSelect.selected_columns属性返回集合操作中包含的语句系列中第一个 SELECT 语句的选定列。1.4 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.self_group(against: OperatorType | None = None) → GroupedElement¶ 对此
ClauseElement应用 ‘grouping’(分组)。此方法被子类重写以返回 “grouping” 构造,即括号。特别是,当 “binary” 表达式放置到更大的表达式中时,以及当
select()构造放置到另一个select()的 FROM 子句中时,它用于在其周围提供分组。(请注意,子查询通常应使用Select.alias()方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()的应用是自动的 - 最终用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此可能不需要括号,例如,在像x OR (y AND z)这样的表达式中 - AND 的优先级高于 OR。ClauseElement的基本self_group()方法只返回 self。
-
method
sqlalchemy.sql.expression.CompoundSelect.set_label_style(style: SelectLabelStyle) → Self¶ 返回具有指定标签样式的新 selectable。
有三种可用的 “label styles”(标签样式),
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL,以及SelectLabelStyle.LABEL_STYLE_NONE。默认样式是SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY。在现代 SQLAlchemy 中,通常不需要更改标签样式,因为通过使用
ColumnElement.label()方法可以更有效地使用每个表达式的标签。在过去的版本中,LABEL_STYLE_TABLENAME_PLUS_COL用于消除来自不同表、别名或子查询的同名列的歧义;较新的LABEL_STYLE_DISAMBIGUATE_ONLY现在仅对与现有名称冲突的名称应用标签,从而使此标签的影响最小化。消除歧义的基本原理主要是为了当创建子查询时,所有列表达式都可从给定的
FromClause.c集合中获得。New in version 1.4: -
GenerativeSelect.set_label_style()方法取代了以前的.apply_labels()、.with_labels()和use_labels=True方法和/或参数的组合。另请参阅
LABEL_STYLE_DISAMBIGUATE_ONLY (仅消除歧义标签样式)LABEL_STYLE_TABLENAME_PLUS_COL (表名加列名标签样式)LABEL_STYLE_NONE (无标签样式)LABEL_STYLE_DEFAULT (默认标签样式)
-
method
sqlalchemy.sql.expression.CompoundSelect.slice(start: int, stop: int) → Self¶ inherited from the
GenerativeSelect.slice()method ofGenerativeSelect基于切片对此语句应用 LIMIT / OFFSET。
start 和 stop 索引的行为类似于 Python 内置
range()函数的参数。此方法提供了使用LIMIT/OFFSET获取查询切片的替代方法。例如,
stmt = select(User).order_by(User.id).slice(1, 3)
渲染为
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
注意
GenerativeSelect.slice()方法将替换任何使用GenerativeSelect.fetch()应用的子句。New in version 1.4: 添加了从 ORM 泛化的
GenerativeSelect.slice()方法。
-
method
sqlalchemy.sql.expression.CompoundSelect.subquery(name: str | None = None) → Subquery¶ inherited from the
SelectBase.subquery()method ofSelectBase返回此
SelectBase的子查询。从 SQL 的角度来看,子查询是一个带括号的、命名的构造,可以放在另一个 SELECT 语句的 FROM 子句中。
给定一个 SELECT 语句,例如
stmt = select(table.c.id, table.c.name)
上面的语句可能看起来像
SELECT table.id, table.name FROM table
子查询形式本身以相同的方式呈现,但是当嵌入到另一个 SELECT 语句的 FROM 子句中时,它将变成一个命名的子元素
subq = stmt.subquery() new_stmt = select(subq)
上面渲染为
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
从历史上看,
SelectBase.subquery()等同于在 FROM 对象上调用FromClause.alias()方法;但是,由于SelectBase对象不是直接的 FROM 对象,因此SelectBase.subquery()方法提供了更清晰的语义。1.4 版本新增。
-
method
sqlalchemy.sql.expression.CompoundSelect.with_for_update(*, nowait: bool = False, read: bool = False, of: _ForUpdateOfArgument | None = None, skip_locked: bool = False, key_share: bool = False) → Self¶ inherited from the
GenerativeSelect.with_for_update()method ofGenerativeSelect为此
GenerativeSelect指定一个FOR UPDATE子句。例如:
stmt = select(table).with_for_update(nowait=True)
在像 PostgreSQL 或 Oracle 数据库这样的数据库上,上述内容将渲染像这样的语句
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
在其他后端,
nowait选项被忽略,而是会产生SELECT table.a, table.b FROM table FOR UPDATE
当不带参数调用时,语句将使用后缀
FOR UPDATE渲染。然后可以提供额外的参数,以允许常见的特定于数据库的变体。- 参数:
nowait¶ – 布尔值;将在 Oracle 数据库和 PostgreSQL 方言上渲染
FOR UPDATE NOWAIT。read¶ – 布尔值;将在 MySQL 上渲染
LOCK IN SHARE MODE,在 PostgreSQL 上渲染FOR SHARE。在 PostgreSQL 上,当与nowait结合使用时,将渲染FOR SHARE NOWAIT。of¶ – SQL 表达式或 SQL 表达式元素的列表(通常是
Column对象或兼容的表达式,对于某些后端也可能是表表达式),它将渲染到FOR UPDATE OF子句中;受 PostgreSQL、Oracle 数据库、某些 MySQL 版本以及可能还有其他版本的支持。可能会根据后端渲染为表或列。skip_locked¶ – 布尔值,将在 Oracle 数据库和 PostgreSQL 方言上渲染
FOR UPDATE SKIP LOCKED,或者如果还指定了read=True,则渲染FOR SHARE SKIP LOCKED。key_share¶ – 布尔值,将在 PostgreSQL 方言上渲染
FOR NO KEY UPDATE,或者如果与read=True结合使用,则渲染FOR KEY SHARE。
-
method
- class sqlalchemy.sql.expression.CTE¶
表示通用表表达式。
CTE对象是使用任何 SELECT 语句的SelectBase.cte()方法获得的。一个不太常用的语法也允许使用HasCTE.cte()方法,该方法存在于 DML 构造(例如Insert、Update和Delete)上。有关 CTE 的用法详情,请参阅HasCTE.cte()方法。成员
类签名
class
sqlalchemy.sql.expression.CTE(sqlalchemy.sql.roles.DMLTableRole,sqlalchemy.sql.roles.IsCTERole,sqlalchemy.sql.expression.Generative,sqlalchemy.sql.expression.HasPrefixes,sqlalchemy.sql.expression.HasSuffixes,sqlalchemy.sql.expression.AliasedReturnsRows)-
method
sqlalchemy.sql.expression.CTE.alias(name: str | None = None, flat: bool = False) → CTE¶ -
此方法是
FromClause.alias()方法的 CTE 特定专业化。
-
method
sqlalchemy.sql.expression.CTE.union(*other: _SelectStatementForCompoundArgument[Any]) → CTE¶ 返回一个新的
CTE,其中包含原始 CTE 与作为位置参数提供的给定 selectables 的 SQLUNION。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
另请参阅
HasCTE.cte()- 调用样式示例
-
方法
sqlalchemy.sql.expression.CTE.union_all(*other: _SelectStatementForCompoundArgument[Any]) → CTE¶ 返回一个新的
CTE,它包含原始 CTE 与作为位置参数提供的给定 selectable 对象的 SQLUNION ALL联合。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
另请参阅
HasCTE.cte()- 调用样式示例
-
method
- 类 sqlalchemy.sql.expression.Executable¶
将
ClauseElement标记为支持执行。Executable是所有 “statement” 类型对象的超类,包括select(),delete(),update(),insert(),text()。类签名
class
sqlalchemy.sql.expression.Executable(sqlalchemy.sql.roles.StatementRole)-
方法
sqlalchemy.sql.expression.Executable.execution_options(**kw: Any) → Self¶ 为此语句设置在执行期间生效的非 SQL 选项。
可以使用多种作用域设置执行选项,包括每个语句、每个连接或每次执行,使用
Connection.execution_options()等方法,以及接受选项字典的参数,例如Connection.execute.execution_options和Session.execute.execution_options。执行选项的主要特征是,与其他类型的选项(如 ORM 加载程序选项)相比,执行选项永远不会影响查询的已编译 SQL,只会影响 SQL 语句本身的调用方式或结果的提取方式。 也就是说,执行选项不是 SQL 编译所容纳内容的一部分,也不被视为语句的缓存状态的一部分。
Executable.execution_options()方法是 generative 的,应用于Engine和Query对象的方法也是如此,这意味着当调用该方法时,将返回对象的副本,该副本将给定的参数应用于该新副本,但保持原始对象不变statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
此行为的一个例外是
Connection对象,其中Connection.execution_options()方法明确地不是 generative 的。可以传递给
Executable.execution_options()和其他相关方法和参数字典的选项类型包括 SQLAlchemy Core 或 ORM 显式使用的参数,以及 SQLAlchemy 未定义的任意关键字参数,这意味着这些方法和/或参数字典可以用于与自定义代码交互的用户定义的参数,自定义代码可以使用Executable.get_execution_options()和Connection.get_execution_options()等方法访问这些参数,或者在选定的事件挂钩中使用专用的execution_options事件参数,例如ConnectionEvents.before_execute.execution_options或ORMExecuteState.execution_options,例如:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
在 SQLAlchemy 显式识别的选项范围内,大多数选项适用于特定类别的对象,而不适用于其他对象。 最常见的执行选项包括
Connection.execution_options.isolation_level- 通过Engine设置连接或一类连接的隔离级别。 此选项仅被Connection或Engine接受。Connection.execution_options.stream_results- 指示应使用服务器端游标获取结果;此选项被Connection、Connection.execute.execution_options参数(在Connection.execute()上)以及 SQL 语句对象上的Executable.execution_options()接受,并且还被 ORM 构造(如Session.execute())接受。Connection.execution_options.compiled_cache- 指示一个字典,该字典将充当 SQL 编译缓存,用于Connection或Engine,以及 ORM 方法(如Session.execute())。 可以作为None传递以禁用语句的缓存。 此选项不被Executable.execution_options()接受,因为不建议在语句对象中携带编译缓存。Connection.execution_options.schema_translate_map- 模式转换映射 功能使用的模式名称映射,被Connection,Engine,Executable以及 ORM 构造(如Session.execute())接受。
另请参阅
Connection.execution_options()Connection.execute.execution_optionsSession.execute.execution_optionsORM 执行选项 - 关于所有 ORM 特定的执行选项的文档
-
方法
sqlalchemy.sql.expression.Executable.get_execution_options() → _ExecuteOptions¶ 获取将在执行期间生效的非 SQL 选项。
1.3 版本新增。
-
方法
sqlalchemy.sql.expression.Executable.options(*options: ExecutableOption) → Self¶ 将选项应用于此语句。
从广义上讲,选项是任何可以被语句的 SQL 编译器解释的 Python 对象。这些选项可以被特定的方言或特定类型的编译器使用。
最常见的选项类型是 ORM 级别的选项,它将 “急切加载” 和其他加载行为应用于 ORM 查询。然而,理论上选项可以用于许多其他目的。
有关特定语句类型的特定选项类型的背景信息,请参阅这些选项对象的文档。
在 1.4 版本中更改: - 向 Core 语句对象添加了
Executable.options(),旨在实现统一的 Core / ORM 查询功能。
-
方法
- 类 sqlalchemy.sql.expression.Exists¶
表示
EXISTS子句。请参阅
exists()以获取使用说明。一个
EXISTS子句也可以从select()实例构建,方法是调用SelectBase.exists()。-
方法
sqlalchemy.sql.expression.Exists.correlate(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 将关联应用于此
Exists注明的子查询。
-
方法
sqlalchemy.sql.expression.Exists.correlate_except(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 将关联应用于此
Exists注明的子查询。
-
属性
sqlalchemy.sql.expression.Exists.inherit_cache: bool | None = True¶ 指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
方法
sqlalchemy.sql.expression.Exists.select() → Select¶ 返回此
Exists的 SELECT。例如:
stmt = exists(some_table.c.id).where(some_table.c.id == 5).select()
这将生成类似于以下的语句
SELECT EXISTS (SELECT id FROM some_table WHERE some_table = :param) AS anon_1
另请参阅
select()- 通用方法,允许使用任意列列表。
-
方法
sqlalchemy.sql.expression.Exists.select_from(*froms: _FromClauseArgument) → Self¶ 返回一个新的
Exists构造,将给定表达式应用于包含的 select 语句的Select.select_from()方法。注意
通常最好先构建一个
Select语句,包括所需的 WHERE 子句,然后使用SelectBase.exists()方法立即生成一个Exists对象。
-
方法
sqlalchemy.sql.expression.Exists.where(*clause: _ColumnExpressionArgument[bool]) → Self¶ 返回一个新的
exists()构造,其中给定的表达式已添加到其 WHERE 子句中,如果存在任何现有子句,则通过 AND 连接。注意
通常最好先构建一个
Select语句,包括所需的 WHERE 子句,然后使用SelectBase.exists()方法立即生成一个Exists对象。
-
方法
- 类 sqlalchemy.sql.expression.FromClause¶
表示可在
SELECT语句的FROM子句中使用的元素。FromClause最常见的形式是Table和select()构造。所有FromClause对象共有的主要功能包括一个
c集合,它提供对ColumnElement对象集合的按名称访问。一个
primary_key属性,它是所有指示primary_key标志的ColumnElement对象的集合。生成 “from” 子句的各种派生的方法,包括
FromClause.alias(),FromClause.join(),FromClause.select()。
成员
alias(), c, columns, description, entity_namespace, exported_columns, foreign_keys, is_derived_from(), join(), outerjoin(), primary_key, schema, select(), tablesample()
类签名
class
sqlalchemy.sql.expression.FromClause(sqlalchemy.sql.roles.AnonymizedFromClauseRole,sqlalchemy.sql.expression.Selectable)-
方法
sqlalchemy.sql.expression.FromClause.alias(name: str | None = None, flat: bool = False) → NamedFromClause¶ 返回此
FromClause的别名。例如:
a2 = some_table.alias("a2")
上面的代码创建了一个
Alias对象,该对象可以用作任何 SELECT 语句中的 FROM 子句。
-
属性
sqlalchemy.sql.expression.FromClause.c¶ 是
FromClause.columns的同义词- 返回:
-
属性
sqlalchemy.sql.expression.FromClause.columns¶ 此
FromClause维护的基于名称的ColumnElement对象集合。columns或c集合是使用表绑定或其他 selectable 绑定列构造 SQL 表达式的入口select(mytable).where(mytable.c.somecolumn == 5)
- 返回:
一个
ColumnCollection对象。
-
属性
sqlalchemy.sql.expression.FromClause.description¶ 此
FromClause的简要描述。主要用于错误消息格式化。
-
属性
sqlalchemy.sql.expression.FromClause.entity_namespace¶ 返回用于 SQL 表达式中基于名称的访问的命名空间。
这是用于解析 “filter_by()” 类型表达式的命名空间,例如
stmt.filter_by(address="some address")
它默认为
.c集合,但内部可以使用 “entity_namespace” 注解覆盖它以传递替代结果。
-
属性
sqlalchemy.sql.expression.FromClause.exported_columns¶ 一个
ColumnCollection,表示此Selectable的 “导出” 列。对于
FromClause对象,“导出” 列与FromClause.columns集合同义。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.FromClause.foreign_keys¶ 返回此 FromClause 引用的
ForeignKey标记对象的集合。每个
ForeignKey都是Table范围内的ForeignKeyConstraint的成员。
-
方法
sqlalchemy.sql.expression.FromClause.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
FromClause“派生自”给定的FromClause,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
方法
sqlalchemy.sql.expression.FromClause.join(right: _FromClauseArgument, onclause: _ColumnExpressionArgument[bool] | None = None, isouter: bool = False, full: bool = False) → Join¶ 从此
FromClause返回到另一个FromClause的Join。例如:
from sqlalchemy import join j = user_table.join( address_table, user_table.c.id == address_table.c.user_id ) stmt = select(user_table).select_from(j)
将发出类似于以下的 SQL:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
- 参数:
right¶ – 连接的右侧;这是任何
FromClause对象,例如Table对象,也可能是 selectable 兼容的对象,例如 ORM 映射的类。onclause¶ – 表示连接的 ON 子句的 SQL 表达式。如果保留为
None,FromClause.join()将尝试基于外键关系连接两个表。isouter¶ – 如果为 True,则渲染 LEFT OUTER JOIN 而不是 JOIN。
full¶ – 如果为 True,则渲染 FULL OUTER JOIN 而不是 LEFT OUTER JOIN。暗示
FromClause.join.isouter。
-
方法
sqlalchemy.sql.expression.FromClause.outerjoin(right: _FromClauseArgument, onclause: _ColumnExpressionArgument[bool] | None = None, full: bool = False) → Join¶ 从此
FromClause返回到另一个FromClause的Join,并将 “isouter” 标志设置为 True。例如:
from sqlalchemy import outerjoin j = user_table.outerjoin( address_table, user_table.c.id == address_table.c.user_id )
以上等效于
j = user_table.join( address_table, user_table.c.id == address_table.c.user_id, isouter=True )
- 参数:
right¶ – 连接的右侧;这是任何
FromClause对象,例如Table对象,也可能是 selectable 兼容的对象,例如 ORM 映射的类。onclause¶ – 表示连接的 ON 子句的 SQL 表达式。如果保留为
None,FromClause.join()将尝试基于外键关系连接两个表。full¶ – 如果为 True,则渲染 FULL OUTER JOIN 而不是 LEFT OUTER JOIN。
-
属性
sqlalchemy.sql.expression.FromClause.primary_key¶ 返回构成此
_selectable.FromClause的主键的Column对象的可迭代集合。对于
Table对象,此集合由PrimaryKeyConstraint表示,它本身是Column对象的迭代集合。
-
attribute
sqlalchemy.sql.expression.FromClause.schema: str | None = None¶ 为此
FromClause定义 ‘schema’ 属性。对于大多数对象,这通常是
None,但Table对象除外,在Table对象中,它被视为Table.schema参数的值。
-
method
sqlalchemy.sql.expression.FromClause.select() → Select¶ 返回此
FromClause的 SELECT。例如:
stmt = some_table.select().where(some_table.c.id == 5)
另请参阅
select()- 通用方法,允许使用任意列列表。
-
method
sqlalchemy.sql.expression.FromClause.tablesample(sampling: float | Function[Any], name: str | None = None, seed: roles.ExpressionElementRole[Any] | None = None) → TableSample¶ 返回此
FromClause的 TABLESAMPLE 别名。返回值是由顶层
tablesample()函数提供的TableSample构造。另请参阅
tablesample()- 用法指南和参数
- class sqlalchemy.sql.expression.GenerativeSelect¶
可在其中添加其他元素的 SELECT 语句的基类。
这作为
Select和CompoundSelect的基础,其中可以添加诸如 ORDER BY、GROUP BY 之类的元素,并且可以控制列渲染。与TextualSelect相比,虽然它继承了SelectBase并且也是一个 SELECT 构造,但它表示一个固定的文本字符串,该字符串在此级别无法更改,只能作为子查询包装。成员
fetch(), get_label_style(), group_by(), limit(), offset(), order_by(), set_label_style(), slice(), with_for_update()
类签名
class
sqlalchemy.sql.expression.GenerativeSelect(sqlalchemy.sql.expression.SelectBase,sqlalchemy.sql.expression.Generative)-
method
sqlalchemy.sql.expression.GenerativeSelect.fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ 返回一个新的 selectable,应用了给定的 FETCH FIRST 条件。
这是一个数值,通常在生成的 select 中呈现为
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}表达式。此功能目前在 Oracle Database、PostgreSQL、MSSQL 中实现。使用
GenerativeSelect.offset()来指定偏移量。注意
GenerativeSelect.fetch()方法将替换任何使用GenerativeSelect.limit()应用的子句。1.4 版本新增。
-
method
sqlalchemy.sql.expression.GenerativeSelect.get_label_style() → SelectLabelStyle¶ 检索当前标签样式。
1.4 版本新增。
-
method
sqlalchemy.sql.expression.GenerativeSelect.group_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 返回一个新的 selectable,应用了给定的 GROUP BY 条件列表。
可以通过传递
None来抑制所有现有的 GROUP BY 设置。例如:
stmt = select(table.c.name, func.max(table.c.stat)).group_by(table.c.name)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 GROUP BY 子句。
-
method
sqlalchemy.sql.expression.GenerativeSelect.limit(limit: _LimitOffsetType) → Self¶ 返回一个新的 selectable,应用了给定的 LIMIT 条件。
这是一个数值,通常在生成的 select 中呈现为
LIMIT表达式。不支持LIMIT的后端将尝试提供类似的功能。注意
GenerativeSelect.limit()方法将替换任何使用GenerativeSelect.fetch()应用的子句。- 参数:
limit¶ – 整数 LIMIT 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
method
sqlalchemy.sql.expression.GenerativeSelect.offset(offset: _LimitOffsetType) → Self¶ 返回一个新的 selectable,应用了给定的 OFFSET 条件。
这是一个数值,通常在生成的 select 中呈现为
OFFSET表达式。不支持OFFSET的后端将尝试提供类似的功能。- 参数:
offset¶ – 整数 OFFSET 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
method
sqlalchemy.sql.expression.GenerativeSelect.order_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 返回一个新的 selectable,应用了给定的 ORDER BY 条件列表。
例如:
stmt = select(table).order_by(table.c.id, table.c.name)
多次调用此方法等同于使用所有连接的子句调用一次。可以通过单独传递
None来取消所有现有的 ORDER BY 条件。然后可以通过再次调用Query.order_by()来添加新的 ORDER BY 条件,例如# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 ORDER BY 子句。
-
method
sqlalchemy.sql.expression.GenerativeSelect.set_label_style(style: SelectLabelStyle) → Self¶ 返回具有指定标签样式的新 selectable。
有三种可用的 “label styles”(标签样式),
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL,以及SelectLabelStyle.LABEL_STYLE_NONE。默认样式是SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY。在现代 SQLAlchemy 中,通常不需要更改标签样式,因为通过使用
ColumnElement.label()方法可以更有效地使用每个表达式的标签。在过去的版本中,LABEL_STYLE_TABLENAME_PLUS_COL用于消除来自不同表、别名或子查询的同名列的歧义;较新的LABEL_STYLE_DISAMBIGUATE_ONLY现在仅对与现有名称冲突的名称应用标签,从而使此标签的影响最小化。消除歧义的基本原理主要是为了当创建子查询时,所有列表达式都可从给定的
FromClause.c集合中获得。New in version 1.4: -
GenerativeSelect.set_label_style()方法取代了以前的.apply_labels()、.with_labels()和use_labels=True方法和/或参数的组合。另请参阅
LABEL_STYLE_DISAMBIGUATE_ONLY (仅消除歧义标签样式)LABEL_STYLE_TABLENAME_PLUS_COL (表名加列名标签样式)LABEL_STYLE_NONE (无标签样式)LABEL_STYLE_DEFAULT (默认标签样式)
-
method
sqlalchemy.sql.expression.GenerativeSelect.slice(start: int, stop: int) → Self¶ 基于切片对此语句应用 LIMIT / OFFSET。
start 和 stop 索引的行为类似于 Python 内置
range()函数的参数。此方法提供了使用LIMIT/OFFSET获取查询切片的替代方法。例如,
stmt = select(User).order_by(User.id).slice(1, 3)
渲染为
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
注意
GenerativeSelect.slice()方法将替换任何使用GenerativeSelect.fetch()应用的子句。New in version 1.4: 添加了从 ORM 泛化的
GenerativeSelect.slice()方法。
-
method
sqlalchemy.sql.expression.GenerativeSelect.with_for_update(*, nowait: bool = False, read: bool = False, of: _ForUpdateOfArgument | None = None, skip_locked: bool = False, key_share: bool = False) → Self¶ 为此
GenerativeSelect指定一个FOR UPDATE子句。例如:
stmt = select(table).with_for_update(nowait=True)
在像 PostgreSQL 或 Oracle 数据库这样的数据库上,上述内容将渲染像这样的语句
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
在其他后端,
nowait选项被忽略,而是会产生SELECT table.a, table.b FROM table FOR UPDATE
当不带参数调用时,语句将使用后缀
FOR UPDATE渲染。然后可以提供额外的参数,以允许常见的特定于数据库的变体。- 参数:
nowait¶ – 布尔值;将在 Oracle 数据库和 PostgreSQL 方言上呈现
FOR UPDATE NOWAIT。read¶ – 布尔值;将在 MySQL 上呈现
LOCK IN SHARE MODE,在 PostgreSQL 上呈现FOR SHARE。在 PostgreSQL 上,当与nowait结合使用时,将呈现FOR SHARE NOWAIT。of¶ – SQL 表达式或 SQL 表达式元素列表(通常是
Column对象或兼容的表达式,对于某些后端也可能是表表达式),它们将呈现到FOR UPDATE OF子句中;受 PostgreSQL、Oracle 数据库、某些 MySQL 版本以及可能的其他版本支持。可能会根据后端呈现为表或列。skip_locked¶ – 布尔值,将在 Oracle 数据库和 PostgreSQL 方言上呈现
FOR UPDATE SKIP LOCKED,或者如果也指定了read=True,则呈现FOR SHARE SKIP LOCKED。key_share¶ – 布尔值,将在 PostgreSQL 方言上呈现
FOR NO KEY UPDATE,或者如果与read=True结合使用,则呈现FOR KEY SHARE。
-
method
- class sqlalchemy.sql.expression.HasCTE¶
声明包含 CTE 支持的类的 Mixin。
类签名
class
sqlalchemy.sql.expression.HasCTE(sqlalchemy.sql.roles.HasCTERole,sqlalchemy.sql.expression.SelectsRows)-
method
sqlalchemy.sql.expression.HasCTE.add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ 向此语句添加一个或多个
CTE构造。此方法会将给定的
CTE构造与父语句关联起来,以便它们在最终语句的 WITH 子句中被无条件地呈现,即使在该语句或任何子选择中的其他地方没有被引用。可选的
HasCTE.add_cte.nest_here参数设置为 True 时,将使每个给定的CTE在与此语句直接一起呈现的 WITH 子句中呈现,而不是被移动到最终呈现的语句的顶部,即使此语句在更大的语句中呈现为子查询。此方法有两个一般用途。一种是嵌入 CTE 语句,这些语句在没有被显式引用的情况下服务于某些目的,例如将 DML 语句(如 INSERT 或 UPDATE)作为 CTE 嵌入到可能间接从其结果中提取数据的主语句中。另一种是提供对特定系列 CTE 构造的精确位置的控制,这些构造应保持直接根据可能嵌套在较大语句中的特定语句呈现。
例如:
from sqlalchemy import table, column, select t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
将会呈现
WITH anon_1 AS ( INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) ) SELECT t.c1, t.c2 FROM t
在上面,“anon_1” CTE 在 SELECT 语句中没有被引用,但仍然完成了运行 INSERT 语句的任务。
类似地,在 DML 相关的上下文中,使用 PostgreSQL
Insert构造来生成 “upsert”from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
上面的语句呈现为
WITH deletions AS ( DELETE FROM t WHERE t.c1 < %(c1_1)s ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
1.4.21 版本新增。
- 参数:
*ctes¶ –
零个或多个
CTE构造。Changed in version 2.0: 接受多个 CTE 实例
nest_here¶ –
如果为 True,则给定的 CTE 或 CTEs 将被呈现,就好像它们在添加到此
HasCTE时,将HasCTE.cte.nesting标志指定为True。 假设给定的 CTEs 在外部封闭语句中也没有被引用,则当给定此标志时,给定的 CTEs 应在此语句的级别呈现。2.0 版本新增。
另请参阅
-
method
sqlalchemy.sql.expression.HasCTE.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ 返回一个新的
CTE,或通用表表达式实例。公共表表达式是一种 SQL 标准,其中 SELECT 语句可以利用与主语句一起指定的辅助语句,使用名为 “WITH” 的子句。 关于 UNION 的特殊语义也可以用于允许 “递归” 查询,其中 SELECT 语句可以利用先前已选择的行集。
CTE 也可以应用于某些数据库上的 DML 构造 UPDATE、INSERT 和 DELETE,既可以作为与 RETURNING 结合使用的 CTE 行的来源,也可以作为 CTE 行的使用者。
SQLAlchemy 检测
CTE对象,这些对象被视为类似于Alias对象,作为要传递到语句的 FROM 子句以及语句顶部的 WITH 子句的特殊元素。对于 PostgreSQL “MATERIALIZED” 和 “NOT MATERIALIZED” 等特殊前缀,可以使用
CTE.prefix_with()方法来建立这些前缀。Changed in version 1.3.13: 添加了对前缀的支持。特别是 - MATERIALIZED 和 NOT MATERIALIZED。
- 参数:
name¶ – 赋予公用表表达式的名称。与
FromClause.alias()类似,名称可以保留为None,在这种情况下,将在查询编译时使用匿名符号。recursive¶ – 如果
True,将呈现WITH RECURSIVE。递归公用表表达式旨在与 UNION ALL 结合使用,以便从已选择的行中派生行。nesting¶ –
如果为
True,则将 CTE 本地呈现到引用它的语句中。 对于更复杂的情况,也可以使用HasCTE.add_cte()方法,并结合HasCTE.add_cte.nest_here参数,以更仔细地控制特定 CTE 的确切位置。1.4.24 版本新增。
另请参阅
以下示例包括两个来自 PostgreSQL 文档的示例,网址为 https://postgresql.ac.cn/docs/current/static/queries-with.html,以及其他示例。
示例 1,非递归
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() orders = Table( "orders", metadata, Column("region", String), Column("amount", Integer), Column("product", String), Column("quantity", Integer), ) regional_sales = ( select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) .group_by(orders.c.region) .cte("regional_sales") ) top_regions = ( select(regional_sales.c.region) .where( regional_sales.c.total_sales > select(func.sum(regional_sales.c.total_sales) / 10) ) .cte("top_regions") ) statement = ( select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales"), ) .where(orders.c.region.in_(select(top_regions.c.region))) .group_by(orders.c.region, orders.c.product) ) result = conn.execute(statement).fetchall()
示例 2,WITH RECURSIVE
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() parts = Table( "parts", metadata, Column("part", String), Column("sub_part", String), Column("quantity", Integer), ) included_parts = ( select(parts.c.sub_part, parts.c.part, parts.c.quantity) .where(parts.c.part == "our part") .cte(recursive=True) ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
示例 3,使用 UPDATE 和 INSERT 以及 CTE 的 upsert
from datetime import date from sqlalchemy import ( MetaData, Table, Column, Integer, Date, select, literal, and_, exists, ) metadata = MetaData() visitors = Table( "visitors", metadata, Column("product_id", Integer, primary_key=True), Column("date", Date, primary_key=True), Column("count", Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where( and_(visitors.c.product_id == product_id, visitors.c.date == day) ) .values(count=visitors.c.count + count) .returning(literal(1)) .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)).where( ~exists(update_cte.select()) ), ) connection.execute(upsert)
示例 4,嵌套 CTE (SQLAlchemy 1.4.24 及更高版本)
value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte( "value_a", nesting=True ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
上面的查询将呈现嵌套在第一个 CTE 内的第二个 CTE,如下所示,带有内联参数:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
可以使用
HasCTE.add_cte()方法设置相同的 CTE,如下所示(SQLAlchemy 2.0 及更高版本):value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n) .add_cte(value_a_nested, nest_here=True) .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
示例 5,非线性 CTE (SQLAlchemy 1.4.28 及更高版本)
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
上面的查询将在递归 CTE 内部呈现 2 个 UNION:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
另请参阅
Query.cte()-HasCTE.cte()的 ORM 版本。
-
method
- class sqlalchemy.sql.expression.HasPrefixes¶
-
-
method
sqlalchemy.sql.expression.HasPrefixes.prefix_with(*prefixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ 在语句关键字(即 SELECT、INSERT、UPDATE 或 DELETE)之后添加一个或多个表达式。生成式。
这用于支持后端特定的前缀关键字,例如 MySQL 提供的那些关键字。
例如:
stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints stmt = select(table).prefix_with("/*+ BKA(t1) */", dialect="mysql")
可以通过多次调用
HasPrefixes.prefix_with()来指定多个前缀。- 参数:
*prefixes¶ – 文本或
ClauseElement构造,将在 INSERT、UPDATE 或 DELETE 关键字之后呈现。dialect¶ – 可选的字符串方言名称,它将此前缀的呈现限制为仅该方言。
-
method
- class sqlalchemy.sql.expression.HasSuffixes¶
-
-
method
sqlalchemy.sql.expression.HasSuffixes.suffix_with(*suffixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ 在整个语句之后添加一个或多个表达式。
这用于支持某些构造上的后端特定后缀关键字。
例如:
stmt = ( select(col1, col2) .cte() .suffix_with( "cycle empno set y_cycle to 1 default 0", dialect="oracle" ) )
可以通过多次调用
HasSuffixes.suffix_with()来指定多个后缀。- 参数:
*suffixes¶ – 文本或
ClauseElement构造,将在目标子句之后呈现。dialect¶ – 可选的字符串方言名称,它将此后缀的呈现限制为仅该方言。
-
method
- class sqlalchemy.sql.expression.Join¶
表示两个
FromClause元素之间的JOIN构造。Join的公共构造函数是模块级别的join()函数,以及任何FromClause(例如Table)的FromClause.join()方法。类签名
class
sqlalchemy.sql.expression.Join(sqlalchemy.sql.roles.DMLTableRole,sqlalchemy.sql.expression.FromClause)-
method
sqlalchemy.sql.expression.Join.__init__(left: _FromClauseArgument, right: _FromClauseArgument, onclause: _OnClauseArgument | None = None, isouter: bool = False, full: bool = False)¶ 构造一个新的
Join。通常的入口点是
join()函数或任何FromClause对象的FromClause.join()方法。
-
attribute
sqlalchemy.sql.expression.Join.description¶
-
method
sqlalchemy.sql.expression.Join.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
FromClause“派生自”给定的FromClause,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.Join.select() → Select¶ -
例如:
stmt = table_a.join(table_b, table_a.c.id == table_b.c.a_id) stmt = stmt.select()
以上将生成类似于以下的 SQL 字符串
SELECT table_a.id, table_a.col, table_b.id, table_b.a_id FROM table_a JOIN table_b ON table_a.id = table_b.a_id
-
method
sqlalchemy.sql.expression.Join.self_group(against: OperatorType | None = None) → FromGrouping¶ 对此
ClauseElement应用 ‘grouping’(分组)。此方法被子类重写以返回 “grouping” 构造,即括号。特别是,当 “binary” 表达式放置到更大的表达式中时,以及当
select()构造放置到另一个select()的 FROM 子句中时,它用于在其周围提供分组。(请注意,子查询通常应使用Select.alias()方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()的应用是自动的 - 最终用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此,例如,在像x OR (y AND z)这样的表达式中,可能不需要括号 - AND 的优先级高于 OR。self_group()的基本方法ClauseElement仅返回 self。
-
method
- class sqlalchemy.sql.expression.Lateral¶
表示横向子查询。
此对象从
lateral()模块级函数以及所有FromClause子类上可用的FromClause.lateral()方法构造。虽然 LATERAL 是 SQL 标准的一部分,但目前只有较新的 PostgreSQL 版本提供对此关键字的支持。
另请参阅
LATERAL 关联 - 用法概述。
类签名
class
sqlalchemy.sql.expression.Lateral(sqlalchemy.sql.expression.FromClauseAlias,sqlalchemy.sql.expression.LateralFromClause)-
attribute
sqlalchemy.sql.expression.Lateral.inherit_cache: bool | None = True¶ 指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
attribute
- class sqlalchemy.sql.expression.ReturnsRows¶
核心构造的最基本类,这些构造具有可以表示行的列的概念。
虽然 SELECT 语句和 TABLE 是我们在此类别中首先想到的,但像 INSERT、UPDATE 和 DELETE 这样的 DML 也可以指定 RETURNING,这意味着它们可以用于 CTE 和其他形式,并且 PostgreSQL 也有返回行的函数。
1.4 版本新增。
类签名
class
sqlalchemy.sql.expression.ReturnsRows(sqlalchemy.sql.roles.ReturnsRowsRole,sqlalchemy.sql.expression.DQLDMLClauseElement)-
attribute
sqlalchemy.sql.expression.ReturnsRows.exported_columns¶ 一个
ColumnCollection,表示此ReturnsRows的 “导出” 列。“导出” 列表示由该 SQL 构造呈现的
ColumnElement表达式的集合。主要种类是 FROM 子句的 “FROM 子句列”,例如表、连接或子查询,“SELECTed 列”,即 SELECT 语句的 “列子句” 中的列,以及 DML 语句中的 RETURNING 列。1.4 版本新增。
-
method
sqlalchemy.sql.expression.ReturnsRows.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
attribute
- class sqlalchemy.sql.expression.ScalarSelect¶
表示标量子查询。
通过调用
SelectBase.scalar_subquery()方法创建ScalarSelect。然后,该对象作为ColumnElement层级结构中的 SQL 列表达式参与其他 SQL 表达式。类签名
class
sqlalchemy.sql.expression.ScalarSelect(sqlalchemy.sql.roles.InElementRole,sqlalchemy.sql.expression.Generative,sqlalchemy.sql.expression.GroupedElement,sqlalchemy.sql.expression.ColumnElement)-
method
sqlalchemy.sql.expression.ScalarSelect.correlate(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 返回一个新的
ScalarSelect,它将给定的 FROM 子句与封闭的Select相关联。此方法从底层
Select的Select.correlate()方法镜像而来。该方法应用 :meth:_sql.Select.correlate` 方法,然后针对该语句返回一个新的ScalarSelect。New in version 1.4: 之前,
ScalarSelect.correlate()方法仅可从Select获取。- 参数:
*fromclauses¶ – 一个或多个
FromClause构造,或其他兼容构造(即 ORM 映射的类)的列表,以成为关联集合的一部分。
-
method
sqlalchemy.sql.expression.ScalarSelect.correlate_except(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 返回一个新的
ScalarSelect,它将从自动关联过程中省略给定的 FROM 子句。此方法从底层
Select的Select.correlate_except()方法镜像而来。该方法应用 :meth:_sql.Select.correlate_except` 方法,然后针对该语句返回一个新的ScalarSelect。New in version 1.4: 之前,
ScalarSelect.correlate_except()方法仅可从Select获取。- 参数:
*fromclauses¶ – 一个或多个
FromClause构造,或其他兼容构造(即 ORM 映射的类)的列表,以成为关联异常集合的一部分。
-
attribute
sqlalchemy.sql.expression.ScalarSelect.inherit_cache: bool | None = True¶ 指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
method
sqlalchemy.sql.expression.ScalarSelect.self_group(against: OperatorType | None = None) → Self¶ 对此
ClauseElement应用 ‘grouping’(分组)。此方法被子类重写以返回 “grouping” 构造,即括号。特别是,当 “binary” 表达式放置到更大的表达式中时,以及当
select()构造放置到另一个select()的 FROM 子句中时,它用于在其周围提供分组。(请注意,子查询通常应使用Select.alias()方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()的应用是自动的 - 最终用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此,例如,在像x OR (y AND z)这样的表达式中,可能不需要括号 - AND 的优先级高于 OR。self_group()的基本方法ClauseElement仅返回 self。
-
method
sqlalchemy.sql.expression.ScalarSelect.where(crit: _ColumnExpressionArgument[bool]) → Self¶ 将 WHERE 子句应用于此
ScalarSelect引用的 SELECT 语句。
-
method
- class sqlalchemy.sql.expression.Select¶
表示
SELECT语句。Select对象通常使用select()函数构造。有关详细信息,请参见该函数。成员
__init__(), add_columns(), add_cte(), alias(), as_scalar(), c, column(), column_descriptions, columns_clause_froms, correlate(), correlate_except(), corresponding_column(), cte(), distinct(), except_(), except_all(), execution_options(), exists(), exported_columns, fetch(), filter(), filter_by(), from_statement(), froms, get_children(), get_execution_options(), get_final_froms(), get_label_style(), group_by(), having(), inherit_cache, inner_columns, intersect(), intersect_all(), is_derived_from(), join(), join_from(), label(), lateral(), limit(), offset(), options(), order_by(), outerjoin(), outerjoin_from(), prefix_with(), reduce_columns(), replace_selectable(), scalar_subquery(), select(), select_from(), selected_columns, self_group(), set_label_style(), slice(), subquery(), suffix_with(), union(), union_all(), where(), whereclause, with_for_update(), with_hint(), with_only_columns(), with_statement_hint()
类签名
class
sqlalchemy.sql.expression.Select(sqlalchemy.sql.expression.HasPrefixes,sqlalchemy.sql.expression.HasSuffixes,sqlalchemy.sql.expression.HasHints,sqlalchemy.sql.expression.HasCompileState,sqlalchemy.sql.expression._SelectFromElements,sqlalchemy.sql.expression.GenerativeSelect,sqlalchemy.sql.expression.TypedReturnsRows)-
method
sqlalchemy.sql.expression.Select.__init__(*entities: _ColumnsClauseArgument[Any])¶ 构造一个新的
Select。
-
方法
sqlalchemy.sql.expression.Select.add_columns(*entities: _ColumnsClauseArgument[Any]) → Select[Any]¶ 返回一个新的
select()构造,其中给定的实体附加到其列子句中。例如:
my_select = my_select.add_columns(table.c.new_column)
列子句中的原始表达式保持不变。要用新的表达式替换原始表达式,请参阅方法
Select.with_only_columns()。- 参数:
*entities¶ – 要添加到列子句的列、表或其他实体表达式
-
方法
sqlalchemy.sql.expression.Select.add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ inherited from the
HasCTE.add_cte()method ofHasCTE向此语句添加一个或多个
CTE构造。此方法会将给定的
CTE构造与父语句关联起来,以便它们在最终语句的 WITH 子句中被无条件地呈现,即使在该语句或任何子选择中的其他地方没有被引用。可选的
HasCTE.add_cte.nest_here参数设置为 True 时,将使每个给定的CTE在与此语句直接一起呈现的 WITH 子句中呈现,而不是被移动到最终呈现的语句的顶部,即使此语句在更大的语句中呈现为子查询。此方法有两个一般用途。一种是嵌入 CTE 语句,这些语句在没有被显式引用的情况下服务于某些目的,例如将 DML 语句(如 INSERT 或 UPDATE)作为 CTE 嵌入到可能间接从其结果中提取数据的主语句中。另一种是提供对特定系列 CTE 构造的精确位置的控制,这些构造应保持直接根据可能嵌套在较大语句中的特定语句呈现。
例如:
from sqlalchemy import table, column, select t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
将会呈现
WITH anon_1 AS ( INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) ) SELECT t.c1, t.c2 FROM t
在上面,“anon_1” CTE 在 SELECT 语句中没有被引用,但仍然完成了运行 INSERT 语句的任务。
类似地,在 DML 相关的上下文中,使用 PostgreSQL
Insert构造来生成 “upsert”from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
上面的语句呈现为
WITH deletions AS ( DELETE FROM t WHERE t.c1 < %(c1_1)s ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
1.4.21 版本新增。
- 参数:
*ctes¶ –
零个或多个
CTE构造。Changed in version 2.0: 接受多个 CTE 实例
nest_here¶ –
如果为 True,则给定的 CTE 或 CTEs 将被呈现,就好像它们在添加到此
HasCTE时,将HasCTE.cte.nesting标志指定为True。 假设给定的 CTEs 在外部封闭语句中也没有被引用,则当给定此标志时,给定的 CTEs 应在此语句的级别呈现。2.0 版本新增。
另请参阅
-
方法
sqlalchemy.sql.expression.Select.alias(name: str | None = None, flat: bool = False) → Subquery¶ inherited from the
SelectBase.alias()method ofSelectBase返回针对此
SelectBase的命名子查询。对于
SelectBase(而不是FromClause),这将返回一个Subquery对象,其行为与用于FromClause的Alias对象基本相同。Changed in version 1.4:
SelectBase.alias()方法现在是SelectBase.subquery()方法的同义词。
-
方法
sqlalchemy.sql.expression.Select.as_scalar() → ScalarSelect[Any]¶ inherited from the
SelectBase.as_scalar()method ofSelectBaseDeprecated since version 1.4:
SelectBase.as_scalar()方法已弃用,并将在未来的版本中删除。请参考SelectBase.scalar_subquery()。
-
属性
sqlalchemy.sql.expression.Select.c¶ inherited from the
SelectBase.cattribute ofSelectBaseDeprecated since version 1.4:
SelectBase.c和SelectBase.columns属性已弃用,并将在未来的版本中删除;这些属性隐式地创建一个子查询,该子查询应该是显式的。请首先调用SelectBase.subquery()以创建一个子查询,然后该子查询包含此属性。要访问此 SELECT 对象从中 SELECT 的列,请使用SelectBase.selected_columns属性。
-
方法
sqlalchemy.sql.expression.Select.column(column: _ColumnsClauseArgument[Any]) → Select[Any]¶ 返回一个新的
select()构造,其中给定的列表达式添加到其列子句中。自版本 1.4 起已弃用:
Select.column()方法已弃用,并将在未来的版本中移除。请使用Select.add_columns()例如:
my_select = my_select.column(table.c.new_column)
有关添加/替换
Select对象的列的指南,请参阅Select.with_only_columns()的文档。
-
属性
sqlalchemy.sql.expression.Select.column_descriptions¶ 返回一个 插件启用 的 “列描述” 结构,该结构引用此语句 SELECT 的列。
此属性通常在使用 ORM 时很有用,因为会返回包含有关映射实体的扩展结构的属性。 从启用 ORM 的 SELECT 和 DML 语句中检查实体和列 部分包含更多背景信息。
对于仅 Core 的语句,此访问器返回的结构源自
Select.selected_columns访问器返回的相同对象,格式化为字典列表,其中包含键name、type和expr,这些键指示要选择的列表达式>>> stmt = select(user_table) >>> stmt.column_descriptions [ { 'name': 'id', 'type': Integer(), 'expr': Column('id', Integer(), ...)}, { 'name': 'name', 'type': String(length=30), 'expr': Column('name', String(length=30), ...)} ]
在版本 1.4.33 中更改:
Select.column_descriptions属性返回一个仅 Core 实体集的结构,而不仅仅是仅 ORM 实体。另请参阅
UpdateBase.entity_description-insert()、update()或delete()的实体信息从启用 ORM 的 SELECT 和 DML 语句中检查实体和列 - ORM 背景
-
属性
sqlalchemy.sql.expression.Select.columns_clause_froms¶ 返回此 SELECT 语句的列子句隐含的
FromClause对象集。1.4.23 版本新增。
-
方法
sqlalchemy.sql.expression.Select.correlate(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 返回一个新的
Select,它会将给定的 FROM 子句与封闭的Select的 FROM 子句相关联。调用此方法会关闭
Select对象的 “自动关联” 默认行为。通常,通过其 WHERE 子句、ORDER BY、HAVING 或 列子句 出现在封闭此Select的Select中的 FROM 元素将从此Select对象的 FROM 子句 中省略。使用Select.correlate()方法设置显式关联集合提供了一个固定的 FROM 对象列表,这些对象可能会在此过程中发生。当使用
Select.correlate()应用特定的 FROM 子句进行关联时,无论此Select对象相对于引用相同 FROM 对象的封闭Select嵌套有多深,FROM 元素都将成为关联的候选对象。这与 “自动关联” 的行为相反,后者仅与直接封闭的Select关联。多级关联确保封闭Select和封闭Select之间的链接始终至少通过一个 WHERE/ORDER BY/HAVING/列子句,以便进行关联。如果传递
None,则Select对象将不关联其任何 FROM 条目,并且所有条目都将在本地 FROM 子句中无条件呈现。- 参数:
*fromclauses¶ – 一个或多个
FromClause或其他与 FROM 兼容的构造(例如 ORM 映射实体)以成为关联集合的一部分;或者传递单个值None以删除所有现有关联。
-
方法
sqlalchemy.sql.expression.Select.correlate_except(*fromclauses: Literal[None, False] | _FromClauseArgument) → Self¶ 返回一个新的
Select,它将从自动关联过程中省略给定的 FROM 子句。调用
Select.correlate_except()会关闭给定 FROM 元素的Select对象的 “自动关联” 默认行为。 此处指定的元素将无条件地出现在 FROM 列表中,而所有其他 FROM 元素仍受正常的自动关联行为约束。如果传递
None,或者没有传递任何参数,则Select对象将关联其所有 FROM 条目。- 参数:
*fromclauses¶ – 一个或多个
FromClause构造的列表,或其他兼容的构造(即 ORM 映射类)以成为关联异常集合的一部分。
-
方法
sqlalchemy.sql.expression.Select.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ inherited from the
Selectable.corresponding_column()method ofSelectable给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 要匹配的目标
ColumnElement。require_embedded¶ – 仅当给定的
ColumnElement实际存在于此Selectable的子元素中时,才返回给定ColumnElement的对应列。 通常,如果该列仅与此Selectable的导出列之一共享一个公共祖先,则该列将匹配。
另请参阅
-
方法
sqlalchemy.sql.expression.Select.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ inherited from the
HasCTE.cte()method ofHasCTE返回一个新的
CTE,或通用表表达式实例。公共表表达式是一种 SQL 标准,其中 SELECT 语句可以利用与主语句一起指定的辅助语句,使用名为 “WITH” 的子句。 关于 UNION 的特殊语义也可以用于允许 “递归” 查询,其中 SELECT 语句可以利用先前已选择的行集。
CTE 也可以应用于某些数据库上的 DML 构造 UPDATE、INSERT 和 DELETE,既可以作为与 RETURNING 结合使用的 CTE 行的来源,也可以作为 CTE 行的使用者。
SQLAlchemy 检测
CTE对象,这些对象被视为类似于Alias对象,作为要传递到语句的 FROM 子句以及语句顶部的 WITH 子句的特殊元素。对于 PostgreSQL “MATERIALIZED” 和 “NOT MATERIALIZED” 等特殊前缀,可以使用
CTE.prefix_with()方法来建立这些前缀。Changed in version 1.3.13: 添加了对前缀的支持。特别是 - MATERIALIZED 和 NOT MATERIALIZED。
- 参数:
name¶ – 赋予公用表表达式的名称。 与
FromClause.alias()类似,名称可以保留为None,在这种情况下,将在查询编译时使用匿名符号。recursive¶ – 如果为
True,将呈现WITH RECURSIVE。 递归公用表表达式旨在与 UNION ALL 结合使用,以便从已选择的行中派生行。nesting¶ –
如果为
True,则将 CTE 本地呈现到引用它的语句中。 对于更复杂的情况,也可以使用HasCTE.add_cte()方法,并结合HasCTE.add_cte.nest_here参数,以更仔细地控制特定 CTE 的确切位置。1.4.24 版本新增。
另请参阅
以下示例包括两个来自 PostgreSQL 文档的示例,网址为 https://postgresql.ac.cn/docs/current/static/queries-with.html,以及其他示例。
示例 1,非递归
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() orders = Table( "orders", metadata, Column("region", String), Column("amount", Integer), Column("product", String), Column("quantity", Integer), ) regional_sales = ( select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) .group_by(orders.c.region) .cte("regional_sales") ) top_regions = ( select(regional_sales.c.region) .where( regional_sales.c.total_sales > select(func.sum(regional_sales.c.total_sales) / 10) ) .cte("top_regions") ) statement = ( select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales"), ) .where(orders.c.region.in_(select(top_regions.c.region))) .group_by(orders.c.region, orders.c.product) ) result = conn.execute(statement).fetchall()
示例 2,WITH RECURSIVE
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() parts = Table( "parts", metadata, Column("part", String), Column("sub_part", String), Column("quantity", Integer), ) included_parts = ( select(parts.c.sub_part, parts.c.part, parts.c.quantity) .where(parts.c.part == "our part") .cte(recursive=True) ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
示例 3,使用 UPDATE 和 INSERT 以及 CTE 的 upsert
from datetime import date from sqlalchemy import ( MetaData, Table, Column, Integer, Date, select, literal, and_, exists, ) metadata = MetaData() visitors = Table( "visitors", metadata, Column("product_id", Integer, primary_key=True), Column("date", Date, primary_key=True), Column("count", Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where( and_(visitors.c.product_id == product_id, visitors.c.date == day) ) .values(count=visitors.c.count + count) .returning(literal(1)) .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)).where( ~exists(update_cte.select()) ), ) connection.execute(upsert)
示例 4,嵌套 CTE (SQLAlchemy 1.4.24 及更高版本)
value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte( "value_a", nesting=True ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
上面的查询将呈现嵌套在第一个 CTE 内的第二个 CTE,如下所示,带有内联参数:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
可以使用
HasCTE.add_cte()方法设置相同的 CTE,如下所示(SQLAlchemy 2.0 及更高版本):value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n) .add_cte(value_a_nested, nest_here=True) .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
示例 5,非线性 CTE (SQLAlchemy 1.4.28 及更高版本)
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
上面的查询将在递归 CTE 内部呈现 2 个 UNION:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
另请参阅
Query.cte()-HasCTE.cte()的 ORM 版本。
-
方法
sqlalchemy.sql.expression.Select.distinct(*expr: _ColumnExpressionArgument[Any]) → Self¶ 返回一个新的
select()构造,它将对整个 SELECT 语句应用 DISTINCT。例如:
from sqlalchemy import select stmt = select(users_table.c.id, users_table.c.name).distinct()
以上将生成类似于以下内容的语句
SELECT DISTINCT user.id, user.name FROM user
该方法还接受
*expr参数,该参数生成 PostgreSQL 方言特定的DISTINCT ON表达式。 在不支持此语法的其他后端上使用此参数将引发错误。- 参数:
*expr¶ –
可选的列表达式。 存在时,PostgreSQL 方言将呈现
DISTINCT ON (<expressions>)构造。 在其他后端上,将引发弃用警告和/或CompileError。自版本 1.4 起已弃用: 在其他方言中使用 *expr 已弃用,并且在未来的版本中将引发
CompileError。
-
方法
sqlalchemy.sql.expression.Select.except_(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象之间的 SQL
EXCEPT。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
-
方法
sqlalchemy.sql.expression.Select.except_all(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象之间的 SQL
EXCEPT ALL。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
-
方法
sqlalchemy.sql.expression.Select.execution_options(**kw: Any) → Self¶ inherited from the
Executable.execution_options()method ofExecutable为此语句设置在执行期间生效的非 SQL 选项。
可以使用多种作用域设置执行选项,包括每个语句、每个连接或每次执行,使用
Connection.execution_options()等方法,以及接受选项字典的参数,例如Connection.execute.execution_options和Session.execute.execution_options。执行选项的主要特征是,与其他类型的选项(如 ORM 加载程序选项)相比,执行选项永远不会影响查询的已编译 SQL,只会影响 SQL 语句本身的调用方式或结果的提取方式。 也就是说,执行选项不是 SQL 编译所容纳内容的一部分,也不被视为语句的缓存状态的一部分。
Executable.execution_options()方法是 generative 的,应用于Engine和Query对象的方法也是如此,这意味着当调用该方法时,将返回对象的副本,该副本将给定的参数应用于该新副本,但保持原始对象不变statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
此行为的一个例外是
Connection对象,其中Connection.execution_options()方法明确地不是 generative 的。可以传递给
Executable.execution_options()和其他相关方法和参数字典的选项类型包括 SQLAlchemy Core 或 ORM 显式使用的参数,以及 SQLAlchemy 未定义的任意关键字参数,这意味着这些方法和/或参数字典可以用于与自定义代码交互的用户定义的参数,自定义代码可以使用Executable.get_execution_options()和Connection.get_execution_options()等方法访问这些参数,或者在选定的事件挂钩中使用专用的execution_options事件参数,例如ConnectionEvents.before_execute.execution_options或ORMExecuteState.execution_options,例如:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
在 SQLAlchemy 显式识别的选项范围内,大多数选项适用于特定类别的对象,而不适用于其他对象。 最常见的执行选项包括
Connection.execution_options.isolation_level- 通过Engine设置连接或一类连接的隔离级别。 此选项仅被Connection或Engine接受。Connection.execution_options.stream_results- 指示应使用服务器端游标获取结果;此选项被Connection、Connection.execute.execution_options参数(在Connection.execute()上)以及 SQL 语句对象上的Executable.execution_options()接受,并且还被 ORM 构造(如Session.execute())接受。Connection.execution_options.compiled_cache- 指示一个字典,该字典将充当 SQL 编译缓存,用于Connection或Engine,以及 ORM 方法(如Session.execute())。 可以作为None传递以禁用语句的缓存。 此选项不被Executable.execution_options()接受,因为不建议在语句对象中携带编译缓存。Connection.execution_options.schema_translate_map- 模式转换映射 功能使用的模式名称映射,被Connection,Engine,Executable以及 ORM 构造(如Session.execute())接受。
另请参阅
Connection.execution_options()Connection.execute.execution_optionsSession.execute.execution_optionsORM 执行选项 - 关于所有 ORM 特定的执行选项的文档
-
方法
sqlalchemy.sql.expression.Select.exists() → Exists¶ 继承自
SelectBase.exists()方法,该方法属于SelectBase返回此 selectable 的
Exists表示形式,可用作列表达式。返回的对象是
Exists的实例。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.Select.exported_columns¶ 继承自
SelectBase.exported_columns属性,该属性属于SelectBase一个
ColumnCollection,表示此Selectable的 “导出” 列,不包括TextClause构造。对于
SelectBase对象,“导出” 列与SelectBase.selected_columns集合同义。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.Select.fetch(count: _LimitOffsetType, with_ties: bool = False, percent: bool = False) → Self¶ 继承自
GenerativeSelect.fetch()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 FETCH FIRST 条件。
这是一个数值,通常在生成的 select 中呈现为
FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}表达式。此功能目前在 Oracle Database、PostgreSQL、MSSQL 中实现。使用
GenerativeSelect.offset()来指定偏移量。注意
GenerativeSelect.fetch()方法将替换任何使用GenerativeSelect.limit()应用的子句。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.Select.filter(*criteria: _ColumnExpressionArgument[bool]) → Self¶ Select.where()方法的同义词。
-
方法
sqlalchemy.sql.expression.Select.filter_by(**kwargs: Any) → Self¶ 将给定的过滤条件作为 WHERE 子句应用于此 select。
-
method
sqlalchemy.sql.expression.Select.from_statement(statement: ReturnsRowsRole) → ExecutableReturnsRows¶ 将此
Select将要选择的列应用到另一个语句。此操作是 插件特定的,如果此
Select未从启用插件的实体中选择,则会引发不支持的异常。该语句通常是
text()或select()构造,并且应返回与此Select表示的实体相对应的列集合。另请参阅
从文本语句获取 ORM 结果 - ORM 查询指南中的用法示例
-
attribute
sqlalchemy.sql.expression.Select.froms¶ 返回显示的
FromClause元素列表。Deprecated since version 1.4.23:
Select.froms属性已移动到Select.get_final_froms()方法。
-
method
sqlalchemy.sql.expression.Select.get_children(**kw: Any) → Iterable[ClauseElement]¶ 返回此
HasTraverseInternals的直接子HasTraverseInternals元素。这用于访问遍历。
**kw 可能包含更改返回集合的标志,例如,为了减少更大的遍历,或从不同的上下文(例如模式级别集合而不是子句级别)返回子项。
-
method
sqlalchemy.sql.expression.Select.get_execution_options() → _ExecuteOptions¶ 继承自
Executable.get_execution_options()方法,该方法属于Executable获取将在执行期间生效的非 SQL 选项。
1.3 版本新增。
-
method
sqlalchemy.sql.expression.Select.get_final_froms() → Sequence[FromClause]¶ 计算最终显示的
FromClause元素列表。此方法将运行完成确定将在结果 SELECT 语句中显示的 FROM 元素所需的完整计算,包括使用 JOIN 对象遮蔽单个表,以及包括预加载子句的 ORM 用例的完整计算。
对于 ORM 用途,此访问器返回 编译后 的 FROM 对象列表;此集合将包括诸如预加载表和连接之类的元素。这些对象将不是 ORM 启用的,并且不能替代
Select.select_froms()集合;此外,该方法对于 ORM 启用的语句性能不佳,因为它将导致完整的 ORM 构造过程。要检索最初传递给
Select的“columns”集合隐含的 FROM 列表,请使用Select.columns_clause_froms访问器。要在保持 FROM 列表的同时从另一组列中选择,请使用
Select.with_only_columns()方法并传递Select.with_only_columns.maintain_column_froms参数。New in version 1.4.23: -
Select.get_final_froms()方法取代了之前的Select.froms访问器,后者已被弃用。
-
method
sqlalchemy.sql.expression.Select.get_label_style() → SelectLabelStyle¶ 继承自
GenerativeSelect.get_label_style()方法,该方法属于GenerativeSelect检索当前标签样式。
1.4 版本新增。
-
method
sqlalchemy.sql.expression.Select.group_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 继承自
GenerativeSelect.group_by()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 GROUP BY 条件列表。
可以通过传递
None来抑制所有现有的 GROUP BY 设置。例如:
stmt = select(table.c.name, func.max(table.c.stat)).group_by(table.c.name)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 GROUP BY 子句。
-
method
sqlalchemy.sql.expression.Select.having(*having: _ColumnExpressionArgument[bool]) → Self¶ 返回一个新的
select()构造,其中给定的表达式已添加到其 HAVING 子句中,并通过 AND 连接到现有子句(如果有)。
-
attribute
sqlalchemy.sql.expression.Select.inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache属性,来自HasCacheKey指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
attribute
sqlalchemy.sql.expression.Select.inner_columns¶ 将呈现到结果 SELECT 语句的 columns 子句中的所有
ColumnElement表达式的迭代器。此方法在 1.4 版本中已过时,已被
Select.exported_columns集合取代。
-
method
sqlalchemy.sql.expression.Select.intersect(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象的 SQL
INTERSECT。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
**kwargs¶ – 关键字参数将转发到新创建的
CompoundSelect对象的构造函数。
-
method
sqlalchemy.sql.expression.Select.intersect_all(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象的 SQL
INTERSECT ALL。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
**kwargs¶ – 关键字参数将转发到新创建的
CompoundSelect对象的构造函数。
-
method
sqlalchemy.sql.expression.Select.is_derived_from(fromclause: FromClause | None) → bool¶ 如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.Select.join(target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, isouter: bool = False, full: bool = False) → Self¶ 在此
Select对象的条件上创建 SQL JOIN,并以生成方式应用,返回新生成的结果Select。例如:
stmt = select(user_table).join( address_table, user_table.c.id == address_table.c.user_id )
以上语句生成的 SQL 类似于
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
Changed in version 1.4:
Select.join()现在创建一个Join对象,该对象位于现有 SELECT 的 FROM 子句中的FromClause源和给定的目标FromClause之间,然后将此Join添加到新生成的 SELECT 语句的 FROM 子句中。这与 1.3 中的行为完全不同,1.3 中的行为会创建一个整个Select的子查询,然后将该子查询连接到目标。这是一个向后不兼容的更改,因为先前的行为大多是无用的,在任何情况下都会产生大多数数据库拒绝的未命名子查询。新行为模仿了非常成功的 ORM 中的
Query.join()方法,以便在使用带有Session的Select对象时支持Query的功能可用。请参阅 select().join() 和 outerjoin() 将 JOIN 条件添加到当前查询,而不是创建子查询 中有关此更改的说明。
- 参数:
target¶ – 要连接的目标表
onclause¶ – join 的 ON 子句。如果省略,则根据两个表之间的
ForeignKey关联自动生成 ON 子句(如果可以明确确定),否则会引发错误。isouter¶ – 如果为 True,则生成 LEFT OUTER join。与
Select.outerjoin()相同。full¶ – 如果为 True,则生成 FULL OUTER join。
-
method
sqlalchemy.sql.expression.Select.join_from(from_: _FromClauseArgument, target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, isouter: bool = False, full: bool = False) → Self¶ 在此
Select对象的条件上创建 SQL JOIN,并以生成方式应用,返回新生成的结果Select。例如:
stmt = select(user_table, address_table).join_from( user_table, address_table, user_table.c.id == address_table.c.user_id )
以上语句生成的 SQL 类似于
SELECT user.id, user.name, address.id, address.email, address.user_id FROM user JOIN address ON user.id = address.user_id
1.4 版本新增。
- 参数:
from_¶ – 连接的左侧,将在 FROM 子句中呈现,并且大致等同于使用
Select.select_from()方法。target¶ – 要连接的目标表
onclause¶ – join 的 ON 子句。
isouter¶ – 如果为 True,则生成 LEFT OUTER join。与
Select.outerjoin()相同。full¶ – 如果为 True,则生成 FULL OUTER join。
-
method
sqlalchemy.sql.expression.Select.label(name: str | None) → Label[Any]¶ 继承自
SelectBase.label()方法,该方法属于SelectBase返回此 selectable 的 “标量” 表示形式,嵌入为带有标签的子查询。
-
method
sqlalchemy.sql.expression.Select.lateral(name: str | None = None) → LateralFromClause¶ 继承自
SelectBase.lateral()方法,该方法属于SelectBase返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
method
sqlalchemy.sql.expression.Select.limit(limit: _LimitOffsetType) → Self¶ 继承自
GenerativeSelect.limit()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 LIMIT 条件。
这是一个数值,通常在生成的 select 中呈现为
LIMIT表达式。不支持LIMIT的后端将尝试提供类似的功能。注意
GenerativeSelect.limit()方法将替换任何使用GenerativeSelect.fetch()应用的子句。- 参数:
limit¶ – 整数 LIMIT 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
method
sqlalchemy.sql.expression.Select.offset(offset: _LimitOffsetType) → Self¶ 继承自
GenerativeSelect.offset()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 OFFSET 条件。
这是一个数值,通常在生成的 select 中呈现为
OFFSET表达式。不支持OFFSET的后端将尝试提供类似的功能。- 参数:
offset¶ – 整数 OFFSET 参数,或提供整数结果的 SQL 表达式。传递
None以重置它。
-
方法
sqlalchemy.sql.expression.Select.options(*options: ExecutableOption) → Self¶ 继承自
Executable.options()方法,该方法属于Executable将选项应用于此语句。
从广义上讲,选项是任何可以被语句的 SQL 编译器解释的 Python 对象。这些选项可以被特定的方言或特定类型的编译器使用。
最常见的选项类型是 ORM 级别的选项,它将 “急切加载” 和其他加载行为应用于 ORM 查询。然而,理论上选项可以用于许多其他目的。
有关特定语句类型的特定选项类型的背景信息,请参阅这些选项对象的文档。
在 1.4 版本中更改: - 向 Core 语句对象添加了
Executable.options(),旨在实现统一的 Core / ORM 查询功能。
-
方法
sqlalchemy.sql.expression.Select.order_by(_GenerativeSelect__first: Literal[None, _NoArg.NO_ARG] | _ColumnExpressionOrStrLabelArgument[Any] = _NoArg.NO_ARG, *clauses: _ColumnExpressionOrStrLabelArgument[Any]) → Self¶ 继承自
GenerativeSelect.order_by()方法,该方法属于GenerativeSelect返回一个新的 selectable,应用了给定的 ORDER BY 条件列表。
例如:
stmt = select(table).order_by(table.c.id, table.c.name)
多次调用此方法等同于使用所有连接的子句调用一次。可以通过单独传递
None来取消所有现有的 ORDER BY 条件。然后可以通过再次调用Query.order_by()来添加新的 ORDER BY 条件,例如# will erase all ORDER BY and ORDER BY new_col alone stmt = stmt.order_by(None).order_by(new_col)
- 参数:
*clauses¶ – 一系列
ColumnElement构造,将用于生成 ORDER BY 子句。
-
方法
sqlalchemy.sql.expression.Select.outerjoin(target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, full: bool = False) → Self¶ 创建左外连接。
参数与
Select.join()的参数相同。在版本 1.4 中更改:
Select.outerjoin()现在创建一个Join对象,该对象位于现有 SELECT 的 FROM 子句中的FromClause源和给定的目标FromClause之间,然后将此Join添加到新生成的 SELECT 语句的 FROM 子句中。这与 1.3 中的行为完全不同,1.3 中的行为会创建一个整个Select的子查询,然后将该子查询连接到目标。这是一个向后不兼容的更改,因为先前的行为大多是无用的,在任何情况下都会产生大多数数据库拒绝的未命名子查询。新行为模仿了非常成功的 ORM 中的
Query.join()方法,以便在使用带有Session的Select对象时支持Query的功能可用。请参阅 select().join() 和 outerjoin() 将 JOIN 条件添加到当前查询,而不是创建子查询 中有关此更改的说明。
-
方法
sqlalchemy.sql.expression.Select.outerjoin_from(from_: _FromClauseArgument, target: _JoinTargetArgument, onclause: _OnClauseArgument | None = None, *, full: bool = False) → Self¶ 针对此
Select对象的条件创建 SQL LEFT OUTER JOIN,并以生成方式应用,返回新生成的Select。用法与
Select.join_from()的用法相同。
-
方法
sqlalchemy.sql.expression.Select.prefix_with(*prefixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ 继承自
HasPrefixes.prefix_with()方法,属于HasPrefixes在语句关键字(即 SELECT、INSERT、UPDATE 或 DELETE)之后添加一个或多个表达式。生成式。
这用于支持后端特定的前缀关键字,例如 MySQL 提供的那些关键字。
例如:
stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints stmt = select(table).prefix_with("/*+ BKA(t1) */", dialect="mysql")
可以通过多次调用
HasPrefixes.prefix_with()来指定多个前缀。- 参数:
*prefixes¶ – 文本或
ClauseElement构造,将在 INSERT、UPDATE 或 DELETE 关键字之后呈现。dialect¶ – 可选的字符串方言名称,它将限制此前缀仅呈现给该方言。
-
方法
sqlalchemy.sql.expression.Select.reduce_columns(only_synonyms: bool = True) → Select¶ 返回一个新的
select()构造,其中从 columns 子句中删除了冗余命名、等效值的列。“冗余” 此处指的是两个列,其中一个列基于外键或通过语句的 WHERE 子句中的简单相等比较来引用另一个列。此方法的主要目的是自动构造一个具有所有唯一命名的列的 select 语句,而无需像
Select.set_label_style()那样使用表限定的标签。当基于外键省略列时,保留被引用的列。当基于 WHERE 等效性省略列时,保留 columns 子句中的第一个列。
- 参数:
only_synonyms¶ – 当为 True 时,将列的删除限制为那些与等效列具有相同名称的列。否则,将删除所有与另一个列等效的列。
-
方法
sqlalchemy.sql.expression.Select.replace_selectable(old: FromClause, alias: Alias) → Self¶ 继承自
Selectable.replace_selectable()方法,该方法属于Selectable替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
方法
sqlalchemy.sql.expression.Select.scalar_subquery() → ScalarSelect[Any]¶ inherited from the
SelectBase.scalar_subquery()method ofSelectBase返回此 selectable 的 ‘scalar’ 表示形式,可以用作列表达式。
返回的对象是
ScalarSelect的一个实例。通常,columns 子句中只有一列的 select 语句有资格用作标量表达式。然后,标量子查询可以在封闭的 SELECT 的 WHERE 子句或 columns 子句中使用。
请注意,标量子查询与可以使用
SelectBase.subquery()方法生成的 FROM 级别子查询区分开来。另请参阅
标量和关联子查询 - 在 2.0 教程中
-
方法
sqlalchemy.sql.expression.Select.select(*arg: Any, **kw: Any) → Select¶ inherited from the
SelectBase.select()method ofSelectBaseDeprecated since version 1.4:
SelectBase.select()方法已弃用,并将在未来的版本中移除;此方法隐式地创建了一个子查询,而这应该是显式的。请先调用SelectBase.subquery()以创建子查询,然后再进行选择。
-
方法
sqlalchemy.sql.expression.Select.select_from(*froms: _FromClauseArgument) → Self¶ 返回一个新的
select()构造,其中给定的 FROM 表达式合并到其 FROM 对象列表中。例如:
table1 = table("t1", column("a")) table2 = table("t2", column("b")) s = select(table1.c.a).select_from( table1.join(table2, table1.c.a == table2.c.b) )
“from” 列表是每个元素标识的唯一集合,因此添加已存在的
Table或其他可选择对象将不起作用。传递引用已存在的Table或其他可选择对象的Join将具有隐藏该可选择对象作为呈现的 FROM 列表中的单个元素的作用,而是将其呈现到 JOIN 子句中。虽然
Select.select_from()的典型目的是使用 join 替换默认的派生 FROM 子句,但在 FROM 子句无法完全从 columns 子句派生的情况下,也可以使用单个表元素多次调用它。select(func.count("*")).select_from(table1)
-
属性
sqlalchemy.sql.expression.Select.selected_columns¶ 一个
ColumnCollection,表示此 SELECT 语句或类似构造在其结果集中返回的列,不包括TextClause构造。此集合与
FromClause.columns的FromClause集合不同,因为此集合中的列不能直接嵌套在另一个 SELECT 语句中;必须首先应用子查询,这为 SQL 所需的必要括号化提供支持。对于
select()构造,此处的集合正是将在 “SELECT” 语句中呈现的内容,并且ColumnElement对象直接存在,就像它们被给定的那样,例如:col1 = column("q", Integer) col2 = column("p", Integer) stmt = select(col1, col2)
在上面,
stmt.selected_columns将是一个包含col1和col2对象的集合。对于针对Table或其他FromClause的语句,该集合将使用ColumnElement对象,这些对象位于 from 元素的FromClause.c集合中。Select.selected_columns集合的一个用例是在添加其他条件时允许引用现有列,例如:def filter_on_id(my_select, id): return my_select.where(my_select.selected_columns["id"] == id) stmt = select(MyModel) # adds "WHERE id=:param" to the statement stmt = filter_on_id(stmt, 42)
注意
Select.selected_columns集合不包括使用text()构造在 columns 子句中建立的表达式;这些表达式会从集合中静默省略。要在Select构造中使用纯文本列表达式,请使用literal_column()构造。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.Select.self_group(against: OperatorType | None = None) → SelectStatementGrouping | Self¶ 按照
ClauseElement规范返回 “分组” 构造。这将生成一个可以嵌入到表达式中的元素。请注意,在构造表达式时,此方法会根据需要自动调用,不需要显式使用。
-
方法
sqlalchemy.sql.expression.Select.set_label_style(style: SelectLabelStyle) → Self¶ -
返回具有指定标签样式的新 selectable。
有三种可用的 “label styles”(标签样式),
SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY,SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL,以及SelectLabelStyle.LABEL_STYLE_NONE。默认样式是SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY。在现代 SQLAlchemy 中,通常不需要更改标签样式,因为通过使用
ColumnElement.label()方法可以更有效地使用每个表达式的标签。在过去的版本中,LABEL_STYLE_TABLENAME_PLUS_COL用于消除来自不同表、别名或子查询的同名列的歧义;较新的LABEL_STYLE_DISAMBIGUATE_ONLY现在仅对与现有名称冲突的名称应用标签,从而使此标签的影响最小化。消除歧义的基本原理主要是为了当创建子查询时,所有列表达式都可从给定的
FromClause.c集合中获得。New in version 1.4: -
GenerativeSelect.set_label_style()方法取代了以前的.apply_labels()、.with_labels()和use_labels=True方法和/或参数的组合。另请参阅
LABEL_STYLE_DISAMBIGUATE_ONLY (仅消除歧义标签样式)LABEL_STYLE_TABLENAME_PLUS_COL (表名加列名标签样式)LABEL_STYLE_NONE (无标签样式)LABEL_STYLE_DEFAULT (默认标签样式)
-
方法
sqlalchemy.sql.expression.Select.slice(start: int, stop: int) → Self¶ inherited from the
GenerativeSelect.slice()method ofGenerativeSelect基于切片对此语句应用 LIMIT / OFFSET。
start 和 stop 索引的行为类似于 Python 内置
range()函数的参数。此方法提供了使用LIMIT/OFFSET获取查询切片的替代方法。例如,
stmt = select(User).order_by(User.id).slice(1, 3)
渲染为
SELECT users.id AS users_id, users.name AS users_name FROM users ORDER BY users.id LIMIT ? OFFSET ? (2, 1)
注意
GenerativeSelect.slice()方法将替换任何使用GenerativeSelect.fetch()应用的子句。New in version 1.4: 添加了从 ORM 泛化的
GenerativeSelect.slice()方法。
-
方法
sqlalchemy.sql.expression.Select.subquery(name: str | None = None) → Subquery¶ inherited from the
SelectBase.subquery()method ofSelectBase返回此
SelectBase的子查询。从 SQL 的角度来看,子查询是一个带括号的、命名的构造,可以放在另一个 SELECT 语句的 FROM 子句中。
给定一个 SELECT 语句,例如
stmt = select(table.c.id, table.c.name)
上面的语句可能看起来像
SELECT table.id, table.name FROM table
子查询形式本身以相同的方式呈现,但是当嵌入到另一个 SELECT 语句的 FROM 子句中时,它将变成一个命名的子元素
subq = stmt.subquery() new_stmt = select(subq)
上面渲染为
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
从历史上看,
SelectBase.subquery()等同于在 FROM 对象上调用FromClause.alias()方法;但是,由于SelectBase对象不是直接的 FROM 对象,因此SelectBase.subquery()方法提供了更清晰的语义。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.Select.suffix_with(*suffixes: _TextCoercedExpressionArgument[Any], dialect: str = '*') → Self¶ 继承自
HasSuffixes.suffix_with()方法,属于HasSuffixes在整个语句之后添加一个或多个表达式。
这用于支持某些构造上的后端特定后缀关键字。
例如:
stmt = ( select(col1, col2) .cte() .suffix_with( "cycle empno set y_cycle to 1 default 0", dialect="oracle" ) )
可以通过多次调用
HasSuffixes.suffix_with()来指定多个后缀。- 参数:
*suffixes¶ – 文本或
ClauseElement构造,将在目标子句之后呈现。dialect¶ – 可选的字符串方言名称,它将限制此后缀仅呈现给该方言。
-
方法
sqlalchemy.sql.expression.Select.union(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象的 SQL
UNION。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
**kwargs¶ – 关键字参数将转发到新创建的
CompoundSelect对象的构造函数。
-
方法
sqlalchemy.sql.expression.Select.union_all(*other: _SelectStatementForCompoundArgument[_TP]) → CompoundSelect[_TP]¶ 返回此 select() 构造与作为位置参数提供的给定可选对象的 SQL
UNION ALL。- 参数:
*other¶ –
用于创建 UNION 的一个或多个元素。
Changed in version 1.4.28: 现在接受多个元素。
**kwargs¶ – 关键字参数将转发到新创建的
CompoundSelect对象的构造函数。
-
method
sqlalchemy.sql.expression.Select.where(*whereclause: _ColumnExpressionArgument[bool]) → Self¶ 返回一个新的
select()构造,其中给定的表达式被添加到其 WHERE 子句中,如果存在现有子句,则通过 AND 连接。
-
attribute
sqlalchemy.sql.expression.Select.whereclause¶ 返回此
Select语句的完整 WHERE 子句。这会将当前 WHERE 条件的集合组装成一个单独的
BooleanClauseList构造。1.4 版本新增。
-
method
sqlalchemy.sql.expression.Select.with_for_update(*, nowait: bool = False, read: bool = False, of: _ForUpdateOfArgument | None = None, skip_locked: bool = False, key_share: bool = False) → Self¶ inherited from the
GenerativeSelect.with_for_update()method ofGenerativeSelect为此
GenerativeSelect指定一个FOR UPDATE子句。例如:
stmt = select(table).with_for_update(nowait=True)
在像 PostgreSQL 或 Oracle 数据库这样的数据库上,上述内容将渲染像这样的语句
SELECT table.a, table.b FROM table FOR UPDATE NOWAIT
在其他后端,
nowait选项被忽略,而是会产生SELECT table.a, table.b FROM table FOR UPDATE
当不带参数调用时,语句将使用后缀
FOR UPDATE渲染。然后可以提供额外的参数,以允许常见的特定于数据库的变体。- 参数:
nowait¶ – 布尔值;将在 Oracle 数据库和 PostgreSQL 方言上渲染
FOR UPDATE NOWAIT。read¶ – 布尔值;将在 MySQL 上渲染
LOCK IN SHARE MODE,在 PostgreSQL 上渲染FOR SHARE。在 PostgreSQL 上,当与nowait结合使用时,将渲染FOR SHARE NOWAIT。of¶ – SQL 表达式或 SQL 表达式元素列表(通常是
Column对象或兼容的表达式,对于某些后端也可能是表表达式),它将渲染到FOR UPDATE OF子句中;受 PostgreSQL、Oracle 数据库、某些 MySQL 版本以及可能的其他版本支持。可能会根据后端渲染为表或列。skip_locked¶ – 布尔值,将在 Oracle 数据库和 PostgreSQL 方言上渲染
FOR UPDATE SKIP LOCKED,如果也指定了read=True,则渲染FOR SHARE SKIP LOCKED。key_share¶ – 布尔值,将在 PostgreSQL 方言上渲染
FOR NO KEY UPDATE,或者如果与read=True结合使用,则渲染FOR KEY SHARE。
-
method
sqlalchemy.sql.expression.Select.with_hint(selectable: _FromClauseArgument, text: str, dialect_name: str = '*') → Self¶ 继承自
HasHints.with_hint()方法,属于HasHints为此
Select或其他可选择对象,为给定的可选择对象添加索引或其他执行上下文提示。提示
Select.with_hint()方法添加的提示特定于单个表,并且位置是方言特定的。 要在 SELECT 关键字之前的语句开头添加通用优化器提示,例如对于 MySQL 或 Oracle 数据库,请使用Select.prefix_with()方法。 要在语句的末尾添加优化器提示,例如对于 PostgreSQL,请使用Select.with_statement_hint()方法。提示的文本在所用数据库后端的适当位置渲染,相对于作为
selectable参数传递的给定Table或Alias。 方言实现通常使用 Python 字符串替换语法,其中标记%(name)s用于渲染表或别名的名称。 例如,当使用 Oracle 数据库时,以下内容select(mytable).with_hint(mytable, "index(%(name)s ix_mytable)")
将 SQL 渲染为
select /*+ index(mytable ix_mytable) */ ... from mytable
dialect_name选项将特定提示的渲染限制为特定后端。 例如,要同时为 Oracle 数据库和 MSSql 添加提示select(mytable).with_hint( mytable, "index(%(name)s ix_mytable)", "oracle" ).with_hint(mytable, "WITH INDEX ix_mytable", "mssql")
另请参阅
Select.prefix_with()- 通用 SELECT 前缀,也适用于某些数据库特定的 HINT 语法,例如 MySQL 或 Oracle 数据库优化器提示
-
method
sqlalchemy.sql.expression.Select.with_only_columns(*entities: _ColumnsClauseArgument[Any], maintain_column_froms: bool = False, **_Select__kw: Any) → Select[Any]¶ 返回一个新的
select()构造,其 columns 子句被替换为给定的实体。默认情况下,此方法与调用原始
select()时使用给定实体完全等效。 例如,语句s = select(table1.c.a, table1.c.b) s = s.with_only_columns(table1.c.b)
应与以下内容完全等效
s = select(table1.c.b)
在这种操作模式下,如果未显式声明语句的 FROM 子句,
Select.with_only_columns()还会动态更改语句的 FROM 子句。 要维护现有 FROM 集合,包括当前 columns 子句隐含的 FROM 集合,请添加Select.with_only_columns.maintain_column_froms参数s = select(table1.c.a, table2.c.b) s = s.with_only_columns(table1.c.a, maintain_column_froms=True)
以上参数执行将 columns 集合中的有效 FROM 传输到
Select.select_from()方法的操作,就像调用了以下内容一样s = select(table1.c.a, table2.c.b) s = s.select_from(table1, table2).with_only_columns(table1.c.a)
Select.with_only_columns.maintain_column_froms参数使用Select.columns_clause_froms集合,并执行等效于以下操作的操作s = select(table1.c.a, table2.c.b) s = s.select_from(*s.columns_clause_froms).with_only_columns(table1.c.a)
- 参数:
*entities¶ – 要使用的列表达式。
maintain_column_froms¶ –
布尔参数,它将确保从当前 columns 子句隐含的 FROM 列表将首先传输到
Select.select_from()方法。1.4.23 版本新增。
-
method
sqlalchemy.sql.expression.Select.with_statement_hint(text: str, dialect_name: str = '*') → Self¶ 继承自
HasHints.with_statement_hint()方法,属于HasHints为此
Select或其他可选择对象添加语句提示。提示
Select.with_statement_hint()通常在 SELECT 语句的尾部末端添加提示。 要在 SELECT 关键字后的 SELECT 语句前端放置特定于方言的提示,例如优化器提示,请使用Select.prefix_with()方法以获得开放式空间,或者对于特定于表的提示,可以使用Select.with_hint(),它将提示放置在特定于方言的位置。此方法类似于
Select.with_hint(),不同之处在于它不需要单个表,而是应用于整个语句。此处的提示特定于后端数据库,可能包括隔离级别、文件指令、提取指令等指令。
另请参阅
Select.prefix_with()- 通用 SELECT 前缀,也适用于某些数据库特定的 HINT 语法,例如 MySQL 或 Oracle 数据库优化器提示
-
method
- class sqlalchemy.sql.expression.Selectable¶
将类标记为可选择。
成员
corresponding_column(), exported_columns, inherit_cache, is_derived_from(), lateral(), replace_selectable()
-
method
sqlalchemy.sql.expression.Selectable.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ 给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 要匹配的目标
ColumnElement。require_embedded¶ – 仅当给定的
ColumnElement实际存在于此Selectable的子元素中时,才返回给定ColumnElement的对应列。 通常,如果列仅与此Selectable的导出列之一共享一个公共祖先,则该列将匹配。
另请参阅
-
attribute
sqlalchemy.sql.expression.Selectable.exported_columns¶ 继承自
ReturnsRows.exported_columns属性,属于ReturnsRows一个
ColumnCollection,表示此ReturnsRows的 “导出” 列。“导出” 列表示由该 SQL 构造呈现的
ColumnElement表达式的集合。主要种类是 FROM 子句的 “FROM 子句列”,例如表、连接或子查询,“SELECTed 列”,即 SELECT 语句的 “列子句” 中的列,以及 DML 语句中的 RETURNING 列。1.4 版本新增。
-
attribute
sqlalchemy.sql.expression.Selectable.inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache属性,来自HasCacheKey指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
method
sqlalchemy.sql.expression.Selectable.is_derived_from(fromclause: FromClause | None) → bool¶ 继承自
ReturnsRows.is_derived_from()方法,属于ReturnsRows如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.Selectable.lateral(name: str | None = None) → LateralFromClause¶ 返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
method
sqlalchemy.sql.expression.Selectable.replace_selectable(old: FromClause, alias: Alias) → Self¶ 替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
method
- class sqlalchemy.sql.expression.SelectBase¶
SELECT 语句的基类。
这包括
Select,CompoundSelect和TextualSelect。成员
add_cte(), alias(), as_scalar(), c, corresponding_column(), cte(), exists(), exported_columns, get_label_style(), inherit_cache, is_derived_from(), label(), lateral(), replace_selectable(), scalar_subquery(), select(), selected_columns, set_label_style(), subquery()
类签名
class
sqlalchemy.sql.expression.SelectBase(sqlalchemy.sql.roles.SelectStatementRole,sqlalchemy.sql.roles.DMLSelectRole,sqlalchemy.sql.roles.CompoundElementRole,sqlalchemy.sql.roles.InElementRole,sqlalchemy.sql.expression.HasCTE,sqlalchemy.sql.annotation.SupportsCloneAnnotations,sqlalchemy.sql.expression.Selectable)-
method
sqlalchemy.sql.expression.SelectBase.add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ inherited from the
HasCTE.add_cte()method ofHasCTE向此语句添加一个或多个
CTE构造。此方法会将给定的
CTE构造与父语句关联起来,以便它们在最终语句的 WITH 子句中被无条件地呈现,即使在该语句或任何子选择中的其他地方没有被引用。可选的
HasCTE.add_cte.nest_here参数设置为 True 时,将使每个给定的CTE在与此语句直接一起呈现的 WITH 子句中呈现,而不是被移动到最终呈现的语句的顶部,即使此语句在更大的语句中呈现为子查询。此方法有两个一般用途。一种是嵌入 CTE 语句,这些语句在没有被显式引用的情况下服务于某些目的,例如将 DML 语句(如 INSERT 或 UPDATE)作为 CTE 嵌入到可能间接从其结果中提取数据的主语句中。另一种是提供对特定系列 CTE 构造的精确位置的控制,这些构造应保持直接根据可能嵌套在较大语句中的特定语句呈现。
例如:
from sqlalchemy import table, column, select t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
将会呈现
WITH anon_1 AS ( INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) ) SELECT t.c1, t.c2 FROM t
在上面,“anon_1” CTE 在 SELECT 语句中没有被引用,但仍然完成了运行 INSERT 语句的任务。
类似地,在 DML 相关的上下文中,使用 PostgreSQL
Insert构造来生成 “upsert”from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
上面的语句呈现为
WITH deletions AS ( DELETE FROM t WHERE t.c1 < %(c1_1)s ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
1.4.21 版本新增。
- 参数:
*ctes¶ –
零个或多个
CTE构造。Changed in version 2.0: 接受多个 CTE 实例
nest_here¶ –
如果为 True,则给定的 CTE 或 CTEs 将被呈现,就好像它们在添加到此
HasCTE时,将HasCTE.cte.nesting标志指定为True。 假设给定的 CTEs 在外部封闭语句中也没有被引用,则当给定此标志时,给定的 CTEs 应在此语句的级别呈现。2.0 版本新增。
另请参阅
-
method
sqlalchemy.sql.expression.SelectBase.alias(name: str | None = None, flat: bool = False) → Subquery¶ 返回针对此
SelectBase的命名子查询。对于
SelectBase(而不是FromClause),这将返回一个Subquery对象,其行为与用于FromClause的Alias对象基本相同。Changed in version 1.4:
SelectBase.alias()方法现在是SelectBase.subquery()方法的同义词。
-
method
sqlalchemy.sql.expression.SelectBase.as_scalar() → ScalarSelect[Any]¶ Deprecated since version 1.4:
SelectBase.as_scalar()方法已弃用,并将在未来的版本中删除。请参考SelectBase.scalar_subquery()。
-
attribute
sqlalchemy.sql.expression.SelectBase.c¶ Deprecated since version 1.4:
SelectBase.c和SelectBase.columns属性已弃用,并将在未来的版本中删除;这些属性隐式地创建一个子查询,该子查询应该是显式的。请首先调用SelectBase.subquery()以创建一个子查询,然后该子查询包含此属性。要访问此 SELECT 对象从中 SELECT 的列,请使用SelectBase.selected_columns属性。
-
method
sqlalchemy.sql.expression.SelectBase.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ inherited from the
Selectable.corresponding_column()method ofSelectable给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 要匹配的目标
ColumnElement。require_embedded¶ – 仅当给定的
ColumnElement实际存在于此Selectable的子元素中时,才返回给定ColumnElement的对应列。 通常,如果列仅与此Selectable的导出列之一共享一个公共祖先,则该列将匹配。
另请参阅
-
method
sqlalchemy.sql.expression.SelectBase.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ inherited from the
HasCTE.cte()method ofHasCTE返回一个新的
CTE,或通用表表达式实例。公共表表达式是一种 SQL 标准,其中 SELECT 语句可以利用与主语句一起指定的辅助语句,使用名为 “WITH” 的子句。 关于 UNION 的特殊语义也可以用于允许 “递归” 查询,其中 SELECT 语句可以利用先前已选择的行集。
CTE 也可以应用于某些数据库上的 DML 构造 UPDATE、INSERT 和 DELETE,既可以作为与 RETURNING 结合使用的 CTE 行的来源,也可以作为 CTE 行的使用者。
SQLAlchemy 检测
CTE对象,这些对象被视为类似于Alias对象,作为要传递到语句的 FROM 子句以及语句顶部的 WITH 子句的特殊元素。对于 PostgreSQL “MATERIALIZED” 和 “NOT MATERIALIZED” 等特殊前缀,可以使用
CTE.prefix_with()方法来建立这些前缀。Changed in version 1.3.13: 添加了对前缀的支持。特别是 - MATERIALIZED 和 NOT MATERIALIZED。
- 参数:
name¶ – common table expression 的名称。 类似于
FromClause.alias(),名称可以保留为None,在这种情况下,将在查询编译时使用匿名符号。recursive¶ – 如果为
True,将呈现WITH RECURSIVE。 递归公用表表达式旨在与 UNION ALL 结合使用,以便从已选择的行中派生行。nesting¶ –
如果为
True,则将 CTE 本地呈现到引用它的语句中。 对于更复杂的情况,也可以使用HasCTE.add_cte()方法,并结合HasCTE.add_cte.nest_here参数,以更仔细地控制特定 CTE 的确切位置。1.4.24 版本新增。
另请参阅
以下示例包括两个来自 PostgreSQL 文档的示例,网址为 https://postgresql.ac.cn/docs/current/static/queries-with.html,以及其他示例。
示例 1,非递归
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() orders = Table( "orders", metadata, Column("region", String), Column("amount", Integer), Column("product", String), Column("quantity", Integer), ) regional_sales = ( select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) .group_by(orders.c.region) .cte("regional_sales") ) top_regions = ( select(regional_sales.c.region) .where( regional_sales.c.total_sales > select(func.sum(regional_sales.c.total_sales) / 10) ) .cte("top_regions") ) statement = ( select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales"), ) .where(orders.c.region.in_(select(top_regions.c.region))) .group_by(orders.c.region, orders.c.product) ) result = conn.execute(statement).fetchall()
示例 2,WITH RECURSIVE
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() parts = Table( "parts", metadata, Column("part", String), Column("sub_part", String), Column("quantity", Integer), ) included_parts = ( select(parts.c.sub_part, parts.c.part, parts.c.quantity) .where(parts.c.part == "our part") .cte(recursive=True) ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
示例 3,使用 UPDATE 和 INSERT 以及 CTE 的 upsert
from datetime import date from sqlalchemy import ( MetaData, Table, Column, Integer, Date, select, literal, and_, exists, ) metadata = MetaData() visitors = Table( "visitors", metadata, Column("product_id", Integer, primary_key=True), Column("date", Date, primary_key=True), Column("count", Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where( and_(visitors.c.product_id == product_id, visitors.c.date == day) ) .values(count=visitors.c.count + count) .returning(literal(1)) .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)).where( ~exists(update_cte.select()) ), ) connection.execute(upsert)
示例 4,嵌套 CTE (SQLAlchemy 1.4.24 及更高版本)
value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte( "value_a", nesting=True ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
上面的查询将呈现嵌套在第一个 CTE 内的第二个 CTE,如下所示,带有内联参数:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
可以使用
HasCTE.add_cte()方法设置相同的 CTE,如下所示(SQLAlchemy 2.0 及更高版本):value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n) .add_cte(value_a_nested, nest_here=True) .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
示例 5,非线性 CTE (SQLAlchemy 1.4.28 及更高版本)
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
上面的查询将在递归 CTE 内部呈现 2 个 UNION:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
另请参阅
Query.cte()-HasCTE.cte()的 ORM 版本。
-
method
sqlalchemy.sql.expression.SelectBase.exists() → Exists¶ 返回此 selectable 的
Exists表示形式,可用作列表达式。返回的对象是
Exists的实例。1.4 版本新增。
-
attribute
sqlalchemy.sql.expression.SelectBase.exported_columns¶ 一个
ColumnCollection,表示此Selectable的 “导出” 列,不包括TextClause构造。对于
SelectBase对象,“导出” 列与SelectBase.selected_columns集合同义。1.4 版本新增。
-
method
sqlalchemy.sql.expression.SelectBase.get_label_style() → SelectLabelStyle¶ 检索当前标签样式。
由子类实现。
-
attribute
sqlalchemy.sql.expression.SelectBase.inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache属性,来自HasCacheKey指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
method
sqlalchemy.sql.expression.SelectBase.is_derived_from(fromclause: FromClause | None) → bool¶ 继承自
ReturnsRows.is_derived_from()方法,属于ReturnsRows如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.SelectBase.label(name: str | None) → Label[Any]¶ 返回此 selectable 的 “标量” 表示形式,嵌入为带有标签的子查询。
-
method
sqlalchemy.sql.expression.SelectBase.lateral(name: str | None = None) → LateralFromClause¶ 返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
method
sqlalchemy.sql.expression.SelectBase.replace_selectable(old: FromClause, alias: Alias) → Self¶ 继承自
Selectable.replace_selectable()方法,该方法属于Selectable替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
method
sqlalchemy.sql.expression.SelectBase.scalar_subquery() → ScalarSelect[Any]¶ 返回此 selectable 的 ‘scalar’ 表示形式,可以用作列表达式。
返回的对象是
ScalarSelect的一个实例。通常,columns 子句中只有一列的 select 语句有资格用作标量表达式。然后,标量子查询可以在封闭的 SELECT 的 WHERE 子句或 columns 子句中使用。
请注意,标量子查询与可以使用
SelectBase.subquery()方法生成的 FROM 级别子查询区分开来。另请参阅
标量和关联子查询 - 在 2.0 教程中
-
method
sqlalchemy.sql.expression.SelectBase.select(*arg: Any, **kw: Any) → Select¶ Deprecated since version 1.4:
SelectBase.select()方法已弃用,并将在未来的版本中移除;此方法隐式地创建了一个子查询,而这应该是显式的。请先调用SelectBase.subquery()以创建子查询,然后再进行选择。
-
attribute
sqlalchemy.sql.expression.SelectBase.selected_columns¶ 一个
ColumnCollection,表示此 SELECT 语句或类似构造在其结果集中返回的列。此集合与
FromClause.columns的FromClause集合不同,因为此集合中的列不能直接嵌套在另一个 SELECT 语句中;必须首先应用子查询,这为 SQL 所需的必要括号化提供支持。注意
SelectBase.selected_columns集合不包括使用text()构造在列子句中建立的表达式;这些表达式将从集合中静默省略。 要在Select构造内部使用纯文本列表达式,请使用literal_column()构造。1.4 版本新增。
-
method
sqlalchemy.sql.expression.SelectBase.set_label_style(style: SelectLabelStyle) → Self¶ 返回具有指定标签样式的新 selectable。
由子类实现。
-
method
sqlalchemy.sql.expression.SelectBase.subquery(name: str | None = None) → Subquery¶ 返回此
SelectBase的子查询。从 SQL 的角度来看,子查询是一个带括号的、命名的构造,可以放在另一个 SELECT 语句的 FROM 子句中。
给定一个 SELECT 语句,例如
stmt = select(table.c.id, table.c.name)
上面的语句可能看起来像
SELECT table.id, table.name FROM table
子查询形式本身以相同的方式呈现,但是当嵌入到另一个 SELECT 语句的 FROM 子句中时,它将变成一个命名的子元素
subq = stmt.subquery() new_stmt = select(subq)
上面渲染为
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
从历史上看,
SelectBase.subquery()等同于在 FROM 对象上调用FromClause.alias()方法;但是,由于SelectBase对象不是直接的 FROM 对象,因此SelectBase.subquery()方法提供了更清晰的语义。1.4 版本新增。
-
method
- class sqlalchemy.sql.expression.Subquery¶
表示 SELECT 的子查询。
Subquery是通过调用SelectBase.subquery()方法创建的,或者为了方便起见,可以通过在任何SelectBase子类(包括Select、CompoundSelect和TextualSelect)上调用SelectBase.alias()方法创建。 当在 FROM 子句中呈现时,它表示括号内的 SELECT 语句的主体,后跟定义所有“别名”对象的常用“AS <somename>”。Subquery对象与Alias对象非常相似,并且可以以等效的方式使用。Alias和Subquery之间的区别在于,Alias始终包含FromClause对象,而Subquery始终包含SelectBase对象。1.4 版本新增: 添加了
Subquery类,现在用于提供 SELECT 语句的别名版本。-
method
sqlalchemy.sql.expression.Subquery.as_scalar() → ScalarSelect[Any]¶ 1.4 版本后已弃用:
Subquery.as_scalar()方法(在 1.4 版本之前为Alias.as_scalar())已弃用,将在未来的版本中删除; 请在使用构造子查询对象之前,使用Select.scalar_subquery()方法(对于select()构造),或者对于 ORM,使用Query.scalar_subquery()方法。
-
attribute
sqlalchemy.sql.expression.Subquery.inherit_cache: bool | None = True¶ 指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
method
- class sqlalchemy.sql.expression.TableClause¶
表示最小的“表”构造。
这是一个轻量级的表对象,仅具有名称、列的集合(通常由
column()函数生成)和模式。from sqlalchemy import table, column user = table( "user", column("id"), column("name"), column("description"), )
TableClause构造是更常用的Table对象的基础,提供了常用的FromClause服务集,包括.c.集合和语句生成方法。它不提供
Table的所有其他模式级服务,包括约束、对其他表的引用或对MetaData级服务的支持。 它本身很有用,可以作为用于生成快速 SQL 语句的临时构造,而无需使用更完善的Table。成员
alias(), c, columns, compare(), compile(), corresponding_column(), delete(), description, entity_namespace, exported_columns, foreign_keys, get_children(), implicit_returning, inherit_cache, insert(), is_derived_from(), join(), lateral(), outerjoin(), params(), primary_key, replace_selectable(), schema, select(), self_group(), table_valued(), tablesample(), unique_params(), update()
类签名
class
sqlalchemy.sql.expression.TableClause(sqlalchemy.sql.roles.DMLTableRole,sqlalchemy.sql.expression.Immutable,sqlalchemy.sql.expression.NamedFromClause)-
method
sqlalchemy.sql.expression.TableClause.alias(name: str | None = None, flat: bool = False) → NamedFromClause¶ 继承自
FromClause.alias()方法,属于FromClause返回此
FromClause的别名。例如:
a2 = some_table.alias("a2")
上面的代码创建了一个
Alias对象,该对象可以用作任何 SELECT 语句中的 FROM 子句。
-
attribute
sqlalchemy.sql.expression.TableClause.c¶ 继承自
FromClause.c属性,属于FromClause是
FromClause.columns的同义词- 返回:
-
attribute
sqlalchemy.sql.expression.TableClause.columns¶ 继承自
FromClause.columns属性,属于FromClause此
FromClause维护的基于名称的ColumnElement对象集合。columns或c集合是使用表绑定列或其他可选绑定列构造 SQL 表达式的入口点。select(mytable).where(mytable.c.somecolumn == 5)
- 返回:
一个
ColumnCollection对象。
-
method
sqlalchemy.sql.expression.TableClause.compare(other: ClauseElement, **kw: Any) → bool¶ 继承自
ClauseElement.compare()方法,属于ClauseElement将此
ClauseElement与给定的ClauseElement进行比较。子类应覆盖默认行为,即直接标识比较。
**kw 是子类
compare()方法使用的参数,可用于修改比较的标准(请参阅ColumnElement)。
-
method
sqlalchemy.sql.expression.TableClause.compile(bind: _HasDialect | None = None, dialect: Dialect | None = None, **kw: Any) → Compiled¶ 继承自
CompilerElement.compile()方法,属于CompilerElement编译此 SQL 表达式。
返回值是一个
Compiled对象。 在返回的值上调用str()或unicode()将产生结果的字符串表示形式。Compiled对象还可以使用params访问器返回绑定参数名称和值的字典。- 参数:
bind¶ – 一个
Connection或Engine,它可以提供Dialect以生成Compiled对象。 如果省略bind和dialect参数,则使用默认的 SQL 编译器。column_keys¶ – 用于 INSERT 和 UPDATE 语句,应存在于已编译语句的 VALUES 子句中的列名称列表。 如果为
None,则呈现目标表对象中的所有列。compile_kwargs¶ –
传递到所有“visit”方法中编译器内的其他可选参数字典。 这允许将任何自定义标志传递到自定义编译构造,例如。 它也用于传递
literal_binds标志的情况from sqlalchemy.sql import table, column, select t = table("t", column("x")) s = select(t).where(t.c.x == 5) print(s.compile(compile_kwargs={"literal_binds": True}))
-
method
sqlalchemy.sql.expression.TableClause.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ inherited from the
Selectable.corresponding_column()method ofSelectable给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 目标
ColumnElement以进行匹配。require_embedded¶ – 仅当给定的
ColumnElement实际存在于此Selectable的子元素中时,才返回给定ColumnElement的对应列。通常,如果列与此Selectable的导出列之一共享一个共同的祖先,则该列将匹配。
另请参阅
-
method
sqlalchemy.sql.expression.TableClause.delete() → Delete¶ 针对此
TableClause生成一个delete()构造。例如:
table.delete().where(table.c.id == 7)
有关参数和用法信息,请参阅
delete()。
-
attribute
sqlalchemy.sql.expression.TableClause.description¶
-
attribute
sqlalchemy.sql.expression.TableClause.entity_namespace¶ 继承自
FromClause.entity_namespace属性,来自FromClause返回用于 SQL 表达式中基于名称的访问的命名空间。
这是用于解析 “filter_by()” 类型表达式的命名空间,例如
stmt.filter_by(address="some address")
它默认为
.c集合,但内部可以使用 “entity_namespace” 注解覆盖它以传递替代结果。
-
attribute
sqlalchemy.sql.expression.TableClause.exported_columns¶ 继承自
FromClause.exported_columns属性,来自FromClause一个
ColumnCollection,表示此Selectable的 “导出” 列。对于
FromClause对象,“导出” 列与FromClause.columns集合同义。1.4 版本新增。
-
attribute
sqlalchemy.sql.expression.TableClause.foreign_keys¶ 继承自
FromClause.foreign_keys属性,来自FromClause返回此 FromClause 引用的
ForeignKey标记对象的集合。每个
ForeignKey都是Table范围内的ForeignKeyConstraint的成员。
-
method
sqlalchemy.sql.expression.TableClause.get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ 继承自
HasTraverseInternals.get_children()方法,来自HasTraverseInternals返回此
HasTraverseInternals的直接子HasTraverseInternals元素。这用于访问遍历。
**kw 可能包含更改返回集合的标志,例如,为了减少更大的遍历,或从不同的上下文(例如模式级别集合而不是子句级别)返回子项。
-
attribute
sqlalchemy.sql.expression.TableClause.implicit_returning = False¶ TableClause不支持拥有主键或列级别的默认值,因此隐式返回不适用。
-
attribute
sqlalchemy.sql.expression.TableClause.inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache属性,来自HasCacheKey指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
method
sqlalchemy.sql.expression.TableClause.insert() → Insert¶ 针对此
TableClause生成一个Insert构造。例如:
table.insert().values(name="foo")
有关参数和用法信息,请参阅
insert()。
-
method
sqlalchemy.sql.expression.TableClause.is_derived_from(fromclause: FromClause | None) → bool¶ 继承自
FromClause.is_derived_from()方法,来自FromClause如果此
FromClause“派生自”给定的FromClause,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
method
sqlalchemy.sql.expression.TableClause.join(right: _FromClauseArgument, onclause: _ColumnExpressionArgument[bool] | None = None, isouter: bool = False, full: bool = False) → Join¶ 继承自
FromClause.join()方法,来自FromClause从此
FromClause返回到另一个FromClause的Join。例如:
from sqlalchemy import join j = user_table.join( address_table, user_table.c.id == address_table.c.user_id ) stmt = select(user_table).select_from(j)
将发出类似于以下的 SQL:
SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id
- 参数:
right¶ – 连接的右侧;这是任何
FromClause对象,例如Table对象,也可能是一个可选择兼容的对象,例如 ORM 映射的类。onclause¶ – 表示连接的 ON 子句的 SQL 表达式。如果保留为
None,FromClause.join()将尝试基于外键关系连接两个表。isouter¶ – 如果为 True,则渲染 LEFT OUTER JOIN,而不是 JOIN。
full¶ – 如果为 True,则渲染 FULL OUTER JOIN,而不是 LEFT OUTER JOIN。暗示
FromClause.join.isouter。
-
method
sqlalchemy.sql.expression.TableClause.lateral(name: str | None = None) → LateralFromClause¶ 继承自
Selectable.lateral()方法,来自Selectable返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
method
sqlalchemy.sql.expression.TableClause.outerjoin(right: _FromClauseArgument, onclause: _ColumnExpressionArgument[bool] | None = None, full: bool = False) → Join¶ 继承自
FromClause.outerjoin()方法,来自FromClause从此
FromClause返回到另一个FromClause的Join,并将 “isouter” 标志设置为 True。例如:
from sqlalchemy import outerjoin j = user_table.outerjoin( address_table, user_table.c.id == address_table.c.user_id )
以上等效于
j = user_table.join( address_table, user_table.c.id == address_table.c.user_id, isouter=True )
- 参数:
right¶ – 连接的右侧;这是任何
FromClause对象,例如Table对象,也可能是一个可选择兼容的对象,例如 ORM 映射的类。onclause¶ – 表示连接的 ON 子句的 SQL 表达式。如果保留为
None,FromClause.join()将尝试基于外键关系连接两个表。full¶ – 如果为 True,则渲染 FULL OUTER JOIN,而不是 LEFT OUTER JOIN。
-
method
sqlalchemy.sql.expression.TableClause.params(*optionaldict, **kwargs)¶ 继承自
Immutable.params()方法,来自Immutable返回一个副本,其中
bindparam()元素被替换。返回此 ClauseElement 的副本,其中
bindparam()元素被替换为从给定字典中获取的值>>> clause = column("x") + bindparam("foo") >>> print(clause.compile().params) {'foo':None} >>> print(clause.params({"foo": 7}).compile().params) {'foo':7}
-
attribute
sqlalchemy.sql.expression.TableClause.primary_key¶ 继承自
FromClause.primary_key属性,来自FromClause返回构成此
_selectable.FromClause的主键的Column对象的可迭代集合。对于
Table对象,此集合由PrimaryKeyConstraint表示,它本身是Column对象的迭代集合。
-
method
sqlalchemy.sql.expression.TableClause.replace_selectable(old: FromClause, alias: Alias) → Self¶ 继承自
Selectable.replace_selectable()方法,该方法属于Selectable替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
attribute
sqlalchemy.sql.expression.TableClause.schema: str | None = None¶ 继承自
FromClause.schema属性,来自FromClause为此
FromClause定义 ‘schema’ 属性。对于大多数对象,这通常是
None,但Table对象除外,在Table对象中,它被视为Table.schema参数的值。
-
method
sqlalchemy.sql.expression.TableClause.select() → Select¶ 继承自
FromClause.select()方法,来自FromClause返回此
FromClause的 SELECT。例如:
stmt = some_table.select().where(some_table.c.id == 5)
另请参阅
select()- 通用方法,允许使用任意列列表。
-
method
sqlalchemy.sql.expression.TableClause.self_group(against: OperatorType | None = None) → ClauseElement¶ 继承自
ClauseElement.self_group()方法,来自ClauseElement对此
ClauseElement应用 ‘grouping’(分组)。此方法被子类重写以返回 “grouping” 构造,即括号。特别是,当 “binary” 表达式放置到更大的表达式中时,以及当
select()构造放置到另一个select()的 FROM 子句中时,它用于在其周围提供分组。(请注意,子查询通常应使用Select.alias()方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()的应用是自动的 - 最终用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此,例如,在像x OR (y AND z)这样的表达式中,可能不需要括号 - AND 的优先级高于 OR。基础
self_group()方法,来自ClauseElement,仅返回 self。
-
method
sqlalchemy.sql.expression.TableClause.table_valued() → TableValuedColumn[Any]¶ 继承自
NamedFromClause.table_valued()方法,来自NamedFromClause为此
FromClause返回一个TableValuedColumn对象。TableValuedColumn是一个ColumnElement,它表示表中的完整行。 对此构造的支持取决于后端,并且后端(如 PostgreSQL、Oracle Database 和 SQL Server)以各种形式支持它。例如:
>>> from sqlalchemy import select, column, func, table >>> a = table("a", column("id"), column("x"), column("y")) >>> stmt = select(func.row_to_json(a.table_valued())) >>> print(stmt)
SELECT row_to_json(a) AS row_to_json_1 FROM a1.4.0b2 版本新增功能。
另请参阅
使用 SQL 函数 - 在 SQLAlchemy 统一教程 中
-
method
sqlalchemy.sql.expression.TableClause.tablesample(sampling: float | Function[Any], name: str | None = None, seed: roles.ExpressionElementRole[Any] | None = None) → TableSample¶ 继承自
FromClause.tablesample()方法,来自FromClause返回此
FromClause的 TABLESAMPLE 别名。返回值是由顶层
tablesample()函数提供的TableSample构造。另请参阅
tablesample()- 用法指南和参数
-
method
sqlalchemy.sql.expression.TableClause.unique_params(*optionaldict, **kwargs)¶ 继承自
Immutable.unique_params()方法,来自Immutable返回一个副本,其中
bindparam()元素被替换。与
ClauseElement.params()功能相同,但为受影响的绑定参数添加了 unique=True,以便可以使用多个语句。
-
方法
sqlalchemy.sql.expression.TableClause.update() → Update¶ 针对此
TableClause生成update()构造。例如:
table.update().where(table.c.id == 7).values(name="foo")
有关参数和用法信息,请参阅
update()。
-
method
- 类 sqlalchemy.sql.expression.TableSample¶
表示 TABLESAMPLE 子句。
此对象由
tablesample()模块级函数以及所有FromClause子类上可用的FromClause.tablesample()方法构造。另请参阅
类签名
class
sqlalchemy.sql.expression.TableSample(sqlalchemy.sql.expression.FromClauseAlias)
- 类 sqlalchemy.sql.expression.TableValuedAlias¶
针对“表值”SQL 函数的别名。
此构造提供了一个 SQL 函数,该函数返回要在 SELECT 语句的 FROM 子句中使用的列。该对象使用
FunctionElement.table_valued()方法生成,例如:>>> from sqlalchemy import select, func >>> fn = func.json_array_elements_text('["one", "two", "three"]').table_valued( ... "value" ... ) >>> print(select(fn.c.value))
SELECT anon_1.value FROM json_array_elements_text(:json_array_elements_text_1) AS anon_11.4.0b2 版本新增功能。
另请参阅
表值函数 - 在 SQLAlchemy 统一教程 中
类签名
class
sqlalchemy.sql.expression.TableValuedAlias(sqlalchemy.sql.expression.LateralFromClause,sqlalchemy.sql.expression.Alias)-
方法
sqlalchemy.sql.expression.TableValuedAlias.alias(name: str | None = None, flat: bool = False) → TableValuedAlias¶ 返回此
TableValuedAlias的新别名。这将创建一个不同的 FROM 对象,该对象在 SQL 语句中使用时将与原始对象区分开来。
-
属性
sqlalchemy.sql.expression.TableValuedAlias.column¶ 返回表示此
TableValuedAlias的列表达式。此访问器用于实现
FunctionElement.column_valued()方法。 有关更多详细信息,请参阅该方法。例如:
>>> print(select(func.some_func().table_valued("value").column))
SELECT anon_1 FROM some_func() AS anon_1
-
方法
sqlalchemy.sql.expression.TableValuedAlias.lateral(name: str | None = None) → LateralFromClause¶ 返回设置了 lateral 标志的新的
TableValuedAlias,以便它呈现为 LATERAL。另请参阅
-
方法
sqlalchemy.sql.expression.TableValuedAlias.render_derived(name: str | None = None, with_types: bool = False) → TableValuedAlias¶ 将 “render derived” 应用于此
TableValuedAlias。这具有在 “AS” 序列中的别名名称之后列出各个列名称的效果,例如:
>>> print( ... select( ... func.unnest(array(["one", "two", "three"])) ... .table_valued("x", with_ordinality="o") ... .render_derived() ... ) ... )
SELECT anon_1.x, anon_1.o FROM unnest(ARRAY[%(param_1)s, %(param_2)s, %(param_3)s]) WITH ORDINALITY AS anon_1(x, o)with_types关键字将在别名表达式内内联呈现列类型(此语法目前适用于 PostgreSQL 数据库)>>> print( ... select( ... func.json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') ... .table_valued(column("a", Integer), column("b", String)) ... .render_derived(with_types=True) ... ) ... )
SELECT anon_1.a, anon_1.b FROM json_to_recordset(:json_to_recordset_1) AS anon_1(a INTEGER, b VARCHAR)
-
方法
- 类 sqlalchemy.sql.expression.TextualSelect¶
将
TextClause构造包装在SelectBase接口中。这允许
TextClause对象获得.c集合和其他类似 FROM 的功能,例如FromClause.alias()、SelectBase.cte()等。TextualSelect构造通过TextClause.columns()方法生成 - 有关详细信息,请参阅该方法。在版本 1.4 中更改:
TextualSelect类已从TextAsFrom重命名,以更正确地适应其作为面向 SELECT 的对象而不是 FROM 子句的角色。成员
add_cte(), alias(), as_scalar(), c, compare(), compile(), corresponding_column(), cte(), execution_options(), exists(), exported_columns, get_children(), get_execution_options(), get_label_style(), inherit_cache, is_derived_from(), label(), lateral(), options(), params(), replace_selectable(), scalar_subquery(), select(), selected_columns, self_group(), set_label_style(), subquery(), unique_params()
类签名
class
sqlalchemy.sql.expression.TextualSelect(sqlalchemy.sql.expression.SelectBase,sqlalchemy.sql.expression.ExecutableReturnsRows,sqlalchemy.sql.expression.Generative)-
方法
sqlalchemy.sql.expression.TextualSelect.add_cte(*ctes: CTE, nest_here: bool = False) → Self¶ inherited from the
HasCTE.add_cte()method ofHasCTE向此语句添加一个或多个
CTE构造。此方法会将给定的
CTE构造与父语句关联起来,以便它们在最终语句的 WITH 子句中被无条件地呈现,即使在该语句或任何子选择中的其他地方没有被引用。可选的
HasCTE.add_cte.nest_here参数设置为 True 时,将使每个给定的CTE在与此语句直接一起呈现的 WITH 子句中呈现,而不是被移动到最终呈现的语句的顶部,即使此语句在更大的语句中呈现为子查询。此方法有两个一般用途。一种是嵌入 CTE 语句,这些语句在没有被显式引用的情况下服务于某些目的,例如将 DML 语句(如 INSERT 或 UPDATE)作为 CTE 嵌入到可能间接从其结果中提取数据的主语句中。另一种是提供对特定系列 CTE 构造的精确位置的控制,这些构造应保持直接根据可能嵌套在较大语句中的特定语句呈现。
例如:
from sqlalchemy import table, column, select t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins)
将会呈现
WITH anon_1 AS ( INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) ) SELECT t.c1, t.c2 FROM t
在上面,“anon_1” CTE 在 SELECT 语句中没有被引用,但仍然完成了运行 INSERT 语句的任务。
类似地,在 DML 相关的上下文中,使用 PostgreSQL
Insert构造来生成 “upsert”from sqlalchemy import table, column from sqlalchemy.dialects.postgresql import insert t = table("t", column("c1"), column("c2")) delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( index_elements=[t.c.c1], set_={ "c1": insert_stmt.excluded.c1, "c2": insert_stmt.excluded.c2, }, ).add_cte(delete_statement_cte) print(update_statement)
上面的语句呈现为
WITH deletions AS ( DELETE FROM t WHERE t.c1 < %(c1_1)s ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2
1.4.21 版本新增。
- 参数:
*ctes¶ –
零个或多个
CTE构造。Changed in version 2.0: 接受多个 CTE 实例
nest_here¶ –
如果为 True,则给定的 CTE 或 CTEs 将被呈现,就好像它们在添加到此
HasCTE时,将HasCTE.cte.nesting标志指定为True。 假设给定的 CTEs 在外部封闭语句中也没有被引用,则当给定此标志时,给定的 CTEs 应在此语句的级别呈现。2.0 版本新增。
另请参阅
-
方法
sqlalchemy.sql.expression.TextualSelect.alias(name: str | None = None, flat: bool = False) → Subquery¶ inherited from the
SelectBase.alias()method ofSelectBase返回针对此
SelectBase的命名子查询。对于
SelectBase(而不是FromClause),这将返回一个Subquery对象,其行为与用于FromClause的Alias对象基本相同。Changed in version 1.4:
SelectBase.alias()方法现在是SelectBase.subquery()方法的同义词。
-
方法
sqlalchemy.sql.expression.TextualSelect.as_scalar() → ScalarSelect[Any]¶ inherited from the
SelectBase.as_scalar()method ofSelectBaseDeprecated since version 1.4:
SelectBase.as_scalar()方法已弃用,并将在未来的版本中删除。请参考SelectBase.scalar_subquery()。
-
属性
sqlalchemy.sql.expression.TextualSelect.c¶ inherited from the
SelectBase.cattribute ofSelectBaseDeprecated since version 1.4:
SelectBase.c和SelectBase.columns属性已弃用,并将在未来的版本中删除;这些属性隐式地创建一个子查询,该子查询应该是显式的。请首先调用SelectBase.subquery()以创建一个子查询,然后该子查询包含此属性。要访问此 SELECT 对象从中 SELECT 的列,请使用SelectBase.selected_columns属性。
-
方法
sqlalchemy.sql.expression.TextualSelect.compare(other: ClauseElement, **kw: Any) → bool¶ 继承自
ClauseElement.compare()方法,属于ClauseElement将此
ClauseElement与给定的ClauseElement进行比较。子类应覆盖默认行为,即直接标识比较。
**kw 是子类
compare()方法使用的参数,可用于修改比较的标准(请参阅ColumnElement)。
-
方法
sqlalchemy.sql.expression.TextualSelect.compile(bind: _HasDialect | None = None, dialect: Dialect | None = None, **kw: Any) → Compiled¶ 继承自
CompilerElement.compile()方法,属于CompilerElement编译此 SQL 表达式。
返回值是一个
Compiled对象。 在返回的值上调用str()或unicode()将产生结果的字符串表示形式。Compiled对象还可以使用params访问器返回绑定参数名称和值的字典。- 参数:
bind¶ – 一个
Connection或Engine,它可以提供Dialect以生成Compiled对象。如果bind和dialect参数都被省略,则使用默认的 SQL 编译器。column_keys¶ – 用于 INSERT 和 UPDATE 语句,应存在于已编译语句的 VALUES 子句中的列名称列表。如果为
None,则呈现目标表对象中的所有列。compile_kwargs¶ –
传递到所有“visit”方法中编译器内的其他可选参数字典。 这允许将任何自定义标志传递到自定义编译构造,例如。 它也用于传递
literal_binds标志的情况from sqlalchemy.sql import table, column, select t = table("t", column("x")) s = select(t).where(t.c.x == 5) print(s.compile(compile_kwargs={"literal_binds": True}))
-
方法
sqlalchemy.sql.expression.TextualSelect.corresponding_column(column: KeyedColumnElement[Any], require_embedded: bool = False) → KeyedColumnElement[Any] | None¶ inherited from the
Selectable.corresponding_column()method ofSelectable给定一个
ColumnElement,从此Selectable的Selectable.exported_columns集合中返回导出的ColumnElement对象,该对象通过公共祖先列与原始ColumnElement对象相对应。- 参数:
column¶ – 要匹配的目标
ColumnElement。require_embedded¶ – 仅当给定的
ColumnElement实际存在于此Selectable的子元素中时,才返回给定ColumnElement的对应列。通常,如果列与此Selectable的导出列之一共享公共祖先,则该列将匹配。
另请参阅
-
方法
sqlalchemy.sql.expression.TextualSelect.cte(name: str | None = None, recursive: bool = False, nesting: bool = False) → CTE¶ inherited from the
HasCTE.cte()method ofHasCTE返回一个新的
CTE,或通用表表达式实例。公共表表达式是一种 SQL 标准,其中 SELECT 语句可以利用与主语句一起指定的辅助语句,使用名为 “WITH” 的子句。 关于 UNION 的特殊语义也可以用于允许 “递归” 查询,其中 SELECT 语句可以利用先前已选择的行集。
CTE 也可以应用于某些数据库上的 DML 构造 UPDATE、INSERT 和 DELETE,既可以作为与 RETURNING 结合使用的 CTE 行的来源,也可以作为 CTE 行的使用者。
SQLAlchemy 检测
CTE对象,这些对象被视为类似于Alias对象,作为要传递到语句的 FROM 子句以及语句顶部的 WITH 子句的特殊元素。对于 PostgreSQL “MATERIALIZED” 和 “NOT MATERIALIZED” 等特殊前缀,可以使用
CTE.prefix_with()方法来建立这些前缀。Changed in version 1.3.13: 添加了对前缀的支持。特别是 - MATERIALIZED 和 NOT MATERIALIZED。
- 参数:
name¶ – 公用表表达式的名称。与
FromClause.alias()类似,名称可以保留为None,在这种情况下,将在查询编译时使用匿名符号。recursive¶ – 如果为
True,将呈现WITH RECURSIVE。递归公用表表达式旨在与 UNION ALL 结合使用,以便从已选择的行中派生行。nesting¶ –
如果为
True,则将 CTE 本地呈现到引用它的语句中。 对于更复杂的情况,也可以使用HasCTE.add_cte()方法,并结合HasCTE.add_cte.nest_here参数,以更仔细地控制特定 CTE 的确切位置。1.4.24 版本新增。
另请参阅
以下示例包括两个来自 PostgreSQL 文档的示例,网址为 https://postgresql.ac.cn/docs/current/static/queries-with.html,以及其他示例。
示例 1,非递归
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() orders = Table( "orders", metadata, Column("region", String), Column("amount", Integer), Column("product", String), Column("quantity", Integer), ) regional_sales = ( select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) .group_by(orders.c.region) .cte("regional_sales") ) top_regions = ( select(regional_sales.c.region) .where( regional_sales.c.total_sales > select(func.sum(regional_sales.c.total_sales) / 10) ) .cte("top_regions") ) statement = ( select( orders.c.region, orders.c.product, func.sum(orders.c.quantity).label("product_units"), func.sum(orders.c.amount).label("product_sales"), ) .where(orders.c.region.in_(select(top_regions.c.region))) .group_by(orders.c.region, orders.c.product) ) result = conn.execute(statement).fetchall()
示例 2,WITH RECURSIVE
from sqlalchemy import ( Table, Column, String, Integer, MetaData, select, func, ) metadata = MetaData() parts = Table( "parts", metadata, Column("part", String), Column("sub_part", String), Column("quantity", Integer), ) included_parts = ( select(parts.c.sub_part, parts.c.part, parts.c.quantity) .where(parts.c.part == "our part") .cte(recursive=True) ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( included_parts.c.sub_part, func.sum(included_parts.c.quantity).label("total_quantity"), ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall()
示例 3,使用 UPDATE 和 INSERT 以及 CTE 的 upsert
from datetime import date from sqlalchemy import ( MetaData, Table, Column, Integer, Date, select, literal, and_, exists, ) metadata = MetaData() visitors = Table( "visitors", metadata, Column("product_id", Integer, primary_key=True), Column("date", Date, primary_key=True), Column("count", Integer), ) # add 5 visitors for the product_id == 1 product_id = 1 day = date.today() count = 5 update_cte = ( visitors.update() .where( and_(visitors.c.product_id == product_id, visitors.c.date == day) ) .values(count=visitors.c.count + count) .returning(literal(1)) .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], select(literal(product_id), literal(day), literal(count)).where( ~exists(update_cte.select()) ), ) connection.execute(upsert)
示例 4,嵌套 CTE (SQLAlchemy 1.4.24 及更高版本)
value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte( "value_a", nesting=True ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = select(value_a_nested.c.n).cte("value_b") value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
上面的查询将呈现嵌套在第一个 CTE 内的第二个 CTE,如下所示,带有内联参数:
WITH value_a AS (SELECT 'root' AS n), value_b AS (WITH value_a AS (SELECT 'nesting' AS n) SELECT value_a.n AS n FROM value_a) SELECT value_a.n AS a, value_b.n AS b FROM value_a, value_b
可以使用
HasCTE.add_cte()方法设置相同的 CTE,如下所示(SQLAlchemy 2.0 及更高版本):value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( select(value_a_nested.c.n) .add_cte(value_a_nested, nest_here=True) .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b"))
示例 5,非线性 CTE (SQLAlchemy 1.4.28 及更高版本)
edge = Table( "edge", metadata, Column("id", Integer, primary_key=True), Column("left", Integer), Column("right", Integer), ) root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node ) right_edge = select(edge.c.right).join( root_node, edge.c.left == root_node.c.node ) subgraph_cte = root_node.union(left_edge, right_edge) subgraph = select(subgraph_cte)
上面的查询将在递归 CTE 内部呈现 2 个 UNION:
WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node UNION SELECT edge."left" AS "left" FROM edge JOIN nodes ON edge."right" = nodes.node UNION SELECT edge."right" AS "right" FROM edge JOIN nodes ON edge."left" = nodes.node ) SELECT nodes.node FROM nodes
另请参阅
Query.cte()-HasCTE.cte()的 ORM 版本。
-
方法
sqlalchemy.sql.expression.TextualSelect.execution_options(**kw: Any) → Self¶ inherited from the
Executable.execution_options()method ofExecutable为此语句设置在执行期间生效的非 SQL 选项。
可以使用多种作用域设置执行选项,包括每个语句、每个连接或每次执行,使用
Connection.execution_options()等方法,以及接受选项字典的参数,例如Connection.execute.execution_options和Session.execute.execution_options。执行选项的主要特征是,与其他类型的选项(如 ORM 加载程序选项)相比,执行选项永远不会影响查询的已编译 SQL,只会影响 SQL 语句本身的调用方式或结果的提取方式。 也就是说,执行选项不是 SQL 编译所容纳内容的一部分,也不被视为语句的缓存状态的一部分。
Executable.execution_options()方法是 generative 的,应用于Engine和Query对象的方法也是如此,这意味着当调用该方法时,将返回对象的副本,该副本将给定的参数应用于该新副本,但保持原始对象不变statement = select(table.c.x, table.c.y) new_statement = statement.execution_options(my_option=True)
此行为的一个例外是
Connection对象,其中Connection.execution_options()方法明确地不是 generative 的。可以传递给
Executable.execution_options()和其他相关方法和参数字典的选项类型包括 SQLAlchemy Core 或 ORM 显式使用的参数,以及 SQLAlchemy 未定义的任意关键字参数,这意味着这些方法和/或参数字典可以用于与自定义代码交互的用户定义的参数,自定义代码可以使用Executable.get_execution_options()和Connection.get_execution_options()等方法访问这些参数,或者在选定的事件挂钩中使用专用的execution_options事件参数,例如ConnectionEvents.before_execute.execution_options或ORMExecuteState.execution_options,例如:from sqlalchemy import event @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" if execution_options.get("do_special_thing", False): conn.exec_driver_sql("run_special_function()")
在 SQLAlchemy 显式识别的选项范围内,大多数选项适用于特定类别的对象,而不适用于其他对象。 最常见的执行选项包括
Connection.execution_options.isolation_level- 通过Engine设置连接或一类连接的隔离级别。 此选项仅被Connection或Engine接受。Connection.execution_options.stream_results- 指示应使用服务器端游标获取结果;此选项被Connection、Connection.execute.execution_options参数(在Connection.execute()上)以及 SQL 语句对象上的Executable.execution_options()接受,并且还被 ORM 构造(如Session.execute())接受。Connection.execution_options.compiled_cache- 指示一个字典,该字典将充当 SQL 编译缓存,用于Connection或Engine,以及 ORM 方法(如Session.execute())。 可以作为None传递以禁用语句的缓存。 此选项不被Executable.execution_options()接受,因为不建议在语句对象中携带编译缓存。Connection.execution_options.schema_translate_map- 模式转换映射 功能使用的模式名称映射,被Connection,Engine,Executable以及 ORM 构造(如Session.execute())接受。
另请参阅
Connection.execution_options()Connection.execute.execution_optionsSession.execute.execution_optionsORM 执行选项 - 关于所有 ORM 特定的执行选项的文档
-
方法
sqlalchemy.sql.expression.TextualSelect.exists() → Exists¶ 继承自
SelectBase.exists()方法,该方法属于SelectBase返回此 selectable 的
Exists表示形式,可用作列表达式。返回的对象是
Exists的实例。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.TextualSelect.exported_columns¶ 继承自
SelectBase.exported_columns属性,该属性属于SelectBase一个
ColumnCollection,表示此Selectable的 “导出” 列,不包括TextClause构造。对于
SelectBase对象,“导出” 列与SelectBase.selected_columns集合同义。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.TextualSelect.get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ 继承自
HasTraverseInternals.get_children()方法,来自HasTraverseInternals返回此
HasTraverseInternals的直接子HasTraverseInternals元素。这用于访问遍历。
**kw 可能包含更改返回集合的标志,例如,为了减少更大的遍历,或从不同的上下文(例如模式级别集合而不是子句级别)返回子项。
-
方法
sqlalchemy.sql.expression.TextualSelect.get_execution_options() → _ExecuteOptions¶ 继承自
Executable.get_execution_options()方法,该方法属于Executable获取将在执行期间生效的非 SQL 选项。
1.3 版本新增。
-
方法
sqlalchemy.sql.expression.TextualSelect.get_label_style() → SelectLabelStyle¶ 继承自
SelectBase.get_label_style()方法,属于SelectBase检索当前标签样式。
由子类实现。
-
属性
sqlalchemy.sql.expression.TextualSelect.inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache属性,来自HasCacheKey指示此
HasCacheKey实例是否应使用其直接超类使用的缓存键生成方案。该属性默认为
None,表示构造尚未考虑是否适合参与缓存;这在功能上等效于将值设置为False,只是还会发出警告。如果与对象对应的 SQL 不会基于此类的局部属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True。另请参阅
为自定义构造启用缓存支持 - 为第三方或用户定义的 SQL 构造设置
HasCacheKey.inherit_cache属性的通用指南。
-
方法
sqlalchemy.sql.expression.TextualSelect.is_derived_from(fromclause: FromClause | None) → bool¶ 继承自
ReturnsRows.is_derived_from()方法,属于ReturnsRows如果此
ReturnsRows是从给定的FromClause“派生” 而来,则返回True。一个示例是 Table 的 Alias 派生自该 Table。
-
方法
sqlalchemy.sql.expression.TextualSelect.label(name: str | None) → Label[Any]¶ 继承自
SelectBase.label()方法,该方法属于SelectBase返回此 selectable 的 “标量” 表示形式,嵌入为带有标签的子查询。
-
方法
sqlalchemy.sql.expression.TextualSelect.lateral(name: str | None = None) → LateralFromClause¶ 继承自
SelectBase.lateral()方法,该方法属于SelectBase返回此
Selectable的 LATERAL 别名。返回值是由顶层
lateral()函数提供的Lateral构造。另请参阅
LATERAL 关联 - 用法概述。
-
方法
sqlalchemy.sql.expression.TextualSelect.options(*options: ExecutableOption) → Self¶ 继承自
Executable.options()方法,该方法属于Executable将选项应用于此语句。
从广义上讲,选项是任何可以被语句的 SQL 编译器解释的 Python 对象。这些选项可以被特定的方言或特定类型的编译器使用。
最常见的选项类型是 ORM 级别的选项,它将 “急切加载” 和其他加载行为应用于 ORM 查询。然而,理论上选项可以用于许多其他目的。
有关特定语句类型的特定选项类型的背景信息,请参阅这些选项对象的文档。
在 1.4 版本中更改: - 向 Core 语句对象添加了
Executable.options(),旨在实现统一的 Core / ORM 查询功能。
-
方法
sqlalchemy.sql.expression.TextualSelect.params(_ClauseElement__optionaldict: Mapping[str, Any] | None = None, **kwargs: Any) → Self¶ 继承自
ClauseElement.params()方法,源自ClauseElement返回一个副本,其中
bindparam()元素被替换。返回此 ClauseElement 的副本,其中
bindparam()元素被替换为从给定字典中获取的值>>> clause = column("x") + bindparam("foo") >>> print(clause.compile().params) {'foo':None} >>> print(clause.params({"foo": 7}).compile().params) {'foo':7}
-
方法
sqlalchemy.sql.expression.TextualSelect.replace_selectable(old: FromClause, alias: Alias) → Self¶ 继承自
Selectable.replace_selectable()方法,该方法属于Selectable替换所有出现的
FromClause‘old’ 为给定的Alias对象,返回此FromClause的副本。Deprecated since version 1.4:
Selectable.replace_selectable()方法已弃用,并将在未来的版本中移除。类似的功能可以通过 sqlalchemy.sql.visitors 模块获得。
-
方法
sqlalchemy.sql.expression.TextualSelect.scalar_subquery() → ScalarSelect[Any]¶ inherited from the
SelectBase.scalar_subquery()method ofSelectBase返回此 selectable 的 ‘scalar’ 表示形式,可以用作列表达式。
返回的对象是
ScalarSelect的一个实例。通常,columns 子句中只有一列的 select 语句有资格用作标量表达式。然后,标量子查询可以在封闭的 SELECT 的 WHERE 子句或 columns 子句中使用。
请注意,标量子查询与可以使用
SelectBase.subquery()方法生成的 FROM 级别子查询区分开来。另请参阅
标量和关联子查询 - 在 2.0 教程中
-
方法
sqlalchemy.sql.expression.TextualSelect.select(*arg: Any, **kw: Any) → Select¶ inherited from the
SelectBase.select()method ofSelectBaseDeprecated since version 1.4:
SelectBase.select()方法已弃用,并将在未来的版本中移除;此方法隐式地创建了一个子查询,而这应该是显式的。请先调用SelectBase.subquery()以创建子查询,然后再进行选择。
-
属性
sqlalchemy.sql.expression.TextualSelect.selected_columns¶ 一个
ColumnCollection,表示此 SELECT 语句或类似构造在其结果集中返回的列,不包括TextClause构造。此集合与
FromClause.columns的FromClause集合不同,因为此集合中的列不能直接嵌套在另一个 SELECT 语句中;必须首先应用子查询,这为 SQL 所需的必要括号化提供支持。对于
TextualSelect构造,此集合包含传递给构造函数的ColumnElement对象,通常通过TextClause.columns()方法传递。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.TextualSelect.self_group(against: OperatorType | None = None) → ClauseElement¶ 继承自
ClauseElement.self_group()方法,来自ClauseElement对此
ClauseElement应用 ‘grouping’(分组)。此方法被子类重写以返回 “grouping” 构造,即括号。特别是,当 “binary” 表达式放置到更大的表达式中时,以及当
select()构造放置到另一个select()的 FROM 子句中时,它用于在其周围提供分组。(请注意,子查询通常应使用Select.alias()方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()的应用是自动的 - 最终用户代码永远不需要直接使用此方法。 请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此可能不需要括号,例如,在像x OR (y AND z)这样的表达式中 - AND 的优先级高于 OR。ClauseElement的基本self_group()方法仅返回 self。
-
方法
sqlalchemy.sql.expression.TextualSelect.set_label_style(style: SelectLabelStyle) → TextualSelect¶ 返回具有指定标签样式的新 selectable。
由子类实现。
-
方法
sqlalchemy.sql.expression.TextualSelect.subquery(name: str | None = None) → Subquery¶ inherited from the
SelectBase.subquery()method ofSelectBase返回此
SelectBase的子查询。从 SQL 的角度来看,子查询是一个带括号的、命名的构造,可以放在另一个 SELECT 语句的 FROM 子句中。
给定一个 SELECT 语句,例如
stmt = select(table.c.id, table.c.name)
上面的语句可能看起来像
SELECT table.id, table.name FROM table
子查询形式本身以相同的方式呈现,但是当嵌入到另一个 SELECT 语句的 FROM 子句中时,它将变成一个命名的子元素
subq = stmt.subquery() new_stmt = select(subq)
上面渲染为
SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1
从历史上看,
SelectBase.subquery()等同于在 FROM 对象上调用FromClause.alias()方法;但是,由于SelectBase对象不是直接的 FROM 对象,因此SelectBase.subquery()方法提供了更清晰的语义。1.4 版本新增。
-
方法
sqlalchemy.sql.expression.TextualSelect.unique_params(_ClauseElement__optionaldict: Dict[str, Any] | None = None, **kwargs: Any) → Self¶ 继承自
ClauseElement.unique_params()方法,源自ClauseElement返回一个副本,其中
bindparam()元素被替换。与
ClauseElement.params()功能相同,但为受影响的绑定参数添加了 unique=True,以便可以使用多个语句。
-
方法
- 类 sqlalchemy.sql.expression.Values¶
表示可在语句中用作 FROM 元素的
VALUES构造。1.4 版本新增。
类签名
类
sqlalchemy.sql.expression.Values(sqlalchemy.sql.roles.InElementRole,sqlalchemy.sql.expression.Generative,sqlalchemy.sql.expression.LateralFromClause)-
方法
sqlalchemy.sql.expression.Values.alias(name: str | None = None, flat: bool = False) → Self¶ 返回一个新的
Values构造,它是此构造的副本,并带有给定的名称。此方法是
FromClause.alias()方法的 VALUES 特定专业化。
-
方法
sqlalchemy.sql.expression.Values.data(values: Sequence[Tuple[Any, ...]]) → Self¶ 返回一个新的
Values构造,并将给定数据添加到数据列表中。例如:
my_values = my_values.data([(1, "value 1"), (2, "value2")])
-
方法
sqlalchemy.sql.expression.Values.lateral(name: str | None = None) → LateralFromClause¶ 返回一个新的
Values,其中设置了 lateral 标志,使其呈现为 LATERAL。另请参阅
-
方法
sqlalchemy.sql.expression.Values.scalar_values() → ScalarValues¶ 返回一个标量
VALUES构造,可用作语句中的 COLUMN 元素。2.0.0b4 版本中的新功能。
-
方法
- 类 sqlalchemy.sql.expression.ScalarValues¶
表示可在语句中用作 COLUMN 元素的标量
VALUES构造。ScalarValues对象由Values.scalar_values()方法创建。 当Values在IN或NOT IN条件中使用时,它也会自动生成。2.0.0b4 版本中的新功能。
类签名
类
sqlalchemy.sql.expression.ScalarValues(sqlalchemy.sql.roles.InElementRole,sqlalchemy.sql.expression.GroupedElement,sqlalchemy.sql.expression.ColumnElement)
标签样式常量¶
与 GenerativeSelect.set_label_style() 方法一起使用的常量。
| 对象名称 | 描述 |
|---|---|
可以传递给 |
- 类 sqlalchemy.sql.expression.SelectLabelStyle¶
可以传递给
Select.set_label_style()的标签样式常量。成员
LABEL_STYLE_DEFAULT, LABEL_STYLE_DISAMBIGUATE_ONLY, LABEL_STYLE_NONE, LABEL_STYLE_TABLENAME_PLUS_COL
类签名
类
sqlalchemy.sql.expression.SelectLabelStyle(enum.Enum)-
属性
sqlalchemy.sql.expression.SelectLabelStyle.LABEL_STYLE_DEFAULT = 2¶ 默认标签样式,指的是
LABEL_STYLE_DISAMBIGUATE_ONLY。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY = 2¶ 标签样式,指示当生成 SELECT 语句的列子句时,名称与现有名称冲突的列应使用半匿名标签进行标记。
在下面,大多数列名保持不变,除了名称
columna的第二次出现,它使用标签columna_1进行标记,以将其与tablea.columna的标签区分开。>>> from sqlalchemy import ( ... table, ... column, ... select, ... true, ... LABEL_STYLE_DISAMBIGUATE_ONLY, ... ) >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print( ... select(table1, table2) ... .join(table2, true()) ... .set_label_style(LABEL_STYLE_DISAMBIGUATE_ONLY) ... )
SELECT table1.columna, table1.columnb, table2.columna AS columna_1, table2.columnc FROM table1 JOIN table2 ON true与
GenerativeSelect.set_label_style()方法一起使用,LABEL_STYLE_DISAMBIGUATE_ONLY是 1.x 样式 ORM 查询之外的所有 SELECT 语句的默认标签样式。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.SelectLabelStyle.LABEL_STYLE_NONE = 0¶ 标签样式,指示不应将任何自动标签应用于 SELECT 语句的列子句。
在下面,名为
columna的列都按原样呈现,这意味着名称columna只能指结果集中此名称的第一次出现,以及语句用作子查询的情况>>> from sqlalchemy import table, column, select, true, LABEL_STYLE_NONE >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print( ... select(table1, table2) ... .join(table2, true()) ... .set_label_style(LABEL_STYLE_NONE) ... )
SELECT table1.columna, table1.columnb, table2.columna, table2.columnc FROM table1 JOIN table2 ON true与
Select.set_label_style()方法一起使用。1.4 版本新增。
-
属性
sqlalchemy.sql.expression.SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL = 1¶ 标签样式,指示当生成 SELECT 语句的列子句时,所有列都应标记为
<tablename>_<columnname>,以消除从不同表、别名或子查询引用的同名列的歧义。在下面,所有列名都给出了标签,以便两个同名列
columna被消除歧义为table1_columna和table2_columna>>> from sqlalchemy import ( ... table, ... column, ... select, ... true, ... LABEL_STYLE_TABLENAME_PLUS_COL, ... ) >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print( ... select(table1, table2) ... .join(table2, true()) ... .set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL) ... )
SELECT table1.columna AS table1_columna, table1.columnb AS table1_columnb, table2.columna AS table2_columna, table2.columnc AS table2_columnc FROM table1 JOIN table2 ON true与
GenerativeSelect.set_label_style()方法一起使用。 等效于旧版方法Select.apply_labels();LABEL_STYLE_TABLENAME_PLUS_COL是 SQLAlchemy 的旧版自动标记样式。LABEL_STYLE_DISAMBIGUATE_ONLY提供了一种侵入性较小的方法来消除同名列表达式的歧义。1.4 版本新增。
-
属性
flambé! 龙和 The Alchemist 图像设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。 文档最后生成时间:Tue 11 Mar 2025 02:40:17 PM EDT