SQLAlchemy 2.0 文档
SQLAlchemy Core
- SQL 语句和表达式 API
- 列元素和表达式¶
- 列元素基础构造函数
- 列元素修改器构造函数
- 列元素类文档
BinaryExpression
BindParameter
Case
Cast
ClauseList
ColumnClause
ColumnCollection
ColumnCollection.add()
ColumnCollection.as_readonly()
ColumnCollection.clear()
ColumnCollection.compare()
ColumnCollection.contains_column()
ColumnCollection.corresponding_column()
ColumnCollection.get()
ColumnCollection.items()
ColumnCollection.keys()
ColumnCollection.update()
ColumnCollection.values()
ColumnElement
ColumnElement.__eq__()
ColumnElement.__le__()
ColumnElement.__lt__()
ColumnElement.__ne__()
ColumnElement.all_()
ColumnElement.allows_lambda
ColumnElement.anon_key_label
ColumnElement.anon_label
ColumnElement.any_()
ColumnElement.asc()
ColumnElement.base_columns
ColumnElement.between()
ColumnElement.bitwise_and()
ColumnElement.bitwise_lshift()
ColumnElement.bitwise_not()
ColumnElement.bitwise_or()
ColumnElement.bitwise_rshift()
ColumnElement.bitwise_xor()
ColumnElement.bool_op()
ColumnElement.cast()
ColumnElement.collate()
ColumnElement.comparator
ColumnElement.compare()
ColumnElement.compile()
ColumnElement.concat()
ColumnElement.contains()
ColumnElement.desc()
ColumnElement.description
ColumnElement.distinct()
ColumnElement.endswith()
ColumnElement.entity_namespace
ColumnElement.expression
ColumnElement.foreign_keys
ColumnElement.get_children()
ColumnElement.icontains()
ColumnElement.iendswith()
ColumnElement.ilike()
ColumnElement.in_()
ColumnElement.inherit_cache
ColumnElement.is_()
ColumnElement.is_clause_element
ColumnElement.is_distinct_from()
ColumnElement.is_dml
ColumnElement.is_not()
ColumnElement.is_not_distinct_from()
ColumnElement.is_selectable
ColumnElement.isnot()
ColumnElement.isnot_distinct_from()
ColumnElement.istartswith()
ColumnElement.key
ColumnElement.label()
ColumnElement.like()
ColumnElement.match()
ColumnElement.negation_clause
ColumnElement.not_ilike()
ColumnElement.not_in()
ColumnElement.not_like()
ColumnElement.notilike()
ColumnElement.notin_()
ColumnElement.notlike()
ColumnElement.nulls_first()
ColumnElement.nulls_last()
ColumnElement.nullsfirst()
ColumnElement.nullslast()
ColumnElement.op()
ColumnElement.operate()
ColumnElement.params()
ColumnElement.primary_key
ColumnElement.proxy_set
ColumnElement.regexp_match()
ColumnElement.regexp_replace()
ColumnElement.reverse_operate()
ColumnElement.self_group()
ColumnElement.shares_lineage()
ColumnElement.startswith()
ColumnElement.stringify_dialect
ColumnElement.supports_execution
ColumnElement.timetuple
ColumnElement.type
ColumnElement.unique_params()
ColumnElement.uses_inspection
ColumnExpressionArgument
ColumnOperators
ColumnOperators.__add__()
ColumnOperators.__and__()
ColumnOperators.__eq__()
ColumnOperators.__floordiv__()
ColumnOperators.__ge__()
ColumnOperators.__getitem__()
ColumnOperators.__gt__()
ColumnOperators.__hash__()
ColumnOperators.__invert__()
ColumnOperators.__le__()
ColumnOperators.__lshift__()
ColumnOperators.__lt__()
ColumnOperators.__mod__()
ColumnOperators.__mul__()
ColumnOperators.__ne__()
ColumnOperators.__neg__()
ColumnOperators.__or__()
ColumnOperators.__radd__()
ColumnOperators.__rfloordiv__()
ColumnOperators.__rmod__()
ColumnOperators.__rmul__()
ColumnOperators.__rshift__()
ColumnOperators.__rsub__()
ColumnOperators.__rtruediv__()
ColumnOperators.__sa_operate__()
ColumnOperators.__sub__()
ColumnOperators.__truediv__()
ColumnOperators.all_()
ColumnOperators.any_()
ColumnOperators.asc()
ColumnOperators.between()
ColumnOperators.bitwise_and()
ColumnOperators.bitwise_lshift()
ColumnOperators.bitwise_not()
ColumnOperators.bitwise_or()
ColumnOperators.bitwise_rshift()
ColumnOperators.bitwise_xor()
ColumnOperators.bool_op()
ColumnOperators.collate()
ColumnOperators.concat()
ColumnOperators.contains()
ColumnOperators.desc()
ColumnOperators.distinct()
ColumnOperators.endswith()
ColumnOperators.icontains()
ColumnOperators.iendswith()
ColumnOperators.ilike()
ColumnOperators.in_()
ColumnOperators.is_()
ColumnOperators.is_distinct_from()
ColumnOperators.is_not()
ColumnOperators.is_not_distinct_from()
ColumnOperators.isnot()
ColumnOperators.isnot_distinct_from()
ColumnOperators.istartswith()
ColumnOperators.like()
ColumnOperators.match()
ColumnOperators.not_ilike()
ColumnOperators.not_in()
ColumnOperators.not_like()
ColumnOperators.notilike()
ColumnOperators.notin_()
ColumnOperators.notlike()
ColumnOperators.nulls_first()
ColumnOperators.nulls_last()
ColumnOperators.nullsfirst()
ColumnOperators.nullslast()
ColumnOperators.op()
ColumnOperators.operate()
ColumnOperators.regexp_match()
ColumnOperators.regexp_replace()
ColumnOperators.reverse_operate()
ColumnOperators.startswith()
ColumnOperators.timetuple
Extract
False_
FunctionFilter
Label
Null
Operators
Over
SQLColumnExpression
TextClause
TryCast
Tuple
WithinGroup
WrapsColumnExpression
True_
TypeCoerce
UnaryExpression
- 列元素类型实用程序
- 运算符参考
- SELECT 和相关构造
- 插入、更新、删除
- SQL 和通用函数
- 自定义 SQL 构造和编译扩展
- 表达式序列化扩展
- SQL 表达式语言基础构造
- 访问器和遍历实用程序
- 列元素和表达式¶
- 模式定义语言
- SQL 数据类型对象
- 引擎和连接使用
- 核心 API 基础
项目版本
- 上一章: SQL 语句和表达式 API
- 下一章: 运算符参考
- 上一级: 首页
- 本页内容
- 列元素和表达式
- 列元素基础构造函数
- 列元素修改器构造函数
- 列元素类文档
BinaryExpression
BindParameter
Case
Cast
ClauseList
ColumnClause
ColumnCollection
ColumnCollection.add()
ColumnCollection.as_readonly()
ColumnCollection.clear()
ColumnCollection.compare()
ColumnCollection.contains_column()
ColumnCollection.corresponding_column()
ColumnCollection.get()
ColumnCollection.items()
ColumnCollection.keys()
ColumnCollection.update()
ColumnCollection.values()
ColumnElement
ColumnElement.__eq__()
ColumnElement.__le__()
ColumnElement.__lt__()
ColumnElement.__ne__()
ColumnElement.all_()
ColumnElement.allows_lambda
ColumnElement.anon_key_label
ColumnElement.anon_label
ColumnElement.any_()
ColumnElement.asc()
ColumnElement.base_columns
ColumnElement.between()
ColumnElement.bitwise_and()
ColumnElement.bitwise_lshift()
ColumnElement.bitwise_not()
ColumnElement.bitwise_or()
ColumnElement.bitwise_rshift()
ColumnElement.bitwise_xor()
ColumnElement.bool_op()
ColumnElement.cast()
ColumnElement.collate()
ColumnElement.comparator
ColumnElement.compare()
ColumnElement.compile()
ColumnElement.concat()
ColumnElement.contains()
ColumnElement.desc()
ColumnElement.description
ColumnElement.distinct()
ColumnElement.endswith()
ColumnElement.entity_namespace
ColumnElement.expression
ColumnElement.foreign_keys
ColumnElement.get_children()
ColumnElement.icontains()
ColumnElement.iendswith()
ColumnElement.ilike()
ColumnElement.in_()
ColumnElement.inherit_cache
ColumnElement.is_()
ColumnElement.is_clause_element
ColumnElement.is_distinct_from()
ColumnElement.is_dml
ColumnElement.is_not()
ColumnElement.is_not_distinct_from()
ColumnElement.is_selectable
ColumnElement.isnot()
ColumnElement.isnot_distinct_from()
ColumnElement.istartswith()
ColumnElement.key
ColumnElement.label()
ColumnElement.like()
ColumnElement.match()
ColumnElement.negation_clause
ColumnElement.not_ilike()
ColumnElement.not_in()
ColumnElement.not_like()
ColumnElement.notilike()
ColumnElement.notin_()
ColumnElement.notlike()
ColumnElement.nulls_first()
ColumnElement.nulls_last()
ColumnElement.nullsfirst()
ColumnElement.nullslast()
ColumnElement.op()
ColumnElement.operate()
ColumnElement.params()
ColumnElement.primary_key
ColumnElement.proxy_set
ColumnElement.regexp_match()
ColumnElement.regexp_replace()
ColumnElement.reverse_operate()
ColumnElement.self_group()
ColumnElement.shares_lineage()
ColumnElement.startswith()
ColumnElement.stringify_dialect
ColumnElement.supports_execution
ColumnElement.timetuple
ColumnElement.type
ColumnElement.unique_params()
ColumnElement.uses_inspection
ColumnExpressionArgument
ColumnOperators
ColumnOperators.__add__()
ColumnOperators.__and__()
ColumnOperators.__eq__()
ColumnOperators.__floordiv__()
ColumnOperators.__ge__()
ColumnOperators.__getitem__()
ColumnOperators.__gt__()
ColumnOperators.__hash__()
ColumnOperators.__invert__()
ColumnOperators.__le__()
ColumnOperators.__lshift__()
ColumnOperators.__lt__()
ColumnOperators.__mod__()
ColumnOperators.__mul__()
ColumnOperators.__ne__()
ColumnOperators.__neg__()
ColumnOperators.__or__()
ColumnOperators.__radd__()
ColumnOperators.__rfloordiv__()
ColumnOperators.__rmod__()
ColumnOperators.__rmul__()
ColumnOperators.__rshift__()
ColumnOperators.__rsub__()
ColumnOperators.__rtruediv__()
ColumnOperators.__sa_operate__()
ColumnOperators.__sub__()
ColumnOperators.__truediv__()
ColumnOperators.all_()
ColumnOperators.any_()
ColumnOperators.asc()
ColumnOperators.between()
ColumnOperators.bitwise_and()
ColumnOperators.bitwise_lshift()
ColumnOperators.bitwise_not()
ColumnOperators.bitwise_or()
ColumnOperators.bitwise_rshift()
ColumnOperators.bitwise_xor()
ColumnOperators.bool_op()
ColumnOperators.collate()
ColumnOperators.concat()
ColumnOperators.contains()
ColumnOperators.desc()
ColumnOperators.distinct()
ColumnOperators.endswith()
ColumnOperators.icontains()
ColumnOperators.iendswith()
ColumnOperators.ilike()
ColumnOperators.in_()
ColumnOperators.is_()
ColumnOperators.is_distinct_from()
ColumnOperators.is_not()
ColumnOperators.is_not_distinct_from()
ColumnOperators.isnot()
ColumnOperators.isnot_distinct_from()
ColumnOperators.istartswith()
ColumnOperators.like()
ColumnOperators.match()
ColumnOperators.not_ilike()
ColumnOperators.not_in()
ColumnOperators.not_like()
ColumnOperators.notilike()
ColumnOperators.notin_()
ColumnOperators.notlike()
ColumnOperators.nulls_first()
ColumnOperators.nulls_last()
ColumnOperators.nullsfirst()
ColumnOperators.nullslast()
ColumnOperators.op()
ColumnOperators.operate()
ColumnOperators.regexp_match()
ColumnOperators.regexp_replace()
ColumnOperators.reverse_operate()
ColumnOperators.startswith()
ColumnOperators.timetuple
Extract
False_
FunctionFilter
Label
Null
Operators
Over
SQLColumnExpression
TextClause
TryCast
Tuple
WithinGroup
WrapsColumnExpression
True_
TypeCoerce
UnaryExpression
- 列元素类型实用程序
列元素和表达式¶
表达式 API 由一系列类组成,每个类都代表 SQL 字符串中的特定词法元素。这些类组合在一起形成一个更大的结构,从而构成一个语句构造,该语句构造可以编译成一个字符串表示形式,该字符串表示形式可以传递给数据库。这些类按层次结构组织,从最底层的 ClauseElement
类开始。主要子类包括 ColumnElement
,它代表 SQL 语句中任何基于列的表达式的作用,例如在列子句、WHERE 子句和 ORDER BY 子句中,以及 FromClause
,它代表放置在 SELECT 语句的 FROM 子句中的令牌的作用。
列元素基础构造函数¶
从 sqlalchemy
命名空间导入的独立函数,在构建 SQLAlchemy 表达式语言构造时使用。
对象名称 | 描述 |
---|---|
and_(*clauses) |
生成由 |
bindparam(key[, value, type_, unique, ...]) |
生成一个“绑定表达式”。 |
bitwise_not(expr) |
生成一个一元按位 NOT 子句,通常通过 |
case(*whens, [value, else_]) |
生成一个 |
cast(expression, type_) |
生成一个 |
column(text[, type_, is_literal, _selectable]) |
生成一个 |
表示一个“自定义”运算符。 |
|
distinct(expr) |
生成一个列表达式级的 unary |
extract(field, expr) |
返回一个 |
false() |
返回一个 |
生成 SQL 函数表达式。 |
|
lambda_stmt(lmb[, enable_tracking, track_closure_variables, track_on, ...]) |
生成一个作为 lambda 缓存的 SQL 语句。 |
literal(value[, type_, literal_execute]) |
返回一个绑定到绑定参数的文字子句。 |
literal_column(text[, type_]) |
生成一个 |
not_(clause) |
返回给定子句的否定,即 |
null() |
返回一个常量 |
or_(*clauses) |
生成由 |
outparam(key[, type_]) |
为支持它们的数据库创建用于函数(存储过程)的“OUT”参数。 |
表示与引用首选项相结合的 SQL 标识符。 |
|
text(text) |
构造一个新的 |
true() |
返回一个常量 |
try_cast(expression, type_) |
为支持它的后端生成 |
tuple_(*clauses, [types]) |
返回一个 |
type_coerce(expression, type_) |
将 SQL 表达式与特定类型关联,但不呈现 |
- function sqlalchemy.sql.expression.and_(*clauses)¶
生成由
AND
连接的表达式的合取。例如:
from sqlalchemy import and_ stmt = select(users_table).where( and_( users_table.c.name == 'wendy', users_table.c.enrolled == True ) )
and_()
连接也可以使用 Python&
运算符(但请注意,复合表达式需要用括号括起来才能与 Python 运算符优先级行为一起使用)stmt = select(users_table).where( (users_table.c.name == 'wendy') & (users_table.c.enrolled == True) )
and_()
操作在某些情况下也是隐式的;例如,Select.where()
方法可以多次调用语句,这将使每个子句使用and_()
组合。stmt = select(users_table).\ where(users_table.c.name == 'wendy').\ where(users_table.c.enrolled == True)
and_()
构造必须至少提供一个位置参数才能有效;没有参数的and_()
构造不明确。要从给定的表达式列表中生成一个“空”或动态生成的and_()
表达式,应该指定一个true()
(或仅True
)的“默认”元素from sqlalchemy import true criteria = and_(true(), *expressions)
如果不存在其他表达式,上面的表达式将根据后端编译为 SQL 表达式
true
或1 = 1
。如果存在表达式,则true()
值将被忽略,因为它不会影响具有其他元素的 AND 表达式的结果。另请参阅
- function sqlalchemy.sql.expression.bindparam(key: str | None, value: Any = _NoArg.NO_ARG, type_: _TypeEngineArgument[_T] | None = None, unique: bool = False, required: bool | Literal[_NoArg.NO_ARG] = _NoArg.NO_ARG, quote: bool | None = None, callable_: Callable[[], Any] | None = None, expanding: bool = False, isoutparam: bool = False, literal_execute: bool = False) → BindParameter[_T]¶
生成一个“绑定表达式”。
返回值是一个
BindParameter
实例;这是一个ColumnElement
子类,它表示 SQL 表达式中的所谓“占位符”值,该值的实际值在语句在针对数据库连接执行时提供。在 SQLAlchemy 中,
bindparam()
构造具有携带最终在表达式时间使用的实际值的能力。这样,它不仅充当最终填充的“占位符”,而且还充当表示所谓“不安全”值的工具,这些值不应直接在 SQL 语句中呈现,而应传递给 DBAPI 作为需要正确转义和可能处理类型安全性的值。当显式使用
bindparam()
时,用例通常是传统参数延迟的一种;bindparam()
构造接受一个名称,然后可以在执行时引用。from sqlalchemy import bindparam stmt = select(users_table).where( users_table.c.name == bindparam("username") )
上面的语句在渲染时会产生类似于以下的 SQL
SELECT id, name FROM user WHERE name = :username
为了填充
:username
的值,该值通常会在执行时应用于类似于Connection.execute()
的方法。result = connection.execute(stmt, {"username": "wendy"})
显式使用
bindparam()
在生成将被多次调用的 UPDATE 或 DELETE 语句时也很常见,其中语句的 WHERE 条件将在每次调用时发生改变,例如stmt = ( users_table.update() .where(user_table.c.name == bindparam("username")) .values(fullname=bindparam("fullname")) ) connection.execute( stmt, [ {"username": "wendy", "fullname": "Wendy Smith"}, {"username": "jack", "fullname": "Jack Jones"}, ], )
SQLAlchemy 的 Core 表达式系统广泛地隐式使用了
bindparam()
。通常,传递给几乎所有 SQL 表达式函数的 Python 字面值都会被强制转换为固定的bindparam()
结构。例如,给定一个像这样的比较操作expr = users_table.c.name == 'Wendy'
上面的表达式将生成一个
BinaryExpression
结构,其中左侧是代表name
列的Column
对象,右侧是代表字面值的BindParameter
。print(repr(expr.right)) BindParameter('%(4327771088 name)s', 'Wendy', type_=String())
上面的表达式将渲染出类似于以下的 SQL
user.name = :name_1
其中
:name_1
参数名是匿名名称。实际字符串Wendy
不在渲染的字符串中,但会被保留,并在语句执行中被使用。如果我们调用类似于以下的语句stmt = select(users_table).where(users_table.c.name == 'Wendy') result = connection.execute(stmt)
我们会看到类似于以下的 SQL 日志输出
SELECT "user".id, "user".name FROM "user" WHERE "user".name = %(name_1)s {'name_1': 'Wendy'}
上面,我们看到
Wendy
作为参数传递给数据库,而占位符:name_1
以目标数据库的适当形式渲染,在本例中是 PostgreSQL 数据库。类似地,当处理 CRUD 语句时,
bindparam()
会在“VALUES”部分被自动调用。insert()
构造会生成一个INSERT
表达式,该表达式将在语句执行时根据传递的参数生成绑定的占位符,例如stmt = users_table.insert() result = connection.execute(stmt, {"name": "Wendy"})
上面的语句将产生类似于以下的 SQL 输出
INSERT INTO "user" (name) VALUES (%(name)s) {'name': 'Wendy'}
Insert
构造在编译/执行时会渲染一个单一的bindparam()
,该参数会镜像我们传递给Connection.execute()
方法的单个name
参数的列名name
。- 参数:
key¶ –
此绑定参数的键(例如名称)。将用于为使用命名参数的方言生成的 SQL 语句。当作为编译操作的一部分时,此值可能会被修改,如果其他
BindParameter
对象具有相同的键,或者如果它的长度过长并且需要截断。如果省略,将为绑定参数生成一个“匿名”名称;当给定要绑定的值时,最终结果等效于使用要绑定的值调用
literal()
函数,特别是当bindparam.unique
参数也提供时。value¶ – 此绑定参数的初始值。如果语句执行方法没有为这个特定参数名称指示其他值,则将在语句执行时用作传递给 DBAPI 的此参数的值。默认为
None
。callable_¶ – 代替“value”的可调用函数。该函数将在语句执行时被调用以确定最终值。用于在创建子句结构时无法确定实际绑定值的场景,但仍然需要嵌入绑定值。
type_¶ –
一个
TypeEngine
类或实例,表示此bindparam()
的可选数据类型。如果未传递,则可能会根据给定值自动确定绑定的类型;例如,简单的 Python 类型,如str
、int
、bool
可能会导致自动选择String
、Integer
或Boolean
类型。bindparam()
的类型很重要,因为该类型将在将值传递给数据库之前对该值进行预处理。例如,一个引用日期时间值的bindparam()
,并被指定为持有DateTime
类型,可能会在将值传递给数据库之前对该值进行必要的转换(例如在 SQLite 上进行字符串化)。unique¶ – 如果为 True,如果另一个具有相同名称的
BindParameter
已经位于包含的表达式中,则将修改此BindParameter
的键名称。此标志通常由内部机制在生成所谓的“匿名”绑定表达式时使用,它通常不适用于显式命名的bindparam()
结构。required¶ – 如果为
True
,则在执行时需要一个值。如果没有传递,如果既没有传递bindparam.value
也没有传递bindparam.callable
,则默认为True
。如果这两个参数中的任何一个存在,则bindparam.required
默认为False
。quote¶ – 如果此参数名需要引号,并且当前不被视为 SQLAlchemy 保留字;这目前仅适用于 Oracle 后端,在 Oracle 后端,绑定名称有时必须被引号括起来。
isoutparam¶ – 如果为 True,则参数应该被视为存储过程的“OUT”参数。这适用于支持 OUT 参数的后端,例如 Oracle。
expanding¶ –
如果为 True,则此参数将在执行时被视为“扩展”参数;参数值预期是一个序列,而不是一个标量值,并且字符串 SQL 语句将在每次执行时进行转换以适应具有传递给 DBAPI 的可变数量参数槽的序列。这是为了允许在使用 IN 子句时使用语句缓存。
注意
“扩展”功能不支持“executemany”类型的参数集。
1.2 版本新增。
1.3 版本变更:“扩展”绑定参数功能现在支持空列表。
literal_execute¶ –
如果为 True,则绑定参数将在编译阶段使用特殊的“POSTCOMPILE”标记进行渲染,SQLAlchemy 编译器将在语句执行时将参数的最终值渲染到 SQL 语句中,省略从传递给 DBAPI
cursor.execute()
的参数字典/列表中的值。这产生了与使用literal_binds
编译标志类似的效果,但是是在语句被发送到 DBAPIcursor.execute()
方法时发生的,而不是在语句被编译时发生的。此功能的主要用途是为无法在这些上下文中容纳绑定参数的数据库驱动程序渲染 LIMIT/OFFSET 子句,同时允许在编译级别缓存 SQL 结构。版本 1.4 中的新增内容: 添加了“post compile”绑定参数
另请参阅
发送参数 - 在 SQLAlchemy 统一教程 中
- function sqlalchemy.sql.expression.bitwise_not(expr: _ColumnExpressionArgument[_T]) → UnaryExpression[_T]¶
生成一个一元按位 NOT 子句,通常通过
~
运算符实现。不要与布尔否定
not_()
混淆。版本 2.0.2 中的新增内容。
另请参阅
- function sqlalchemy.sql.expression.case(*whens: typing_Tuple[_ColumnExpressionArgument[bool], Any] | Mapping[Any, Any], value: Any | None = None, else_: Any | None = None) → Case[Any]¶
生成一个
CASE
表达式。SQL 中的
CASE
结构是一个条件对象,在某种程度上类似于其他语言中的“if/then”结构。它返回一个Case
实例。case()
的通常形式传递一系列“when”结构,即以元组形式传递条件和结果的列表from sqlalchemy import case stmt = select(users_table).\ where( case( (users_table.c.name == 'wendy', 'W'), (users_table.c.name == 'jack', 'J'), else_='E' ) )
上面的语句将生成类似于以下 SQL 的语句
SELECT id, name FROM user WHERE CASE WHEN (name = :name_1) THEN :param_1 WHEN (name = :name_2) THEN :param_2 ELSE :param_3 END
当需要将多个值对单个父列进行简单的相等表达式比较时,
case()
还有一个使用case.value
参数的“简写”形式,该参数传递一个要比较的列表达式。在这种形式下,case.whens
参数作为字典传递,包含要比较的表达式,映射到结果表达式。下面的语句等同于前面的语句stmt = select(users_table).\ where( case( {"wendy": "W", "jack": "J"}, value=users_table.c.name, else_='E' ) )
在
case.whens
以及case.else_
中作为结果值接受的值将从 Python 字面量强制转换为bindparam()
结构。SQL 表达式(例如ColumnElement
结构)也被接受。要将文字字符串表达式强制转换为内联渲染的常量表达式,请使用literal_column()
结构,例如from sqlalchemy import case, literal_column case( ( orderline.c.qty > 100, literal_column("'greaterthan100'") ), ( orderline.c.qty > 10, literal_column("'greaterthan10'") ), else_=literal_column("'lessthan10'") )
以上将渲染给定的常量,而不会为结果值使用绑定参数(但仍会为比较值使用绑定参数),例如
CASE WHEN (orderline.qty > :qty_1) THEN 'greaterthan100' WHEN (orderline.qty > :qty_2) THEN 'greaterthan10' ELSE 'lessthan10' END
- 参数:
*whens¶ –
要比较的标准,
case.whens
接受两种不同的形式,这取决于是否使用case.value
。版本 1.4 中的更改: 现在,
case()
函数现在接受一系列 WHEN 条件作为位置参数在第一种形式中,它接受作为位置参数传递的多个 2 元组;每个 2 元组由
(<sql expression>, <value>)
组成,其中 SQL 表达式是一个布尔表达式,“value” 是一个结果值,例如case( (users_table.c.name == 'wendy', 'W'), (users_table.c.name == 'jack', 'J') )
在第二种形式中,它接受一个 Python 字典,其中比较值映射到结果值;这种形式要求
case.value
存在,并且使用==
运算符比较值,例如case( {"wendy": "W", "jack": "J"}, value=users_table.c.name )
value¶ – 一个可选的 SQL 表达式,它将用作传递给
case.whens
的字典中候选值的固定“比较点”。else_¶ – 一个可选的 SQL 表达式,如果
case.whens
中的所有表达式都计算为假,它将是CASE
结构的计算结果。省略时,大多数数据库会在没有“when”表达式计算为真的情况下生成 NULL 结果。
- function sqlalchemy.sql.expression.cast(expression: _ColumnExpressionOrLiteralArgument[Any], type_: _TypeEngineArgument[_T]) → Cast[_T]¶
生成一个
CAST
表达式。例如:
from sqlalchemy import cast, Numeric stmt = select(cast(product_table.c.unit_price, Numeric(10, 4)))
上面的语句将生成类似于以下 SQL 的语句
SELECT CAST(unit_price AS NUMERIC(10, 4)) FROM product
在使用时,
cast()
函数执行两个不同的功能。 首先,它在生成的 SQL 字符串中呈现CAST
表达式。 其次,它将给定类型(例如TypeEngine
类或实例)与 Python 侧的列表达式关联,这意味着该表达式将采用与该类型相关的表达式运算符行为,以及类型的绑定值处理和结果行处理行为。cast()
的另一种方法是type_coerce()
函数。 该函数执行将表达式与特定类型关联的第二个任务,但不会在 SQL 中呈现CAST
表达式。- 参数:
expression¶ – 一个 SQL 表达式,例如
ColumnElement
表达式或将被强制转换为绑定文字值的 Python 字符串。type_¶ – 一个
TypeEngine
类或实例,指示CAST
应应用的类型。
另请参阅
try_cast()
- CAST 的替代方案,在转换失败时导致 NULL,而不是引发错误。 仅某些方言支持。type_coerce()
- CAST 的替代方案,仅在 Python 侧强制类型,这通常足以生成正确的 SQL 和数据强制转换。
- function sqlalchemy.sql.expression.column(text: str, type_: _TypeEngineArgument[_T] | None = None, is_literal: bool = False, _selectable: FromClause | None = None) → ColumnClause[_T]¶
生成一个
ColumnClause
对象。ColumnClause
是Column
类的轻量级类似物。column()
函数可以用仅一个名称调用,例如from sqlalchemy import column id, name = column("id"), column("name") stmt = select(id, name).select_from("user")
上面的语句将生成类似以下 SQL 的语句
SELECT id, name FROM user
一旦构造,
column()
可以像任何其他 SQL 表达式元素一样使用,例如在select()
结构中使用from sqlalchemy.sql import column id, name = column("id"), column("name") stmt = select(id, name).select_from("user")
由
column()
处理的文本假定为类似于数据库列的名称; 如果字符串包含混合大小写、特殊字符或与目标后端的已知保留字匹配,则列表达式将在使用后端确定的引用行为下呈现。 要生成以任何引用规则都不应用的完全方式呈现的文本 SQL 表达式,请使用literal_column()
而不是,或者将True
作为column.is_literal
的值。 此外,最好使用text()
结构来处理完整的 SQL 语句。column()
可以通过将其与table()
函数(它是Table
的轻量级类似物)结合以表方式使用,从而以最少的样板代码生成有效的表结构from sqlalchemy import table, column, select user = table("user", column("id"), column("name"), column("description"), ) stmt = select(user.c.description).where(user.c.name == 'wendy')
像上面说明的那样的
column()
/table()
结构可以以临时的方式创建,并且不像其Table
对等体那样不与任何MetaData
、DDL 或事件关联。- 参数:
text¶ – 元素的文本。
type¶ –
TypeEngine
对象,可以将此ColumnClause
与类型关联。is_literal¶ – 如果为 True,则假定
ColumnClause
是一个精确表达式,无论大小写敏感设置如何,它都将传递到输出而不应用任何引用规则。literal_column()
函数本质上是在传递is_literal=True
的情况下调用column()
。
- class sqlalchemy.sql.expression.custom_op¶
表示一个“自定义”运算符。
custom_op
通常在使用Operators.op()
或Operators.bool_op()
方法创建自定义运算符可调用对象时实例化。 该类也可以在以编程方式构建表达式时直接使用。 例如,要表示“阶乘”运算from sqlalchemy.sql import UnaryExpression from sqlalchemy.sql import operators from sqlalchemy import Numeric unary = UnaryExpression(table.c.somecolumn, modifier=operators.custom_op("!"), type_=Numeric)
类签名
class
sqlalchemy.sql.expression.custom_op
(sqlalchemy.sql.expression.OperatorType
,typing.Generic
)
- function sqlalchemy.sql.expression.distinct(expr: _ColumnExpressionArgument[_T]) → UnaryExpression[_T]¶
生成一个列表达式级的 unary
DISTINCT
子句。这将
DISTINCT
关键字应用于单个列表达式(例如,不是整个语句),并且专门在该列位置呈现; 这用于包含在聚合函数中,例如from sqlalchemy import distinct, func stmt = select(users_table.c.id, func.count(distinct(users_table.c.name)))
上面的语句将生成类似以下语句的语句
SELECT user.id, count(DISTINCT user.name) FROM user
提示
distinct()
函数 **不会** 将 DISTINCT 应用于完整的 SELECT 语句,而是将 DISTINCT 修饰符应用于 **单个列表达式**。 对于通用SELECT DISTINCT
支持,请在Select
上使用Select.distinct()
方法。distinct()
函数也可以用作列级方法,例如ColumnElement.distinct()
,如下所示:stmt = select(func.count(users_table.c.name.distinct()))
distinct()
运算符不同于Select.distinct()
方法Select
,它会生成一个SELECT
语句,其中DISTINCT
应用于整个结果集,例如SELECT DISTINCT
表达式。 有关更多信息,请参阅该方法。
- function sqlalchemy.sql.expression.extract(field: str, expr: _ColumnExpressionArgument[Any]) → Extract¶
返回一个
Extract
构造。这通常可用作
extract()
以及func.extract
,来自func
命名空间。例如:
from sqlalchemy import extract from sqlalchemy import table, column logged_table = table("user", column("id"), column("date_created"), ) stmt = select(logged_table.c.id).where( extract("YEAR", logged_table.c.date_created) == 2021 )
在上面的示例中,该语句用于从数据库中选择
YEAR
组件匹配特定值的 id。同样,您也可以选择提取的组件
stmt = select( extract("YEAR", logged_table.c.date_created) ).where(logged_table.c.id == 1)
EXTRACT
的实现可能在不同的数据库后端之间有所不同。 请提醒用户查阅其数据库文档。
- function sqlalchemy.sql.expression.false() → False_¶
返回一个
False_
构造。例如:
>>> from sqlalchemy import false >>> print(select(t.c.x).where(false()))
SELECT x FROM t WHERE false不支持 true/false 常量的后端将渲染为针对 1 或 0 的表达式
>>> print(select(t.c.x).where(false()))
SELECT x FROM t WHERE 0 = 1true()
和false()
常量还在and_()
或or_()
连接中具有“短路”操作>>> print(select(t.c.x).where(or_(t.c.x > 5, true())))
SELECT x FROM t WHERE true>>> print(select(t.c.x).where(and_(t.c.x > 5, false())))SELECT x FROM t WHERE false另请参阅
- sqlalchemy.sql.expression.func = <sqlalchemy.sql.functions._FunctionGenerator object>¶
生成 SQL 函数表达式。
func
是一个特殊的对象实例,它基于基于名称的属性生成 SQL 函数,例如:>>> print(func.count(1))
count(:param_1)返回的对象是
Function
的实例,并且是面向列的 SQL 元素,与其他元素一样,并以这种方式使用>>> print(select(func.count(table.c.id)))
SELECT count(sometable.id) FROM sometable可以为
func
提供任何名称。 如果 SQLAlchemy 不知道函数名称,它将按原样呈现。 对于 SQLAlchemy 知道的常用 SQL 函数,该名称可以解释为 *通用函数*,它将被适当地编译到目标数据库>>> print(func.current_timestamp())
CURRENT_TIMESTAMP要调用存在于点分隔包中的函数,请以相同的方式指定它们
>>> print(func.stats.yield_curve(5, 10))
stats.yield_curve(:yield_curve_1, :yield_curve_2)SQLAlchemy 可以知道函数的返回类型,以实现特定于类型的词法和基于结果的行为。 例如,为了确保基于字符串的函数返回 Unicode 值并在表达式中类似地被视为字符串,请将
Unicode
指定为类型>>> print(func.my_string(u'hi', type_=Unicode) + ' ' + ... func.my_string(u'there', type_=Unicode))
my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3)func
调用返回的对象通常是Function
的实例。 此对象满足“列”接口,包括比较和标签函数。 该对象也可以传递给Connection
或Engine
的Connectable.execute()
方法,它将在其中首先被包装在 SELECT 语句中print(connection.execute(func.current_timestamp()).scalar())
在少数例外情况下,
func
访问器会将名称重定向到内置表达式,例如cast()
或extract()
,因为这些名称具有众所周知的含义,但从 SQLAlchemy 的角度来看并不完全是“函数”。解释为“通用”函数的函数知道如何自动计算其返回类型。 有关已知通用函数的列表,请参阅 SQL 和通用函数。
注意
func
结构仅有限支持调用独立的“存储过程”,特别是那些具有特殊参数化问题的过程。有关如何使用 DBAPI 级
callproc()
方法用于完全传统的存储过程的详细信息,请参阅 调用存储过程和用户定义函数 部分。
- function sqlalchemy.sql.expression.lambda_stmt(lmb: Callable[[], Any], enable_tracking: bool = True, track_closure_variables: bool = True, track_on: object | None = None, global_track_bound_values: bool = True, track_bound_values: bool = True, lambda_cache: MutableMapping[Tuple[Any, ...], NonAnalyzedFunction | AnalyzedFunction] | None = None) → StatementLambdaElement¶
生成一个作为 lambda 缓存的 SQL 语句。
lambda 中的 Python 代码对象将扫描 Python 字面量,这些字面量将成为绑定参数,以及引用可能变化的 Core 或 ORM 结构的闭包变量。lambda 本身将仅针对检测到的特定一组结构调用一次。
例如:
from sqlalchemy import lambda_stmt stmt = lambda_stmt(lambda: table.select()) stmt += lambda s: s.where(table.c.id == 5) result = connection.execute(stmt)
返回的对象是
StatementLambdaElement
的实例。1.4 版中的新功能。
- 参数:
lmb¶ – 一个 Python 函数,通常是一个 lambda,它不接受任何参数,并返回一个 SQL 表达式结构
enable_tracking¶ – 当为 False 时,将禁用对给定 lambda 中闭包变量或绑定参数更改的所有扫描。对于在所有情况下都不会参数化并产生相同结果的 lambda 使用。
track_closure_variables¶ – 当为 False 时,将不会扫描 lambda 中闭包变量的更改。对于闭包变量状态永远不会改变 lambda 返回的 SQL 结构的 lambda 使用。
track_bound_values¶ – 当为 False 时,将为给定 lambda 禁用绑定参数跟踪。对于不生成任何绑定值或初始绑定值永远不会更改的 lambda 使用。
global_track_bound_values¶ – 当为 False 时,将禁用整个语句的绑定参数跟踪,包括通过
StatementLambdaElement.add_criteria()
方法添加的附加链接。lambda_cache¶ – 一个字典或其他类似映射的对象,其中将存储有关 lambda 的 Python 代码以及 lambda 本身中跟踪的闭包变量的信息。默认为全局 LRU 缓存。此缓存独立于
Connection
对象使用的“compiled_cache”。
- function sqlalchemy.sql.expression.literal(value: Any, type_: _TypeEngineArgument[Any] | None = None, literal_execute: bool = False) → BindParameter[Any]¶
返回一个绑定到绑定参数的文字子句。
当非
ClauseElement
对象(如字符串、整数、日期等)与ColumnElement
子类(如Column
对象)进行比较操作时,会自动创建字面量子句。使用此函数强制生成字面量子句,它将作为具有绑定值的BindParameter
创建。- 参数:
value¶ – 要绑定的值。可以是底层 DB-API 支持的任何 Python 对象,或者可以通过给定的类型参数进行转换。
type_¶ – 可选的
TypeEngine
,它将为该字面量提供绑定参数转换。literal_execute¶ –
可选的 bool,当为 True 时,SQL 引擎将尝试在执行时直接在 SQL 语句中呈现绑定值,而不是作为参数值提供。
2.0 版中的新功能。
- function sqlalchemy.sql.expression.literal_column(text: str, type_: _TypeEngineArgument[_T] | None = None) → ColumnClause[_T]¶
生成一个
ColumnClause
对象,该对象将column.is_literal
标志设置为 True。literal_column()
类似于column()
,只是它更常用于“独立”的列表达式,该表达式完全按原样呈现;而column()
存储一个字符串名称,该名称将被假定为表的组成部分,并且可以被引用;literal_column()
可以是该名称,也可以是任何其他任意以列为导向的表达式。- 参数:
text¶ – 表达式的文本;可以是任何 SQL 表达式。不会应用引用规则。要指定应该应用引用规则的列名表达式,请使用
column()
函数。type_¶ – 可选的
TypeEngine
对象,用于为该列提供结果集转换和附加表达式语义。如果保留为None
,则类型将为NullType
。
- function sqlalchemy.sql.expression.not_(clause: _ColumnExpressionArgument[_T]) → ColumnElement[_T]¶
返回给定子句的否定,即
NOT(clause)
。所有
ColumnElement
子类的~
运算符也被重载,以生成相同的结果。
- function sqlalchemy.sql.expression.or_(*clauses)¶
生成由
OR
连接的表达式的连接。例如:
from sqlalchemy import or_ stmt = select(users_table).where( or_( users_table.c.name == 'wendy', users_table.c.name == 'jack' ) )
or_()
连接也可用作 Python 的|
运算符(但请注意,复合表达式需要用括号括起来才能使用 Python 运算符优先级行为)。stmt = select(users_table).where( (users_table.c.name == 'wendy') | (users_table.c.name == 'jack') )
or_()
结构必须至少有一个位置参数才能有效;没有参数的or_()
结构模棱两可。为了从给定的表达式列表中生成一个“空”或动态生成的or_()
表达式,应指定一个false()
(或仅False
)的“默认”元素。from sqlalchemy import false or_criteria = or_(false(), *expressions)
上述表达式将根据后端编译为 SQL 作为
false
或0 = 1
的表达式。如果存在表达式,则false()
值将被忽略,因为它不会影响具有其他元素的 OR 表达式的结果。另请参阅
- function sqlalchemy.sql.expression.outparam(key: str, type_: TypeEngine[_T] | None = None) → BindParameter[_T]¶
为支持它们的数据库创建用于函数(存储过程)的“OUT”参数。
outparam
可以像普通函数参数一样使用。“输出”值将从CursorResult
对象的out_parameters
属性中获得,该属性返回一个包含值的字典。
- function sqlalchemy.sql.expression.text(text: str) → TextClause¶
构造一个新的
TextClause
子句,直接表示文本 SQL 字符串。例如:
from sqlalchemy import text t = text("SELECT * FROM users") result = connection.execute(t)
text()
相对于普通字符串的优势在于:对绑定参数的支持与后端无关、每个语句的执行选项,以及绑定参数和结果列的类型行为,允许 SQLAlchemy 类型结构在执行以文字形式指定的语句时发挥作用。该结构还可以提供.c
列元素集合,使其能够作为子查询嵌入到其他 SQL 表达式结构中。绑定参数由名称指定,使用格式
:name
。例如:t = text("SELECT * FROM users WHERE id=:user_id") result = connection.execute(t, {"user_id": 12})
对于在内联字符串中需要逐字冒号的 SQL 语句,请使用反斜杠进行转义。
t = text(r"SELECT * FROM users WHERE name='\:username'")
TextClause
结构包括可以提供有关绑定参数的信息以及从文本语句返回的列值的方法(假设它是可执行的 SELECT 类型语句)。TextClause.bindparams()
方法用于提供绑定参数详细信息,而TextClause.columns()
方法允许指定返回列(包括名称和类型)。t = text("SELECT * FROM users WHERE id=:user_id").\ bindparams(user_id=7).\ columns(id=Integer, name=String) for id, name in connection.execute(t): print(id, name)
text()
结构用于在将文字字符串 SQL 片段指定为较大查询的一部分时(例如 SELECT 语句的 WHERE 子句),例如。s = select(users.c.id, users.c.name).where(text("id=:user_id")) result = connection.execute(s, {"user_id": 12})
text()
也用于使用纯文本构建完整的独立语句。因此,SQLAlchemy 将其称为Executable
对象,并且可以像传递到.execute()
方法的任何其他语句一样使用。- 参数:
text¶ –
要创建的 SQL 语句的文本。使用
:<param>
指定绑定参数;它们将编译成其特定于引擎的格式。
另请参阅
- function sqlalchemy.sql.expression.true() → True_¶
返回一个常量
True_
构造。例如:
>>> from sqlalchemy import true >>> print(select(t.c.x).where(true()))
SELECT x FROM t WHERE true不支持 true/false 常量的后端将渲染为针对 1 或 0 的表达式
>>> print(select(t.c.x).where(true()))
SELECT x FROM t WHERE 1 = 1true()
和false()
常量还在and_()
或or_()
连接中具有“短路”操作>>> print(select(t.c.x).where(or_(t.c.x > 5, true())))
SELECT x FROM t WHERE true>>> print(select(t.c.x).where(and_(t.c.x > 5, false())))SELECT x FROM t WHERE false另请参阅
- function sqlalchemy.sql.expression.try_cast(expression: _ColumnExpressionOrLiteralArgument[Any], type_: _TypeEngineArgument[_T]) → TryCast[_T]¶
为支持它的后端生成
TRY_CAST
表达式;这是一种CAST
,对于不可转换的转换返回 NULL。在 SQLAlchemy 中,此构造仅由 SQL Server 方言支持,如果在其他包含的后端上使用,将引发
CompileError
。 但是,第三方后端也可能支持此构造。提示
由于
try_cast()
来自 SQL Server 方言,因此它可以从sqlalchemy.
以及sqlalchemy.dialects.mssql
中导入。try_cast()
返回TryCast
的实例,并且通常与Cast
构造类似;在 SQL 级别,CAST
和TRY_CAST
之间的区别在于TRY_CAST
对不可转换的表达式返回 NULL,例如尝试将字符串"hi"
转换为整数值。例如:
from sqlalchemy import select, try_cast, Numeric stmt = select( try_cast(product_table.c.unit_price, Numeric(10, 4)) )
上面的代码将在 Microsoft SQL Server 上呈现为
SELECT TRY_CAST (product_table.unit_price AS NUMERIC(10, 4)) FROM product_table
New in version 2.0.14:
try_cast()
已从 SQL Server 方言推广到通用构造,其他方言可能支持该构造。
- function sqlalchemy.sql.expression.tuple_(*clauses: _ColumnExpressionArgument[Any], types: Sequence[_TypeEngineArgument[Any]] | None = None) → Tuple¶
返回一个
Tuple
.主要用途是使用
ColumnOperators.in_()
生成复合 IN 构造。from sqlalchemy import tuple_ tuple_(table.c.col1, table.c.col2).in_( [(1, 2), (5, 12), (10, 19)] )
Changed in version 1.3.6: 添加了对 SQLite IN 元组的支持。
警告
复合 IN 构造并非所有后端都支持,目前已知在 PostgreSQL、MySQL 和 SQLite 上有效。不支持的后端会在调用此类表达式时引发
DBAPIError
的子类。
- function sqlalchemy.sql.expression.type_coerce(expression: _ColumnExpressionOrLiteralArgument[Any], type_: _TypeEngineArgument[_T]) → TypeCoerce[_T]¶
将 SQL 表达式与特定类型关联,但不呈现
CAST
。例如:
from sqlalchemy import type_coerce stmt = select(type_coerce(log_table.date_string, StringDateTime()))
上述构造将生成
TypeCoerce
对象,它不会以任何方式修改 SQL 侧的呈现,除了在列子句上下文中生成的标签之外。SELECT date_string AS date_string FROM log
当获取结果行时,
StringDateTime
类型处理器将代表date_string
列应用于结果行。注意
type_coerce()
构造不会呈现任何自己的 SQL 语法,包括它不暗示括号。如果在 CAST 通常存在的括号在运算符上下文中必需的地方使用type_coerce()
,请使用TypeCoerce.self_group()
方法。为了为表达式提供一个命名标签,请使用
ColumnElement.label()
stmt = select( type_coerce(log_table.date_string, StringDateTime()).label('date') )
当文字值或
bindparam()
构造传递给type_coerce()
作为目标时,具有绑定值处理功能的类型也将具有该行为生效。例如,如果一个类型实现了TypeEngine.bind_expression()
方法或TypeEngine.bind_processor()
方法或等效方法,当传递文字值时,这些函数将在语句编译/执行时生效,如# bound-value handling of MyStringType will be applied to the # literal value "some string" stmt = select(type_coerce("some string", MyStringType))
在使用
type_coerce()
处理组合表达式时,请注意 **不会应用括号**。如果在运算符上下文中使用type_coerce()
,并且需要 CAST 通常存在的括号,请使用TypeCoerce.self_group()
方法。>>> some_integer = column("someint", Integer) >>> some_string = column("somestr", String) >>> expr = type_coerce(some_integer + 5, String) + some_string >>> print(expr)
someint + :someint_1 || somestr>>> expr = type_coerce(some_integer + 5, String).self_group() + some_string >>> print(expr)(someint + :someint_1) || somestr- 参数:
expression¶ – SQL 表达式,例如
ColumnElement
表达式或将被强制转换为绑定文字值的 Python 字符串。type_¶ –
TypeEngine
类或实例,指示要强制转换表达式的类型。
- class sqlalchemy.sql.expression.quoted_name¶
表示与引用首选项相结合的 SQL 标识符。
quoted_name
是一个 Python unicode/str 子类,它代表一个特定的标识符名称以及一个quote
标志。此quote
标志在设置为True
或False
时,会覆盖此标识符的自动引用行为,以便无条件引用或不引用名称。如果保留其默认值None
,则引用行为会根据对标记本身的检查,在每个后端的基础上应用于标识符。带有
quote=True
的quoted_name
对象在所谓的“名称规范化”选项的情况下也会被阻止修改。某些数据库后端,如 Oracle、Firebird 和 DB2,会将不区分大小写的名称“规范化”为大写。这些后端的 SQLAlchemy 方言将 SQLAlchemy 的小写意味着不区分大小写的约定转换为这些后端的大写意味着不区分大小写的约定。这里的quote=True
标志将阻止此转换发生,以支持针对此类后端的以全小写形式引用的标识符。通常,在为关键模式结构(如
Table
、Column
等)指定名称时,会自动创建quoted_name
对象。该类也可以显式地作为名称传递给任何接收可以引用的名称的函数。例如,使用Engine.has_table()
方法以及无条件引用的名称from sqlalchemy import create_engine from sqlalchemy import inspect from sqlalchemy.sql import quoted_name engine = create_engine("oracle+cx_oracle://some_dsn") print(inspect(engine).has_table(quoted_name("some_table", True)))
上述逻辑将针对 Oracle 后端运行“是否有表”逻辑,将名称完全作为
"some_table"
传递,而不会转换为大写。更改于版本 1.2: 现在可以从
sqlalchemy.sql
导入quoted_name
结构,除了之前位于sqlalchemy.sql.elements
的位置。成员
类签名
class
sqlalchemy.sql.expression.quoted_name
(sqlalchemy.util.langhelpers.MemoizedSlots
,builtins.str
)-
attribute
sqlalchemy.sql.expression.quoted_name.
quote¶ 字符串是否应无条件地被引用
-
attribute
列元素修饰符构造函数¶
此处列出的函数更常作为任何 ColumnElement
结构的方法提供,例如,label()
函数通常通过 ColumnElement.label()
方法调用。
对象名称 | 描述 |
---|---|
all_(expr) |
生成一个 ALL 表达式。 |
any_(expr) |
生成一个 ANY 表达式。 |
asc(column) |
生成一个升序的 |
between(expr, lower_bound, upper_bound[, symmetric]) |
生成一个 |
collate(expression, collation) |
返回子句 |
desc(column) |
生成一个降序的 |
funcfilter(func, *criterion) |
针对一个函数生成一个 |
label(name, element[, type_]) |
为给定的 |
nulls_first(column) |
为一个 |
nulls_last(column) |
为一个 |
|
|
|
|
over(element[, partition_by, order_by, range_, ...]) |
针对一个函数生成一个 |
within_group(element, *order_by) |
针对一个函数生成一个 |
- function sqlalchemy.sql.expression.all_(expr: _ColumnExpressionArgument[_T]) → CollectionAggregate[bool]¶
生成一个 ALL 表达式。
对于像 PostgreSQL 这样的方言,此运算符适用于
ARRAY
数据类型的使用,对于 MySQL 来说,它可能适用于子查询。例如# renders on PostgreSQL: # '5 = ALL (somearray)' expr = 5 == all_(mytable.c.somearray) # renders on MySQL: # '5 = ALL (SELECT value FROM table)' expr = 5 == all_(select(table.c.value))
使用
None
比较 NULL 可能有效None == all_(mytable.c.somearray)
any_() / all_() 运算符还具有特殊的“操作数翻转”行为,因此,如果 any_() / all_() 用于比较的左侧,使用独立运算符(如
==
、!=
等) (不包括运算符方法,如ColumnOperators.is_()
),则呈现的表达式将被翻转# would render '5 = ALL (column)` all_(mytable.c.column) == 5
或者使用
None
,请注意,这不会执行通常情况下将“IS”渲染为 NULL 的步骤# would render 'NULL = ALL(somearray)' all_(mytable.c.somearray) == None
更改于版本 1.4.26: 修复了在右侧使用 any_() / all_() 比较 NULL 的情况,将其翻转到左侧。
列级
ColumnElement.all_()
方法(不要与ARRAY
级别的Comparator.all()
混淆)是all_(col)
的简写5 == mytable.c.somearray.all_()
- function sqlalchemy.sql.expression.any_(expr: _ColumnExpressionArgument[_T]) → CollectionAggregate[bool]¶
生成一个 ANY 表达式。
对于像 PostgreSQL 这样的方言,此运算符适用于
ARRAY
数据类型的使用,对于 MySQL 来说,它可能适用于子查询。例如# renders on PostgreSQL: # '5 = ANY (somearray)' expr = 5 == any_(mytable.c.somearray) # renders on MySQL: # '5 = ANY (SELECT value FROM table)' expr = 5 == any_(select(table.c.value))
使用
None
或null()
比较 NULL 可能有效None == any_(mytable.c.somearray)
any_() / all_() 运算符还具有特殊的“操作数翻转”行为,因此,如果 any_() / all_() 用于比较的左侧,使用独立运算符(如
==
、!=
等) (不包括运算符方法,如ColumnOperators.is_()
),则呈现的表达式将被翻转# would render '5 = ANY (column)` any_(mytable.c.column) == 5
或者使用
None
,请注意,这不会执行通常情况下将“IS”渲染为 NULL 的步骤# would render 'NULL = ANY(somearray)' any_(mytable.c.somearray) == None
更改于版本 1.4.26: 修复了在右侧使用 any_() / all_() 比较 NULL 的情况,将其翻转到左侧。
列级
ColumnElement.any_()
方法(不要与ARRAY
级别的Comparator.any()
混淆)是any_(col)
的简写5 = mytable.c.somearray.any_()
- function sqlalchemy.sql.expression.asc(column: _ColumnExpressionOrStrLabelArgument[_T]) → UnaryExpression[_T]¶
生成一个升序的
ORDER BY
子句元素。例如
from sqlalchemy import asc stmt = select(users_table).order_by(asc(users_table.c.name))
将生成以下 SQL 代码
SELECT id, name FROM user ORDER BY name ASC
The
asc()
函数是ColumnElement.asc()
方法的独立版本,该方法适用于所有 SQL 表达式,例如stmt = select(users_table).order_by(users_table.c.name.asc())
- 参数:
column¶ – 一个
ColumnElement
(例如,标量 SQL 表达式),将使用该元素应用asc()
操作。
- function sqlalchemy.sql.expression.between(expr: _ColumnExpressionOrLiteralArgument[_T], lower_bound: Any, upper_bound: Any, symmetric: bool = False) → BinaryExpression[bool]¶
生成一个
BETWEEN
谓词子句。例如:
from sqlalchemy import between stmt = select(users_table).where(between(users_table.c.id, 5, 7))
将生成类似以下的 SQL 代码
SELECT id, name FROM user WHERE id BETWEEN :id_1 AND :id_2
The
between()
函数是ColumnElement.between()
方法的独立版本,该方法适用于所有 SQL 表达式,例如stmt = select(users_table).where(users_table.c.id.between(5, 7))
传递给
between()
的所有参数,包括左侧列表达式,如果值不是ColumnElement
子类,都会从 Python 标量值强制转换为该类型。例如,可以像下面这样比较三个固定值print(between(5, 3, 7))
将生成
:param_1 BETWEEN :param_2 AND :param_3
- 参数:
expr¶ – 一个列表达式,通常是一个
ColumnElement
实例,或者是一个 Python 标量表达式,将其强制转换为列表达式,作为BETWEEN
表达式的左侧。lower_bound¶ – 一个列或 Python 标量表达式,作为
BETWEEN
表达式右侧的下限。upper_bound¶ – 一个列或 Python 标量表达式,作为
BETWEEN
表达式右侧的上限。symmetric¶ – 如果为 True,将呈现“ BETWEEN SYMMETRIC ”。请注意,并非所有数据库都支持此语法。
- function sqlalchemy.sql.expression.collate(expression: _ColumnExpressionArgument[str], collation: str) → BinaryExpression[str]¶
返回子句
expression COLLATE collation
。例如
collate(mycolumn, 'utf8_bin')
生成
mycolumn COLLATE utf8_bin
如果排序规则是区分大小写的标识符(例如,包含大写字符),它也会被引用。
Changed in version 1.2: 如果排序规则区分大小写,则会自动应用于 COLLATE 表达式。
- function sqlalchemy.sql.expression.desc(column: _ColumnExpressionOrStrLabelArgument[_T]) → UnaryExpression[_T]¶
生成一个降序的
ORDER BY
子句元素。例如
from sqlalchemy import desc stmt = select(users_table).order_by(desc(users_table.c.name))
将生成以下 SQL 代码
SELECT id, name FROM user ORDER BY name DESC
The
desc()
函数是ColumnElement.desc()
方法的独立版本,该方法适用于所有 SQL 表达式,例如stmt = select(users_table).order_by(users_table.c.name.desc())
- 参数:
column¶ – 一个
ColumnElement
(例如,标量 SQL 表达式),将使用该元素应用desc()
操作。
- function sqlalchemy.sql.expression.funcfilter(func: FunctionElement[_T], *criterion: _ColumnExpressionArgument[bool]) → FunctionFilter[_T]¶
针对一个函数生成一个
FunctionFilter
对象。用于聚合函数和窗口函数,适用于支持“FILTER”子句的数据库后端。
例如:
from sqlalchemy import funcfilter funcfilter(func.count(1), MyClass.name == 'some name')
将生成“COUNT(1) FILTER (WHERE myclass.name = ‘some name’)”。
此函数也可以从
func
构造本身的FunctionElement.filter()
方法获得。
- function sqlalchemy.sql.expression.label(name: str, element: _ColumnExpressionArgument[_T], type_: _TypeEngineArgument[_T] | None = None) → Label[_T]¶
为给定的
ColumnElement
返回一个Label
对象。标签会更改
SELECT
语句的列子句中元素的名称,通常通过AS
SQL 关键字。此功能可以通过
ColumnElement.label()
方法在ColumnElement
上更方便地获得。- 参数:
name¶ – 标签名称
obj¶ – 一个
ColumnElement
。
- function sqlalchemy.sql.expression.nulls_first(column: _ColumnExpressionArgument[_T]) → UnaryExpression[_T]¶
为一个
ORDER BY
表达式生成NULLS FIRST
修饰符。nulls_first()
用于修改asc()
或desc()
生成的表达式,并指示在排序过程中遇到 NULL 值时应如何处理。from sqlalchemy import desc, nulls_first stmt = select(users_table).order_by( nulls_first(desc(users_table.c.name)))
上面 SQL 表达式将类似于
SELECT id, name FROM user ORDER BY name DESC NULLS FIRST
与
asc()
和desc()
一样,nulls_first()
通常通过ColumnElement.nulls_first()
从列表达式本身调用,而不是作为其独立函数版本,如stmt = select(users_table).order_by( users_table.c.name.desc().nulls_first())
在版本 1.4 中更改:
nulls_first()
从之前版本中的nullsfirst()
重命名。为了向后兼容,之前的名称仍然可用。
- function sqlalchemy.sql.expression.nullsfirst()¶
nulls_first()
函数的同义词。在版本 2.0.5 中更改: 恢复了遗失的旧符号
nullsfirst()
。
- function sqlalchemy.sql.expression.nulls_last(column: _ColumnExpressionArgument[_T]) → UnaryExpression[_T]¶
为一个
ORDER BY
表达式生成NULLS LAST
修饰符。nulls_last()
用于修改asc()
或desc()
生成的表达式,并指示在排序过程中遇到 NULL 值时应如何处理。from sqlalchemy import desc, nulls_last stmt = select(users_table).order_by( nulls_last(desc(users_table.c.name)))
上面 SQL 表达式将类似于
SELECT id, name FROM user ORDER BY name DESC NULLS LAST
与
asc()
和desc()
一样,nulls_last()
通常通过ColumnElement.nulls_last()
从列表达式本身调用,而不是作为其独立函数版本,如stmt = select(users_table).order_by( users_table.c.name.desc().nulls_last())
在版本 1.4 中更改:
nulls_last()
从之前版本中的nullslast()
重命名。为了向后兼容,之前的名称仍然可用。
- function sqlalchemy.sql.expression.nullslast()¶
nulls_last()
函数的旧版同义词。在版本 2.0.5 中更改: 恢复了遗失的旧符号
nullslast()
。
- function sqlalchemy.sql.expression.over(element: FunctionElement[_T], partition_by: _ByArgument | None = None, order_by: _ByArgument | None = None, range_: typing_Tuple[int | None, int | None] | None = None, rows: typing_Tuple[int | None, int | None] | None = None) → Over[_T]¶
针对一个函数生成一个
Over
对象。针对聚合或所谓“窗口”函数使用,适用于支持窗口函数的数据库后端。
over()
通常使用FunctionElement.over()
方法调用,例如func.row_number().over(order_by=mytable.c.some_column)
将生成
ROW_NUMBER() OVER(ORDER BY some_column)
范围也可以使用
over.range_
和over.rows
参数。这些相互排斥的参数都接受一个 2 元组,其中包含整数和 None 的组合func.row_number().over( order_by=my_table.c.some_column, range_=(None, 0))
上面将生成
ROW_NUMBER() OVER(ORDER BY some_column RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
None
的值表示“无界”,零值表示“当前行”,负/正整数表示“前导”和“后续”。RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
func.row_number().over(order_by='x', range_=(-5, 10))
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
func.row_number().over(order_by='x', rows=(None, 0))
RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING
func.row_number().over(order_by='x', range_=(-2, None))
RANGE BETWEEN 1 FOLLOWING AND 3 FOLLOWING
func.row_number().over(order_by='x', range_=(1, 3))
- 参数:
element¶ – 一个
FunctionElement
,WithinGroup
或其他兼容构造。partition_by¶ – 列元素或字符串,或其列表,将用作 OVER 结构的 PARTITION BY 子句。
order_by¶ – 列元素或字符串,或其列表,将用作 OVER 结构的 ORDER BY 子句。
range_¶ – 窗口的可选范围子句。这是一个元组值,可以包含整数值或
None
,并将呈现 RANGE BETWEEN PRECEDING / FOLLOWING 子句。rows¶ – 窗口的可选行子句。这是一个元组值,可以包含整数或 None,并将渲染一个 ROWS BETWEEN PRECEDING / FOLLOWING 子句。
此函数也可以从
func
构造本身通过FunctionElement.over()
方法访问。
- function sqlalchemy.sql.expression.within_group(element: FunctionElement[_T], *order_by: _ColumnExpressionArgument[Any]) → WithinGroup[_T]¶
针对一个函数生成一个
WithinGroup
对象。用于针对所谓的“有序集聚合”和“假设集聚合”函数,包括
percentile_cont
,rank
,dense_rank
等。within_group()
通常使用FunctionElement.within_group()
方法调用,例如from sqlalchemy import within_group stmt = select( department.c.id, func.percentile_cont(0.5).within_group( department.c.salary.desc() ) )
上面的语句将生成类似于
SELECT department.id, percentile_cont(0.5) WITHIN GROUP (ORDER BY department.salary DESC)
的 SQL。- 参数:
element¶ – 一个
FunctionElement
构造,通常由func
生成。*order_by¶ – 一个或多个将用作 WITHIN GROUP 构造的 ORDER BY 子句的列元素。
列元素类文档¶
这里的类使用在 列元素基础构造函数 和 列元素修改器构造函数 中列出的构造函数生成。
对象名称 | 描述 |
---|---|
表示一个 |
|
表示一个“绑定表达式”。 |
|
表示一个 |
|
表示一个 |
|
描述一个由运算符分隔的子句列表。 |
|
表示来自任何文本字符串的列表达式。 |
|
一个 |
|
表示一个适合在语句的“columns”子句、WHERE 子句等中使用的面向列的 SQL 表达式。 |
|
通用“列表达式”参数。 |
|
为 |
|
表示一个 SQL EXTRACT 子句, |
|
表示 SQL 语句中的 |
|
表示一个函数 FILTER 子句。 |
|
表示一个列标签 (AS)。 |
|
表示 SQL 语句中的 NULL 关键字。 |
|
比较和逻辑运算符的基础。 |
|
表示一个 OVER 子句。 |
|
一个类型,可用于指示任何 SQL 列元素或充当其替代的对象。 |
|
表示一个文字 SQL 文本片段。 |
|
表示 SQL 语句中的 |
|
表示一个 TRY_CAST 表达式。 |
|
表示一个 SQL 元组。 |
|
表示一个 Python 端类型强制转换包装器。 |
|
定义一个“一元”表达式。 |
|
表示一个 WITHIN GROUP (ORDER BY) 子句。 |
|
混合类,将一个 |
- class sqlalchemy.sql.expression.BinaryExpression¶
表示一个
LEFT <operator> RIGHT
的表达式。一个
BinaryExpression
只要两个列表达式在 Python 二元表达式中使用就会自动生成>>> from sqlalchemy.sql import column >>> column('a') + column('b') <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> >>> print(column('a') + column('b'))
a + b类签名
class
sqlalchemy.sql.expression.BinaryExpression
(sqlalchemy.sql.expression.OperatorExpression
)
- class sqlalchemy.sql.expression.BindParameter¶
表示一个“绑定表达式”。
BindParameter
使用bindparam()
函数显式调用,如from sqlalchemy import bindparam stmt = select(users_table).where( users_table.c.name == bindparam("username") )
有关
BindParameter
的详细讨论请参见bindparam()
。另请参阅
类签名
class
sqlalchemy.sql.expression.BindParameter
(sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.KeyedColumnElement
)-
attribute
sqlalchemy.sql.expression.BindParameter.
effective_value¶ 返回此绑定参数的值,考虑是否设置了
callable
参数。如果存在,将评估并返回
callable
值,否则返回value
。
-
attribute
sqlalchemy.sql.expression.BindParameter.
inherit_cache: bool | None = True¶ 指示此
HasCacheKey
实例是否应使用其直接超类的缓存键生成方案。该属性默认为
None
,这表示一个构造函数尚未考虑它是否适合参与缓存;这在功能上等同于将值设置为False
,只是还会发出警告。如果与对象对应的 SQL 不根据此类的本地属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True
。另请参阅
为自定义结构启用缓存支持 - 为第三方或用户定义的 SQL 结构设置
HasCacheKey.inherit_cache
属性的一般指南。
-
方法
sqlalchemy.sql.expression.BindParameter.
render_literal_execute() → BindParameter[_T]¶ 生成此绑定参数的副本,该副本将启用
BindParameter.literal_execute
标志。BindParameter.literal_execute
标志将使参数在使用[POSTCOMPILE]
形式的编译 SQL 字符串中呈现,这是一种特殊形式,在 SQL 执行时将转换为参数的文字值的呈现。基本原理是支持缓存可以在最终传递给 DBAPI 的 SQL 字符串中嵌入每条语句文字值的 SQL 语句字符串,例如 LIMIT 和 OFFSET 参数。特别是,方言可能希望在自定义编译方案中使用此方法。版本 1.4.5 中新增。
另请参阅
-
attribute
- 类 sqlalchemy.sql.expression.Case¶
表示一个
CASE
表达式。from sqlalchemy import case stmt = select(users_table). where( case( (users_table.c.name == 'wendy', 'W'), (users_table.c.name == 'jack', 'J'), else_='E' ) )
另请参阅
- 类 sqlalchemy.sql.expression.Cast¶
表示一个
CAST
表达式。from sqlalchemy import cast, Numeric stmt = select(cast(product_table.c.unit_price, Numeric(10, 4)))
类签名
class
sqlalchemy.sql.expression.Cast
(sqlalchemy.sql.expression.WrapsColumnExpression
)
- 类 sqlalchemy.sql.expression.ClauseList¶
描述一个由运算符分隔的子句列表。
默认情况下,是逗号分隔的,例如列列表。
成员
类签名
class
sqlalchemy.sql.expression.ClauseList
(sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.roles.OrderByRole
,sqlalchemy.sql.roles.ColumnsClauseRole
,sqlalchemy.sql.roles.DMLColumnRole
,sqlalchemy.sql.expression.DQLDMLClauseElement
)-
方法
sqlalchemy.sql.expression.ClauseList.
self_group(against: OperatorType | None = None) → Self | Grouping[Any]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。随着表达式的组合,
self_group()
的应用是自动的 - 终端用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造会考虑运算符优先级 - 因此,例如,在像x OR (y AND z)
这样的表达式中可能不需要括号 - AND 的优先级高于 OR。self_group()
的基本方法ClauseElement
只返回自身。
-
方法
- 类 sqlalchemy.sql.expression.ColumnClause¶
表示来自任何文本字符串的列表达式。
ColumnClause
是Column
类的轻量级类似物,通常使用column()
函数调用,例如from sqlalchemy import column id, name = column("id"), column("name") stmt = select(id, name).select_from("user")
上面的语句将生成类似以下 SQL 的语句
SELECT id, name FROM user
ColumnClause
是特定于模式的Column
对象的直接父类。虽然Column
类具有与ColumnClause
相同的所有功能,但ColumnClause
类本身可以在行为需求仅限于简单 SQL 表达式生成的情况下使用。该对象没有与Column
相似的模式级别元数据或运行时行为关联,因此从某种意义上来说是Column
的“轻量级”版本。有关
ColumnClause
用法的完整细节请参见column()
。类签名
class
sqlalchemy.sql.expression.ColumnClause
(sqlalchemy.sql.roles.DDLReferredColumnRole
,sqlalchemy.sql.roles.LabeledColumnExprRole
,sqlalchemy.sql.roles.StrAsPlainColumnRole
,sqlalchemy.sql.expression.Immutable
,sqlalchemy.sql.expression.NamedColumn
)-
method
sqlalchemy.sql.expression.ColumnClause.
get_children(*, column_tables=False, **kw)¶ 返回此
HasTraverseInternals
的直接子HasTraverseInternals
元素。这用于访问遍历。
**kw 可能包含更改返回集合的标志,例如返回项目的子集以减少更大的遍历,或从不同上下文(例如模式级集合而不是子句级)返回子项。**
-
method
- class sqlalchemy.sql.expression.ColumnCollection¶
一个
ColumnElement
实例的集合,通常用于FromClause
对象。ColumnCollection
对象最常作为Table.c
或Table.columns
集合在Table
对象上,在 访问表和列 中介绍。ColumnCollection
同时具有映射和序列的行为。ColumnCollection
通常存储Column
对象,然后可以通过映射风格访问和属性访问风格来访问它们。要使用普通属性风格访问来访问
Column
对象,请指定名称,就像任何其他对象属性一样,例如在名为employee_name
的列下方访问>>> employee_table.c.employee_name
要访问具有特殊字符或空格的名称的列,请使用索引风格访问,例如以下示例说明了如何访问名为
employee ' payment
的列>>> employee_table.c["employee ' payment"]
由于
ColumnCollection
对象提供 Python 字典接口,因此可使用常见的字典方法名称,如ColumnCollection.keys()
、ColumnCollection.values()
和ColumnCollection.items()
,这意味着在这些名称下键入的数据库列也需要使用索引访问>>> employee_table.c["values"]
Column
所在的名称通常是Column.key
参数的名称。在某些上下文中,例如使用Select.set_label_style()
方法使用标签样式设置的Select
对象,具有特定键的列可能以特定标签名称(例如tablename_columnname
)表示>>> from sqlalchemy import select, column, table >>> from sqlalchemy import LABEL_STYLE_TABLENAME_PLUS_COL >>> t = table("t", column("c")) >>> stmt = select(t).set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL) >>> subq = stmt.subquery() >>> subq.c.t_c <sqlalchemy.sql.elements.ColumnClause at 0x7f59dcf04fa0; t_c>
ColumnCollection
还按顺序索引列,并允许通过它们的整数位置访问它们>>> cc[0] Column('x', Integer(), table=None) >>> cc[1] Column('y', Integer(), table=None)
版本 1.4 中新增:
ColumnCollection
允许对集合进行基于整数的索引访问。迭代集合按顺序生成列表达式
>>> list(cc) [Column('x', Integer(), table=None), Column('y', Integer(), table=None)]
基本
ColumnCollection
对象可以存储重复项,这意味着两个具有相同键的列,在这种情况下,通过键访问返回的列是 **任意的**>>> x1, x2 = Column('x', Integer), Column('x', Integer) >>> cc = ColumnCollection(columns=[(x1.name, x1), (x2.name, x2)]) >>> list(cc) [Column('x', Integer(), table=None), Column('x', Integer(), table=None)] >>> cc['x'] is x1 False >>> cc['x'] is x2 True
或者它也可以意味着同一列多次出现。这些情况受到支持,因为
ColumnCollection
用于表示 SELECT 语句中的列,该语句可能包含重复项。一个特殊的子类
DedupeColumnCollection
存在,它保留 SQLAlchemy 的旧行为,不允许重复;此集合用于模式级对象,如Table
和PrimaryKeyConstraint
,在这些情况下,这种去重是有帮助的。DedupeColumnCollection
类还具有额外的变异方法,因为模式结构具有更多需要移除和替换列的用例。版本 1.4 中的变更:
ColumnCollection
现在存储重复的列键以及同一个列的多个位置。DedupeColumnCollection
类被添加以在那些需要去重以及额外的替换/移除操作的情况下保留以前的行為。成员
add()、as_readonly()、clear()、compare()、contains_column()、corresponding_column()、get()、items()、keys()、update()、values()
类签名
类
sqlalchemy.sql.expression.ColumnCollection
(typing.Generic
)-
方法
sqlalchemy.sql.expression.ColumnCollection.
add(column: ColumnElement[Any], key: _COLKEY | None = None) → None¶ 向此
ColumnCollection
添加一列。注意
此方法通常不会被面向用户的代码使用,因为
ColumnCollection
通常是现有对象的一部分,例如Table
。要将Column
添加到现有的Table
对象,请使用Table.append_column()
方法。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
as_readonly() → ReadOnlyColumnCollection[_COLKEY, _COL_co]¶ 返回此
ColumnCollection
的“只读”形式。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
clear() → NoReturn¶ 字典 clear() 对于
ColumnCollection
未实现。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
compare(other: ColumnCollection[Any, Any]) → bool¶ 根据键的名称比较此
ColumnCollection
与另一个。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
contains_column(col: ColumnElement[Any]) → bool¶ 检查此集合中是否存在列对象。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
corresponding_column(column: _COL, require_embedded: bool = False) → _COL | _COL_co | None¶ 给定一个
ColumnElement
,从此ColumnCollection
返回导出ColumnElement
对象,该对象通过公共祖先列对应于该原始ColumnElement
。- 参数:
column¶ – 要匹配的目标
ColumnElement
。require_embedded¶ – 仅返回给定
ColumnElement
的对应列,如果给定ColumnElement
实际上存在于此Selectable
的子元素中。通常,如果该列仅与此Selectable
的一个导出列共享公共祖先,则该列将匹配。
另请参阅
Selectable.corresponding_column()
- 对Selectable.exported_columns
返回的集合调用此方法。在版本 1.4 中更改:
corresponding_column
的实现被移到了ColumnCollection
本身。
-
方法
sqlalchemy.sql.expression.ColumnCollection.
get(key: str, default: _COL | None = None) → _COL | _COL_co | None¶ 从该
ColumnCollection
中根据字符串键名获取一个ColumnClause
或Column
对象。
-
method
sqlalchemy.sql.expression.ColumnCollection.
items() → List[Tuple[_COLKEY, _COL_co]]¶ 返回该集合中所有列的 (键,列) 元组序列,每个元组包含一个字符串键名和一个
ColumnClause
或Column
对象。
-
method
sqlalchemy.sql.expression.ColumnCollection.
keys() → List[_COLKEY]¶ 返回该集合中所有列的字符串键名序列。
-
method
sqlalchemy.sql.expression.ColumnCollection.
update(iter_: Any) → NoReturn¶ 字典 update() 方法对于
ColumnCollection
未实现。
-
method
sqlalchemy.sql.expression.ColumnCollection.
values() → List[_COL_co]¶ 返回该集合中所有列的
ColumnClause
或Column
对象序列。
-
方法
- class sqlalchemy.sql.expression.ColumnElement¶
表示一个适合在语句的“columns”子句、WHERE 子句等中使用的面向列的 SQL 表达式。
虽然最常见的
ColumnElement
是Column
对象,但ColumnElement
是任何可能出现在 SQL 表达式中的单元的基础,包括表达式本身、SQL 函数、绑定参数、文字表达式、如NULL
这样的关键字等等。ColumnElement
是所有这些元素的最终基类。许多 SQLAlchemy Core 函数在 SQL 表达式级别工作,旨在接受
ColumnElement
实例作为参数。这些函数通常会记录它们接受“SQL 表达式”作为参数。在 SQLAlchemy 中,这意味着输入通常已经是ColumnElement
对象,或者可以**强制转换**为ColumnElement
对象的值。大多数(但并非全部)SQLAlchemy Core 函数在 SQL 表达式方面的强制转换规则如下。文字 Python 值,例如字符串、整数或浮点数、布尔值、日期时间、
Decimal
对象,或者几乎任何其他 Python 对象,将被强制转换为“文字绑定值”。这通常意味着会生成一个包含给定值的bindparam()
;生成的BindParameter
对象是ColumnElement
的实例。最终,Python 值将在执行时作为参数化参数发送到 DBAPI,以便在execute()
或executemany()
方法中使用,并应用 SQLAlchemy 类型特定的转换器(例如,任何关联的TypeEngine
对象提供的转换器)到该值。任何特殊对象值,通常是 ORM 级的构造,具有名为
__clause_element__()
的访问器。当将未知类型对象传递给希望将参数强制转换为ColumnElement
(有时还强制转换为SelectBase
表达式)的函数时,Core 表达式系统会查找该方法。它在 ORM 中用于将 ORM 特定的对象(如映射的类和映射的属性)转换为 Core 表达式对象。Python
None
值通常被解释为NULL
,在 SQLAlchemy Core 中会生成null()
的实例。
ColumnElement
提供了使用 Python 表达式生成新的ColumnElement
对象的能力。这意味着 Python 运算符(如==
、!=
和<
)被重载以模拟 SQL 操作,并允许实例化由其他更基本的ColumnElement
对象组成的进一步的ColumnElement
实例。例如,两个ColumnClause
对象可以使用加法运算符+
相加,以生成一个BinaryExpression
。ColumnClause
和BinaryExpression
都是ColumnElement
的子类。>>> from sqlalchemy.sql import column >>> column('a') + column('b') <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> >>> print(column('a') + column('b'))
a + b成员
__eq__(),__le__(),__lt__(),__ne__(),all_(),allows_lambda,anon_key_label,anon_label,any_(),asc(),base_columns,between(),bitwise_and(),bitwise_lshift(),bitwise_not(),bitwise_or(),bitwise_rshift(),bitwise_xor(),bool_op(),cast(),collate(),comparator,compare(),compile(),concat(),contains(),desc(),description,distinct(),endswith(),entity_namespace,expression,foreign_keys,get_children(),icontains(),iendswith(),ilike(),in_(),inherit_cache,is_(),is_clause_element,is_distinct_from(),is_dml,is_not(),is_not_distinct_from(),is_selectable,isnot(),isnot_distinct_from(),istartswith(),key,label(),like(),match(),negation_clause,not_ilike(),not_in(),not_like(),notilike(),notin_(),notlike(),nulls_first(),nulls_last(),nullsfirst(),nullslast(),op(),operate(),params(),primary_key,proxy_set,regexp_match(),regexp_replace(),reverse_operate(),self_group(),shares_lineage(),startswith(),stringify_dialect,supports_execution,timetuple,type,unique_params(),uses_inspection
类签名
class
sqlalchemy.sql.expression.ColumnElement
(sqlalchemy.sql.roles.ColumnArgumentOrKeyRole
,sqlalchemy.sql.roles.StatementOptionRole
,sqlalchemy.sql.roles.WhereHavingRole
,sqlalchemy.sql.roles.BinaryElementRole
,sqlalchemy.sql.roles.OrderByRole
,sqlalchemy.sql.roles.ColumnsClauseRole
,sqlalchemy.sql.roles.LimitOffsetRole
,sqlalchemy.sql.roles.DMLColumnRole
,sqlalchemy.sql.roles.DDLConstraintColumnRole
,sqlalchemy.sql.roles.DDLExpressionRole
,sqlalchemy.sql.expression.SQLColumnExpression
,sqlalchemy.sql.expression.DQLDMLClauseElement
)-
method
sqlalchemy.sql.expression.ColumnElement.
__eq__(other: Any) → ColumnOperators¶ 从
sqlalchemy.sql.expression.ColumnOperators.__eq__
方法继承,该方法属于ColumnOperators
实现
==
运算符。在列上下文中,生成
a = b
子句。如果目标是None
,则生成a IS NULL
。
-
method
sqlalchemy.sql.expression.ColumnElement.
__le__(other: Any) → ColumnOperators¶ 从
sqlalchemy.sql.expression.ColumnOperators.__le__
方法继承,该方法属于ColumnOperators
实现
<=
运算符。在列上下文中,生成子句
a <= b
。
-
method
sqlalchemy.sql.expression.ColumnElement.
__lt__(other: Any) → ColumnOperators¶ 继承自
sqlalchemy.sql.expression.ColumnOperators.__lt__
方法,属于ColumnOperators
实现
<
运算符。在列上下文中,生成子句
a < b
。
-
method
sqlalchemy.sql.expression.ColumnElement.
__ne__(other: Any) → ColumnOperators¶ 继承自
sqlalchemy.sql.expression.ColumnOperators.__ne__
方法,属于ColumnOperators
实现
!=
运算符。在列上下文中,生成子句
a != b
。如果目标是None
,则生成a IS NOT NULL
。
-
method
sqlalchemy.sql.expression.ColumnElement.
all_() → ColumnOperators¶ 继承自
ColumnOperators.all_()
方法,属于ColumnOperators
针对父对象生成一个
all_()
子句。有关示例,请参阅
all_()
的文档。注意
确保不要将较新的
ColumnOperators.all_()
方法与该方法的旧版混淆,即专门用于ARRAY
的Comparator.all()
方法,它使用不同的调用方式。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
allows_lambda = True¶
-
attribute
sqlalchemy.sql.expression.ColumnElement.
anon_key_label¶ 自版本 1.4 起已弃用:
ColumnElement.anon_key_label
属性现在是私有的,公开访问器已弃用。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
anon_label¶ 自版本 1.4 起已弃用:
ColumnElement.anon_label
属性现在是私有的,公开访问器已弃用。
-
method
sqlalchemy.sql.expression.ColumnElement.
any_() → ColumnOperators¶ 继承自
ColumnOperators.any_()
方法,属于ColumnOperators
针对父对象生成一个
any_()
子句。有关示例,请参阅
any_()
的文档。注意
确保不要将较新的
ColumnOperators.any_()
方法与该方法的旧版混淆,即专门用于ARRAY
的Comparator.any()
方法,它使用不同的调用方式。
-
method
sqlalchemy.sql.expression.ColumnElement.
asc() → ColumnOperators¶ 继承自
ColumnOperators.asc()
方法,属于ColumnOperators
针对父对象生成一个
asc()
子句。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
base_columns¶
-
method
sqlalchemy.sql.expression.ColumnElement.
between(cleft: Any, cright: Any, symmetric: bool = False) → ColumnOperators¶ 继承自
ColumnOperators.between()
方法,属于ColumnOperators
针对父对象生成一个
between()
子句,给定上下限范围。
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_and(other: Any) → ColumnOperators¶ -
生成一个按位 AND 操作,通常通过
&
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_lshift(other: Any) → ColumnOperators¶ -
生成一个按位左移操作,通常通过
<<
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_not() → ColumnOperators¶ -
生成一个按位取反操作,通常通过
~
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_or(other: Any) → ColumnOperators¶ -
生成一个按位 OR 操作,通常通过
|
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_rshift(other: Any) → ColumnOperators¶ -
生成一个按位右移操作,通常通过
>>
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bitwise_xor(other: Any) → ColumnOperators¶ -
生成一个按位异或操作,通常通过
^
运算符,或者#
用于 PostgreSQL。版本 2.0.2 中的新增内容。
另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
bool_op(opstring: str, precedence: int = 0, python_impl: Callable[[...], Any] | None = None) → Callable[[Any], Operators]¶ 继承自
Operators.bool_op()
方法Operators
返回一个自定义布尔运算符。
此方法是调用
Operators.op()
并传递Operators.op.is_comparison
标记为 True 的简写。使用Operators.bool_op()
的主要优势是,当使用列构造时,返回表达式的“布尔”性质将存在于 PEP 484 目的。另请参阅
-
method
sqlalchemy.sql.expression.ColumnElement.
cast(type_: _TypeEngineArgument[_OPT]) → Cast[_OPT]¶ 生成一个类型转换,即
CAST(<expression> AS <type>)
。这是
cast()
函数的快捷方式。
-
method
sqlalchemy.sql.expression.ColumnElement.
collate(collation: str) → ColumnOperators¶ -
使用给定的排序规则字符串,针对父对象生成
collate()
子句。另请参阅
-
属性
sqlalchemy.sql.expression.ColumnElement.
comparator¶
-
方法
sqlalchemy.sql.expression.ColumnElement.
compare(other: ClauseElement, **kw: Any) → bool¶ 继承自
ClauseElement.compare()
方法的ClauseElement
将此
ClauseElement
与给定的ClauseElement
进行比较。子类应该覆盖默认行为,该行为是直接身份比较。
**kw 是子类
compare()
方法使用的参数,可用于修改比较标准(参见ColumnElement
)。
-
方法
sqlalchemy.sql.expression.ColumnElement.
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
,则呈现目标表对象中的所有列。dialect¶ – 一个
Dialect
实例,它可以生成一个Compiled
对象。此参数优先于bind
参数。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.ColumnElement.
concat(other: Any) → ColumnOperators¶ -
实现“concat”运算符。
在列上下文中,生成子句
a || b
,或在 MySQL 上使用concat()
运算符。
-
方法
sqlalchemy.sql.expression.ColumnElement.
contains(other: Any, **kw: Any) → ColumnOperators¶ -
实现“contains”运算符。
生成一个 LIKE 表达式,它测试字符串值的中间部分的匹配项
column LIKE '%' || <other> || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.contains("foobar"))
由于操作符使用
LIKE
,因此在 <&other> 表达式中存在的通配符字符"%"
和"_"
也将表现为通配符。对于字面字符串值,ColumnOperators.contains.autoescape
标志可以设置为True
,以便对字符串值中这些字符的出现应用转义,使它们匹配自身,而不是作为通配符字符。或者,ColumnOperators.contains.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是字面字符串时非常有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通字符串值,但也可以是任意 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会转义,除非ColumnOperators.contains.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.contains("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE '%' || :param || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.contains("foo/%bar", escape="^")
将呈现为
somecolumn LIKE '%' || :param || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.contains.autoescape
组合使用somecolumn.contains("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnElement.
desc() → ColumnOperators¶ -
针对父对象生成
desc()
子句。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
description¶ 从
ClauseElement.description
属性继承ClauseElement
-
method
sqlalchemy.sql.expression.ColumnElement.
distinct() → ColumnOperators¶ -
针对父对象生成
distinct()
子句。
-
method
sqlalchemy.sql.expression.ColumnElement.
endswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ -
实现 'endswith' 操作符。
生成一个 LIKE 表达式,用于测试字符串值结尾的匹配情况
column LIKE '%' || <other>
例如:
stmt = select(sometable).\ where(sometable.c.column.endswith("foobar"))
由于操作符使用
LIKE
,因此在 <&other> 表达式中存在的通配符字符"%"
和"_"
也将表现为通配符。对于字面字符串值,ColumnOperators.endswith.autoescape
标志可以设置为True
,以便对字符串值中这些字符的出现应用转义,使它们匹配自身,而不是作为通配符字符。或者,ColumnOperators.endswith.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是字面字符串时非常有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通字符串值,但也可以是任意 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会转义,除非ColumnOperators.endswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.endswith("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE '%' || :param ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.endswith("foo/%bar", escape="^")
将呈现为
somecolumn LIKE '%' || :param ESCAPE '^'
该参数也可以与
ColumnOperators.endswith.autoescape
组合使用somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
entity_namespace¶ 从
ClauseElement.entity_namespace
属性继承ClauseElement
-
attribute
sqlalchemy.sql.expression.ColumnElement.
expression¶ 返回一个列表达式。
检查接口的一部分;返回自身。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
foreign_keys: AbstractSet[ForeignKey] = frozenset({})¶
-
方法
sqlalchemy.sql.expression.ColumnElement.
get_children(*, omit_attrs: Tuple[str, ...] = (), **kw: Any) → Iterable[HasTraverseInternals]¶ 继承自
HasTraverseInternals.get_children()
方法HasTraverseInternals
返回此
HasTraverseInternals
的直接子HasTraverseInternals
元素。这用于访问遍历。
**kw 可能包含更改返回集合的标志,例如返回项目的子集以减少更大的遍历,或从不同上下文(例如模式级集合而不是子句级)返回子项。**
-
方法
sqlalchemy.sql.expression.ColumnElement.
icontains(other: Any, **kw: Any) → ColumnOperators¶ -
实现
icontains
运算符,例如ColumnOperators.contains()
的不区分大小写版本。生成一个 LIKE 表达式,用于测试字符串值中间的不区分大小写匹配。
lower(column) LIKE '%' || lower(<other>) || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.icontains("foobar"))
由于运算符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样起作用。对于文字字符串值,ColumnOperators.icontains.autoescape
标志可以设置为True
以对字符串值中这些字符的出现进行转义,以便它们以自身形式匹配,而不是作为通配符。或者,ColumnOperators.icontains.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是文字字符串时很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通的字符串值,但也可能是任意 SQL 表达式。LIKE 通配符
%
和_
默认情况下不会转义,除非ColumnOperators.icontains.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.icontains("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.icontains("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.contains.autoescape
组合使用somecolumn.icontains("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
方法
sqlalchemy.sql.expression.ColumnElement.
iendswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ -
实现
iendswith
运算符,例如ColumnOperators.endswith()
的不区分大小写版本。生成一个 LIKE 表达式,用于测试字符串值末尾的不区分大小写匹配。
lower(column) LIKE '%' || lower(<other>)
例如:
stmt = select(sometable).\ where(sometable.c.column.iendswith("foobar"))
由于运算符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样起作用。对于文字字符串值,ColumnOperators.iendswith.autoescape
标志可以设置为True
以对字符串值中这些字符的出现进行转义,以便它们以自身形式匹配,而不是作为通配符。或者,ColumnOperators.iendswith.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是文字字符串时很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通的字符串值,但也可能是任意 SQL 表达式。LIKE 通配符
%
和_
默认情况下不会转义,除非ColumnOperators.iendswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.iendswith("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.iendswith("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '^'
参数也可以与
ColumnOperators.iendswith.autoescape
组合使用somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
方法
sqlalchemy.sql.expression.ColumnElement.
ilike(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
ilike
运算符,例如不区分大小写的 LIKE。在列上下文中,生成一个表达式,其形式为
lower(a) LIKE lower(other)
或者在支持 ILIKE 运算符的后端上
a ILIKE other
例如:
stmt = select(sometable).\ where(sometable.c.column.ilike("%foobar%"))
-
method
sqlalchemy.sql.expression.ColumnElement.
in_(other: Any) → ColumnOperators¶ -
实现
in
运算符。在列上下文中,生成子句
column IN <other>
。给定的参数
other
可以是文字值的列表,例如
stmt.where(column.in_([1, 2, 3]))
在这种调用形式中,项目列表被转换为与给定列表长度相同的绑定参数集。
WHERE COL IN (?, ?, ?)
如果比较是对包含多个表达式的
tuple_()
,则可以提供元组列表。from sqlalchemy import tuple_ stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
空列表,例如
stmt.where(column.in_([]))
在这种调用形式中,表达式呈现“空集”表达式。这些表达式针对各个后端定制,通常试图获取一个空 SELECT 语句作为子查询。例如在 SQLite 上,表达式是
WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
在版本 1.4 中更改: 空 IN 表达式现在在所有情况下都使用运行时生成的 SELECT 子查询。
绑定参数,例如
bindparam()
,如果它包含bindparam.expanding
标志,则可以使用。stmt.where(column.in_(bindparam('value', expanding=True)))
在这种调用形式中,表达式呈现一个特殊的非 SQL 占位符表达式,看起来像
WHERE COL IN ([EXPANDING_value])
此占位符表达式在语句执行时被拦截,转换为前面说明的可变数量绑定参数形式。如果语句被执行为
connection.execute(stmt, {"value": [1, 2, 3]})
数据库将为每个值传递一个绑定参数。
WHERE COL IN (?, ?, ?)
在版本 1.2 中添加: 添加了“扩展”绑定参数。
如果传递空列表,将渲染一个特殊的“空列表”表达式,该表达式特定于使用的数据库。在 SQLite 上,这将是
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
在版本 1.3 中添加: “扩展”绑定参数现在支持空列表。
一个
select()
结构,通常是相关标量选择stmt.where( column.in_( select(othertable.c.y). where(table.c.x == othertable.c.x) ) )
在这种调用形式中,
ColumnOperators.in_()
按给定方式呈现。WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x)
- 参数:
other¶ – 文字列表、
select()
结构或包含bindparam.expanding
标志设置为 True 的bindparam()
结构。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
inherit_cache: bool | None = None¶ 继承自
HasCacheKey.inherit_cache
属性HasCacheKey
指示此
HasCacheKey
实例是否应使用其直接超类的缓存键生成方案。该属性默认为
None
,这表示一个构造函数尚未考虑它是否适合参与缓存;这在功能上等同于将值设置为False
,只是还会发出警告。如果与对象对应的 SQL 不根据此类的本地属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True
。另请参阅
为自定义结构启用缓存支持 - 为第三方或用户定义的 SQL 结构设置
HasCacheKey.inherit_cache
属性的一般指南。
-
method
sqlalchemy.sql.expression.ColumnElement.
is_(other: Any) → ColumnOperators¶ -
实现
IS
运算符。通常,
IS
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS
可能需要。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
is_clause_element = True¶
-
method
sqlalchemy.sql.expression.ColumnElement.
is_distinct_from(other: Any) → ColumnOperators¶ -
实现
IS DISTINCT FROM
运算符。在大多数平台上呈现“a IS DISTINCT FROM b”;在某些平台上(如 SQLite)可能呈现“a IS NOT b”。
-
attribute
sqlalchemy.sql.expression.ColumnElement.
is_dml = False¶
-
method
sqlalchemy.sql.expression.ColumnElement.
is_not(other: Any) → ColumnOperators¶ -
实现
IS NOT
运算符。通常,
IS NOT
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS NOT
可能需要。版本 1.4 中的变更: 操作符
is_not()
在以前版本中更名为isnot()
。为了向后兼容,以前的名字仍然可以使用。
-
方法
sqlalchemy.sql.expression.ColumnElement.
is_not_distinct_from(other: Any) → ColumnOperators¶ -
实现
IS NOT DISTINCT FROM
操作符。在大多数平台上呈现“a IS NOT DISTINCT FROM b”;在 SQLite 等一些平台上可能呈现“a IS b”。
版本 1.4 中的变更: 操作符
is_not_distinct_from()
在以前版本中更名为isnot_distinct_from()
。为了向后兼容,以前的名字仍然可以使用。
-
属性
sqlalchemy.sql.expression.ColumnElement.
is_selectable = False¶
-
方法
sqlalchemy.sql.expression.ColumnElement.
isnot(other: Any) → ColumnOperators¶ 从以下继承
ColumnOperators.isnot()
方法ColumnOperators
实现
IS NOT
运算符。通常,
IS NOT
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS NOT
可能需要。版本 1.4 中的变更: 操作符
is_not()
在以前版本中更名为isnot()
。为了向后兼容,以前的名字仍然可以使用。
-
方法
sqlalchemy.sql.expression.ColumnElement.
isnot_distinct_from(other: Any) → ColumnOperators¶ -
实现
IS NOT DISTINCT FROM
操作符。在大多数平台上呈现“a IS NOT DISTINCT FROM b”;在 SQLite 等一些平台上可能呈现“a IS b”。
版本 1.4 中的变更: 操作符
is_not_distinct_from()
在以前版本中更名为isnot_distinct_from()
。为了向后兼容,以前的名字仍然可以使用。
-
方法
sqlalchemy.sql.expression.ColumnElement.
istartswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ -
实现
istartswith
操作符,例如,ColumnOperators.startswith()
的不区分大小写的版本。生成一个 LIKE 表达式,用于测试字符串值开头的非敏感匹配
lower(column) LIKE lower(<other>) || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.istartswith("foobar"))
由于该操作符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样工作。对于文字字符串值,ColumnOperators.istartswith.autoescape
标志可以设置为True
,将这些字符在字符串值中的出现进行转义,以便它们匹配自身而不是通配符。或者,ColumnOperators.istartswith.escape
参数将建立一个给定的字符作为转义字符,当目标表达式不是文字字符串时,这很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通字符串值,但也可以是任意 SQL 表达式。 LIKE 通配符
%
和_
默认情况下不会转义,除非ColumnOperators.istartswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.istartswith("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.istartswith("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.istartswith.autoescape
结合使用somecolumn.istartswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
属性
sqlalchemy.sql.expression.ColumnElement.
key: str | None = None¶ 在某些情况下,引用 Python 命名空间中的此对象的“键”。
这通常指的是列在可选择对象的
.c
集合中的“键”,例如sometable.c["somekey"]
将返回一个Column
,其.key
为“somekey”。
-
method
sqlalchemy.sql.expression.ColumnElement.
label(name: str | None) → Label[_T]¶ 生成一个列标签,例如
<columnname> AS <name>
。这是对
label()
函数的快捷方式。如果 ‘name’ 为
None
,则会生成一个匿名标签名称。
-
method
sqlalchemy.sql.expression.ColumnElement.
like(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
like
运算符。在列上下文中,产生表达式
a LIKE other
例如:
stmt = select(sometable).\ where(sometable.c.column.like("%foobar%"))
-
method
sqlalchemy.sql.expression.ColumnElement.
match(other: Any, **kwargs: Any) → ColumnOperators¶ -
实现数据库特有的 'match' 运算符。
ColumnOperators.match()
尝试解析为后端提供的 MATCH 类函数或运算符。例如:
-
attribute
sqlalchemy.sql.expression.ColumnElement.
negation_clause: ColumnElement[bool]¶
-
method
sqlalchemy.sql.expression.ColumnElement.
not_ilike(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
NOT ILIKE
运算符。这等效于使用否定运算符和
ColumnOperators.ilike()
,即~x.ilike(y)
。在版本 1.4 中更改:
not_ilike()
运算符在之前的版本中被重命名为notilike()
。为了向后兼容,之前的名称仍然可用。
-
method
sqlalchemy.sql.expression.ColumnElement.
not_in(other: Any) → ColumnOperators¶ -
实现
NOT IN
运算符。这等效于使用否定运算符和
ColumnOperators.in_()
,即~x.in_(y)
。如果
other
是一个空序列,编译器将产生一个 “空不在” 表达式。默认情况下,此表达式为 “1 = 1”,在所有情况下都产生真值。create_engine.empty_in_strategy
可以用来改变这种行为。在版本 1.4 中更改:
not_in()
运算符在之前的版本中被重命名为notin_()
。为了向后兼容,之前的名称仍然可用。版本 1.2 中变更:
ColumnOperators.in_()
和ColumnOperators.not_in()
运算符现在默认情况下会为一个空的 IN 序列生成一个“静态”表达式。
-
method
sqlalchemy.sql.expression.ColumnElement.
not_like(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
NOT LIKE
运算符。这等同于使用否定运算符与
ColumnOperators.like()
,即~x.like(y)
。版本 1.4 中变更:
not_like()
运算符从之前版本中的notlike()
重命名。旧的名称仍然可用以确保向后兼容性。
-
method
sqlalchemy.sql.expression.ColumnElement.
notilike(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
NOT ILIKE
运算符。这等效于使用否定运算符和
ColumnOperators.ilike()
,即~x.ilike(y)
。在版本 1.4 中更改:
not_ilike()
运算符在之前的版本中被重命名为notilike()
。为了向后兼容,之前的名称仍然可用。
-
method
sqlalchemy.sql.expression.ColumnElement.
notin_(other: Any) → ColumnOperators¶ -
实现
NOT IN
运算符。这等效于使用否定运算符和
ColumnOperators.in_()
,即~x.in_(y)
。如果
other
是一个空序列,编译器将产生一个 “空不在” 表达式。默认情况下,此表达式为 “1 = 1”,在所有情况下都产生真值。create_engine.empty_in_strategy
可以用来改变这种行为。在版本 1.4 中更改:
not_in()
运算符在之前的版本中被重命名为notin_()
。为了向后兼容,之前的名称仍然可用。版本 1.2 中变更:
ColumnOperators.in_()
和ColumnOperators.not_in()
运算符现在默认情况下会为一个空的 IN 序列生成一个“静态”表达式。
-
method
sqlalchemy.sql.expression.ColumnElement.
notlike(other: Any, escape: str | None = None) → ColumnOperators¶ -
实现
NOT LIKE
运算符。这等同于使用否定运算符与
ColumnOperators.like()
,即~x.like(y)
。版本 1.4 中变更:
not_like()
运算符从之前版本中的notlike()
重命名。旧的名称仍然可用以确保向后兼容性。
-
method
sqlalchemy.sql.expression.ColumnElement.
nulls_first() → ColumnOperators¶ -
针对父对象生成一个
nulls_first()
子句。版本 1.4 中变更:
nulls_first()
运算符从之前版本中的nullsfirst()
重命名。旧的名称仍然可用以确保向后兼容性。
-
method
sqlalchemy.sql.expression.ColumnElement.
nulls_last() → ColumnOperators¶ -
针对父对象生成一个
nulls_last()
子句。版本 1.4 中变更:
nulls_last()
运算符从之前版本中的nullslast()
重命名。旧的名称仍然可用以确保向后兼容性。
-
method
sqlalchemy.sql.expression.ColumnElement.
nullsfirst() → ColumnOperators¶ -
针对父对象生成一个
nulls_first()
子句。版本 1.4 中变更:
nulls_first()
运算符从之前版本中的nullsfirst()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnElement.
nullslast() → ColumnOperators¶ -
针对父对象生成一个
nulls_last()
子句。版本 1.4 中变更:
nulls_last()
运算符从之前版本中的nullslast()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnElement.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Type[TypeEngine[Any]] | TypeEngine[Any] | None = None, python_impl: Callable[..., Any] | None = None) → Callable[[Any], Operators]¶ 继承自
Operators.op()
方法Operators
生成一个通用的操作符函数。
例如
somecolumn.op("*")(5)
生成
somecolumn * 5
此函数还可用于明确地创建位运算符。例如
somecolumn.op('&')(0xff)
是
somecolumn
中值的按位与。- 参数:
opstring¶ – 一个字符串,它将作为此元素与传递给生成的函数的表达式之间的中缀运算符输出。
precedence¶ –
数据库在 SQL 表达式中预计应用于该运算符的优先级。此整数值充当 SQL 编译器的一个提示,让它知道何时应在特定操作周围渲染显式括号。较小的数字将导致表达式在应用于另一个优先级较高的运算符时被加括号。默认值
0
低于除逗号 (,
) 和AS
运算符之外的所有运算符。值为 100 将高于或等于所有运算符,而 -100 将低于或等于所有运算符。另请参阅
我正在使用 op() 生成自定义运算符,但我的括号显示不正确 - 有关 SQLAlchemy SQL 编译器如何渲染括号的详细说明
is_comparison¶ –
旧版;如果为 True,则运算符将被视为“比较”运算符,即评估为布尔值 true/false 的运算符,如
==
、>
等。提供此标志是为了让 ORM 关系能够在使用自定义联接条件时确定运算符是比较运算符。使用
is_comparison
参数被使用Operators.bool_op()
方法代替;此更简洁的运算符会自动设置此参数,但也提供正确的 PEP 484 类型支持,因为返回的对象将表示“布尔”数据类型,即BinaryExpression[bool]
。return_type¶ – 一个
TypeEngine
类或对象,它将强制由此运算符生成的表达式的返回类型为该类型。默认情况下,指定了Operators.op.is_comparison
的运算符将解析为Boolean
,而未指定的运算符将与左侧操作数类型相同。python_impl¶ –
一个可选的 Python 函数,它可以评估两个 Python 值,与在数据库服务器上运行时此运算符的工作方式相同。这对 Python 中的 SQL 表达式评估函数很有用,例如 ORM 混合属性和 ORM“评估器”,用于在多行更新或删除后匹配会话中的对象。
例如
>>> expr = column('x').op('+', python_impl=lambda a, b: a + b)('y')
上述表达式的运算符也适用于非 SQL 左边和右边对象
>>> expr.operator(5, 10) 15
2.0 版中的新功能。
-
方法
sqlalchemy.sql.expression.ColumnElement.
operate(op: OperatorType, *other: Any, **kwargs: Any) → ColumnElement[Any]¶ 对一个参数进行操作。
这是最低级别的操作,默认情况下会引发
NotImplementedError
。在子类上覆盖它可以允许将通用行为应用于所有操作。例如,覆盖
ColumnOperators
以将func.lower()
应用于左右两边class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- 参数:
op¶ – 运算符可调用对象。
*other¶ – 操作的“另一方”。对于大多数操作,它将是一个标量值。
**kwargs¶ – 修饰符。这些可能由特殊运算符传递,例如
ColumnOperators.contains()
。
-
方法
sqlalchemy.sql.expression.ColumnElement.
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.ColumnElement.
primary_key: bool = False¶
-
属性
sqlalchemy.sql.expression.ColumnElement.
proxy_set: util.generic_fn_descriptor[FrozenSet[Any]]¶ 我们代理的所有列的集合
从 2.0 版本开始,这明确地是取消注释的列。以前它实际上是取消注释的列,但没有强制执行。如果可能的话,注释列基本上不应该进入集合,因为它们的哈希行为非常低效。
-
方法
sqlalchemy.sql.expression.ColumnElement.
regexp_match(pattern: Any, flags: str | None = None) → ColumnOperators¶ -
实现特定于数据库的“正则表达式匹配”运算符。
例如:
stmt = select(table.c.some_column).where( table.c.some_column.regexp_match('^(b|c)') )
ColumnOperators.regexp_match()
尝试解析为后端提供的类似 REGEXP 的函数或运算符,但是可用的特定正则表达式语法和标志是 **不是后端无关的**。示例包括
PostgreSQL - 渲染
x ~ y
或x !~ y
当否定时。Oracle - 渲染
REGEXP_LIKE(x, y)
SQLite - 使用 SQLite 的
REGEXP
占位符运算符,并调用 Pythonre.match()
内置函数。其他后端可能提供特殊的实现。
没有特殊实现的后端将发出运算符为“REGEXP”或“NOT REGEXP”。例如,这与 SQLite 和 MySQL 兼容。
正则表达式支持目前已在 Oracle、PostgreSQL、MySQL 和 MariaDB 中实现。SQLite 提供部分支持。第三方方言之间的支持可能会有所不同。
- 参数:
1.4 版中的新功能。
在版本 1.4.48 中更改,: 2.0.18 请注意,由于实现错误,以前“flags”参数除了纯 Python 字符串外,还接受 SQL 表达式对象,例如列表达式。此实现无法与缓存正确配合,因此已删除;对于“flags”参数,应仅传递字符串,因为这些标志在 SQL 表达式中以文字内联值的
-
方法
sqlalchemy.sql.expression.ColumnElement.
regexp_replace(pattern: Any, replacement: Any, flags: str | None = None) → ColumnOperators¶ -
实现特定于数据库的“正则表达式替换”运算符。
例如:
stmt = select( table.c.some_column.regexp_replace( 'b(..)', 'XY', flags='g' ) )
ColumnOperators.regexp_replace()
尝试解析为后端提供的类似 REGEXP_REPLACE 的函数,该函数通常会发出函数REGEXP_REPLACE()
。但是,可用的特定正则表达式语法和标志是 **不是后端无关的**。正则表达式替换支持目前已在 Oracle、PostgreSQL、MySQL 8 或更高版本以及 MariaDB 中实现。第三方方言之间的支持可能会有所不同。
- 参数:
1.4 版中的新功能。
在版本 1.4.48 中更改,: 2.0.18 请注意,由于实现错误,以前“flags”参数除了纯 Python 字符串外,还接受 SQL 表达式对象,例如列表达式。此实现无法与缓存正确配合,因此已删除;对于“flags”参数,应仅传递字符串,因为这些标志在 SQL 表达式中以文字内联值的
-
方法
sqlalchemy.sql.expression.ColumnElement.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → ColumnElement[Any]¶ 对参数进行反向操作。
使用方法与
operate()
相同。
-
方法
sqlalchemy.sql.expression.ColumnElement.
self_group(against: OperatorType | None = None) → ColumnElement[Any]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()
的应用是自动的 - 终端用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造考虑了运算符优先级 - 因此括号可能不需要,例如,在表达式x OR (y AND z)
中 - AND 的优先级高于 OR。self_group()
的基本方法ClauseElement
只是返回自身。
-
方法
sqlalchemy.sql.expression.ColumnElement.
shares_lineage(othercolumn: ColumnElement[Any]) → bool¶ 如果给定的
ColumnElement
与该ColumnElement
具有共同的祖先,则返回 True。
-
方法
sqlalchemy.sql.expression.ColumnElement.
startswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ -
实现
startswith
运算符。生成一个 LIKE 表达式,它测试与字符串值开头的匹配。
column LIKE <other> || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.startswith("foobar"))
由于该运算符使用
LIKE
,因此在 <other> 表达式中出现的通配符字符"%"
和"_"
也将像通配符一样工作。对于文字字符串值,ColumnOperators.startswith.autoescape
标志可以设置为True
,以对字符串值内的这些字符的出现进行转义,以便它们本身匹配,而不是作为通配符字符。或者,ColumnOperators.startswith.escape
参数将建立一个给定的字符作为转义字符,当目标表达式不是文字字符串时,这将很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个普通的字符串值,但也可以是任意的 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会转义,除非ColumnOperators.startswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.startswith("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE :param || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.startswith("foo/%bar", escape="^")
将呈现为
somecolumn LIKE :param || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.startswith.autoescape
组合使用somecolumn.startswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
属性
sqlalchemy.sql.expression.ColumnElement.
stringify_dialect = 'default'¶
-
属性
sqlalchemy.sql.expression.ColumnElement.
supports_execution = False¶
-
属性
sqlalchemy.sql.expression.ColumnElement.
timetuple: Literal[None] = None¶ -
Hack,允许 datetime 对象在 LHS 上进行比较。
-
属性
sqlalchemy.sql.expression.ColumnElement.
type: TypeEngine[_T]¶
-
方法
sqlalchemy.sql.expression.ColumnElement.
unique_params(_ClauseElement__optionaldict: Dict[str, Any] | None = None, **kwargs: Any) → Self¶ -
返回一个用
bindparam()
元素替换后的副本。与
ClauseElement.params()
的功能相同,只是在受影响的绑定参数中添加了 unique=True,以便可以使用多个语句。
-
属性
sqlalchemy.sql.expression.ColumnElement.
uses_inspection = True¶
- sqlalchemy.sql.expression.ColumnExpressionArgument¶
通用“列表达式”参数。
新版本 2.0.13。
此类型用于通常代表单个 SQL 列表达式的“列”类型的表达式,包括
ColumnElement
,以及将具有__clause_element__()
方法的 ORM 映射属性。
- class sqlalchemy.sql.expression.ColumnOperators¶
为
ColumnElement
表达式定义布尔值、比较和其他运算符。默认情况下,所有方法都会调用
operate()
或reverse_operate()
,并将 Python 内置operator
模块中的相应操作符函数或sqlalchemy.expression.operators
中的 SQLAlchemy 特定操作符函数传递进去。例如,__eq__
函数def __eq__(self, other): return self.operate(operators.eq, other)
其中
operators.eq
本质上是def eq(a, b): return a == b
核心列表达式单元
ColumnElement
覆盖了Operators.operate()
等方法,以返回更多ColumnElement
结构,因此上面的==
操作被替换为子句结构。成员
__add__(), __and__(), __eq__(), __floordiv__(), __ge__(), __getitem__(), __gt__(), __hash__(), __invert__(), __le__(), __lshift__(), __lt__(), __mod__(), __mul__(), __ne__(), __neg__(), __or__(), __radd__(), __rfloordiv__(), __rmod__(), __rmul__(), __rshift__(), __rsub__(), __rtruediv__(), __sa_operate__(), __sub__(), __truediv__(), all_(), any_(), asc(), between(), bitwise_and(), bitwise_lshift(), bitwise_not(), bitwise_or(), bitwise_rshift(), bitwise_xor(), bool_op(), collate(), concat(), contains(), desc(), distinct(), endswith(), icontains(), iendswith(), ilike(), in_(), is_(), is_distinct_from(), is_not(), is_not_distinct_from(), isnot(), isnot_distinct_from(), istartswith(), like(), match(), not_ilike(), not_in(), not_like(), notilike(), notin_(), notlike(), nulls_first(), nulls_last(), nullsfirst(), nullslast(), op(), operate(), regexp_match(), regexp_replace(), reverse_operate(), startswith(), timetuple
-
method
sqlalchemy.sql.expression.ColumnOperators.
__add__(other: Any) → ColumnOperators¶ 实现
+
操作符。在列上下文中,如果父对象没有字符串亲和性,则生成子句
a + b
。如果父对象具有字符串亲和性,则生成连接操作符a || b
- 请参见ColumnOperators.concat()
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__and__(other: Any) → Operators¶ 继承自
sqlalchemy.sql.expression.Operators.__and__
方法Operators
实现
&
操作符。在与 SQL 表达式一起使用时,会导致 AND 操作,等效于
and_()
,即a & b
等效于
from sqlalchemy import and_ and_(a, b)
在使用
&
时,应注意运算符优先级;&
运算符具有最高优先级。如果操作数包含进一步的子表达式,则应将它们括在括号中。(a == 2) & (b == 4)
-
method
sqlalchemy.sql.expression.ColumnOperators.
__eq__(other: Any) → ColumnOperators¶ 实现
==
运算符。在列上下文中,生成
a = b
子句。如果目标是None
,则生成a IS NULL
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__floordiv__(other: Any) → ColumnOperators¶ 实现
//
运算符。在列上下文中,生成子句
a / b
,它与“truediv”相同,但将结果类型视为整数。2.0 版中的新功能。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__ge__(other: Any) → ColumnOperators¶ 实现
>=
运算符。在列上下文中,生成子句
a >= b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__getitem__(index: Any) → ColumnOperators¶ 实现 [] 运算符。
这可以被一些数据库特定的类型使用,例如 PostgreSQL ARRAY 和 HSTORE。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__gt__(other: Any) → ColumnOperators¶ 实现
>
运算符。在列上下文中,生成子句
a > b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__hash__()¶ 返回 hash(self)。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__invert__() → Operators¶ 继承自
sqlalchemy.sql.expression.Operators.__invert__
方法Operators
实现
~
运算符。在与 SQL 表达式一起使用时,会导致 NOT 操作,等效于
not_()
,即~a
等效于
from sqlalchemy import not_ not_(a)
-
method
sqlalchemy.sql.expression.ColumnOperators.
__le__(other: Any) → ColumnOperators¶ 实现
<=
运算符。在列上下文中,生成子句
a <= b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__lshift__(other: Any) → ColumnOperators¶ 实现 << 运算符。
SQLAlchemy 核心未使用,这是为希望使用 << 作为扩展点的自定义运算符系统提供的。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__lt__(other: Any) → ColumnOperators¶ 实现
<
运算符。在列上下文中,生成子句
a < b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__mod__(other: Any) → ColumnOperators¶ 实现
%
运算符。在列上下文中,生成子句
a % b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__mul__(other: Any) → ColumnOperators¶ 实现
*
运算符。在列上下文中,生成子句
a * b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__ne__(other: Any) → ColumnOperators¶ 实现
!=
运算符。在列上下文中,生成子句
a != b
。如果目标是None
,则生成a IS NOT NULL
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__neg__() → ColumnOperators¶ 实现
-
运算符。在列上下文中,生成子句
-a
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__or__(other: Any) → Operators¶ 继承自
sqlalchemy.sql.expression.Operators.__or__
方法的Operators
实现
|
运算符。当与 SQL 表达式一起使用时,会产生一个 OR 操作,等效于
or_()
,即a | b
等效于
from sqlalchemy import or_ or_(a, b)
在使用
|
时应注意运算符优先级;|
运算符具有最高优先级。如果操作数包含进一步的子表达式,则应将其括在括号中。(a == 2) | (b == 4)
-
method
sqlalchemy.sql.expression.ColumnOperators.
__radd__(other: Any) → ColumnOperators¶ 反向实现
+
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rfloordiv__(other: Any) → ColumnOperators¶ 反向实现
//
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rmod__(other: Any) → ColumnOperators¶ 反向实现
%
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rmul__(other: Any) → ColumnOperators¶ 反向实现
*
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rshift__(other: Any) → ColumnOperators¶ 实现 >> 运算符。
SQLAlchemy 核心不使用它,它用于想要将 >> 用作扩展点的自定义运算符系统。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rsub__(other: Any) → ColumnOperators¶ 反向实现
-
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__rtruediv__(other: Any) → ColumnOperators¶ 反向实现
/
运算符。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__sa_operate__(op: OperatorType, *other: Any, **kwargs: Any) → Operators¶ 继承自
sqlalchemy.sql.expression.Operators.__sa_operate__
方法的Operators
对一个参数进行操作。
这是最低级别的操作,默认情况下会引发
NotImplementedError
。在子类上覆盖它可以允许将通用行为应用于所有操作。例如,覆盖
ColumnOperators
以将func.lower()
应用于左右两边class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- 参数:
op¶ – 运算符可调用对象。
*other¶ – 操作的“另一边”。对于大多数操作来说,它将是一个标量。
**kwargs¶ – 修饰符。这些可能由特殊运算符传递,例如
ColumnOperators.contains()
.
-
method
sqlalchemy.sql.expression.ColumnOperators.
__sub__(other: Any) → ColumnOperators¶ 实现
-
运算符。在列上下文中,产生子句
a - b
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
__truediv__(other: Any) → ColumnOperators¶ 实现
/
运算符。在列上下文中,产生子句
a / b
,并将结果类型视为数字。在版本 2.0 中更改: 两个整数之间的 truediv 运算符现在被认为返回一个数值。特定后端上的行为可能有所不同。
-
method
sqlalchemy.sql.expression.ColumnOperators.
all_() → ColumnOperators¶ 针对父对象生成一个
all_()
子句。有关示例,请参阅
all_()
的文档。注意
确保不要将较新的
ColumnOperators.all_()
方法与该方法的旧版混淆,即专门用于ARRAY
的Comparator.all()
方法,它使用不同的调用方式。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
any_() → ColumnOperators¶ 针对父对象生成一个
any_()
子句。有关示例,请参阅
any_()
的文档。注意
确保不要将较新的
ColumnOperators.any_()
方法与该方法的旧版混淆,即专门用于ARRAY
的Comparator.any()
方法,它使用不同的调用方式。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
asc() → ColumnOperators¶ 针对父对象生成一个
asc()
子句。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
between(cleft: Any, cright: Any, symmetric: bool = False) → ColumnOperators¶ 针对父对象生成一个
between()
子句,给定上下限范围。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_and(other: Any) → ColumnOperators¶ 生成一个按位 AND 操作,通常通过
&
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_lshift(other: Any) → ColumnOperators¶ 生成一个按位左移操作,通常通过
<<
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_not() → ColumnOperators¶ 生成一个按位取反操作,通常通过
~
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_or(other: Any) → ColumnOperators¶ 生成一个按位 OR 操作,通常通过
|
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_rshift(other: Any) → ColumnOperators¶ 生成一个按位右移操作,通常通过
>>
运算符。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bitwise_xor(other: Any) → ColumnOperators¶ 生成一个按位异或操作,通常通过
^
运算符,或者#
用于 PostgreSQL。版本 2.0.2 中的新增内容。
另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
bool_op(opstring: str, precedence: int = 0, python_impl: Callable[[...], Any] | None = None) → Callable[[Any], Operators]¶ 继承自
Operators.bool_op()
方法Operators
返回一个自定义布尔运算符。
此方法是调用
Operators.op()
并将Operators.op.is_comparison
标记设置为 True 的简写。使用Operators.bool_op()
的主要优点是,在使用列构造时,返回表达式的“布尔”性质将可用于 PEP 484 目的。另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
collate(collation: str) → ColumnOperators¶ 使用给定的排序规则字符串,针对父对象生成
collate()
子句。另请参阅
-
方法
sqlalchemy.sql.expression.ColumnOperators.
concat(other: Any) → ColumnOperators¶ 实现“concat”运算符。
在列上下文中,生成子句
a || b
,或在 MySQL 上使用concat()
运算符。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
contains(other: Any, **kw: Any) → ColumnOperators¶ 实现“contains”运算符。
生成一个 LIKE 表达式,它测试字符串值的中间部分的匹配项
column LIKE '%' || <other> || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.contains("foobar"))
由于操作符使用
LIKE
,因此在 <&other> 表达式中存在的通配符字符"%"
和"_"
也将表现为通配符。对于字面字符串值,ColumnOperators.contains.autoescape
标志可以设置为True
,以便对字符串值中这些字符的出现应用转义,使它们匹配自身,而不是作为通配符字符。或者,ColumnOperators.contains.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是字面字符串时非常有用。- 参数:
other¶ – 要比较的表达式。这通常是一个简单的字符串值,但也可以是任意的 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会被转义,除非ColumnOperators.contains.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.contains("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE '%' || :param || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.contains("foo/%bar", escape="^")
将呈现为
somecolumn LIKE '%' || :param || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.contains.autoescape
组合使用somecolumn.contains("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
desc() → ColumnOperators¶ 针对父对象生成
desc()
子句。
-
method
sqlalchemy.sql.expression.ColumnOperators.
distinct() → ColumnOperators¶ 针对父对象生成
distinct()
子句。
-
method
sqlalchemy.sql.expression.ColumnOperators.
endswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ 实现 'endswith' 操作符。
生成一个 LIKE 表达式,用于测试字符串值结尾的匹配情况
column LIKE '%' || <other>
例如:
stmt = select(sometable).\ where(sometable.c.column.endswith("foobar"))
由于操作符使用
LIKE
,因此在 <&other> 表达式中存在的通配符字符"%"
和"_"
也将表现为通配符。对于字面字符串值,ColumnOperators.endswith.autoescape
标志可以设置为True
,以便对字符串值中这些字符的出现应用转义,使它们匹配自身,而不是作为通配符字符。或者,ColumnOperators.endswith.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是字面字符串时非常有用。- 参数:
other¶ – 要比较的表达式。这通常是一个简单的字符串值,但也可以是任意的 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会被转义,除非ColumnOperators.endswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.endswith("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE '%' || :param ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.endswith("foo/%bar", escape="^")
将呈现为
somecolumn LIKE '%' || :param ESCAPE '^'
该参数也可以与
ColumnOperators.endswith.autoescape
组合使用somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
icontains(other: Any, **kw: Any) → ColumnOperators¶ 实现
icontains
运算符,例如ColumnOperators.contains()
的不区分大小写版本。生成一个 LIKE 表达式,用于测试字符串值中间的不区分大小写匹配。
lower(column) LIKE '%' || lower(<other>) || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.icontains("foobar"))
由于运算符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样起作用。对于文字字符串值,ColumnOperators.icontains.autoescape
标志可以设置为True
以对字符串值中这些字符的出现进行转义,以便它们以自身形式匹配,而不是作为通配符。或者,ColumnOperators.icontains.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是文字字符串时很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个简单的字符串值,但也可以是任意的 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会被转义,除非ColumnOperators.icontains.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.icontains("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.icontains("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.contains.autoescape
组合使用somecolumn.icontains("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
iendswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ 实现
iendswith
运算符,例如ColumnOperators.endswith()
的不区分大小写版本。生成一个 LIKE 表达式,用于测试字符串值末尾的不区分大小写匹配。
lower(column) LIKE '%' || lower(<other>)
例如:
stmt = select(sometable).\ where(sometable.c.column.iendswith("foobar"))
由于运算符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样起作用。对于文字字符串值,ColumnOperators.iendswith.autoescape
标志可以设置为True
以对字符串值中这些字符的出现进行转义,以便它们以自身形式匹配,而不是作为通配符。或者,ColumnOperators.iendswith.escape
参数将建立一个给定的字符作为转义字符,这在目标表达式不是文字字符串时很有用。- 参数:
other¶ – 要比较的表达式。这通常是一个简单的字符串值,但也可以是任意的 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会被转义,除非ColumnOperators.iendswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.iendswith("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.iendswith("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '^'
参数也可以与
ColumnOperators.iendswith.autoescape
组合使用somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
ilike(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
ilike
运算符,例如不区分大小写的 LIKE。在列上下文中,生成一个表达式,其形式为
lower(a) LIKE lower(other)
或者在支持 ILIKE 运算符的后端上
a ILIKE other
例如:
stmt = select(sometable).\ where(sometable.c.column.ilike("%foobar%"))
-
method
sqlalchemy.sql.expression.ColumnOperators.
in_(other: Any) → ColumnOperators¶ 实现
in
运算符。在列上下文中,生成子句
column IN <other>
。给定的参数
other
可以是文字值的列表,例如
stmt.where(column.in_([1, 2, 3]))
在这种调用形式中,项目列表被转换为与给定列表长度相同的绑定参数集。
WHERE COL IN (?, ?, ?)
如果比较是对包含多个表达式的
tuple_()
,则可以提供元组列表。from sqlalchemy import tuple_ stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))
空列表,例如
stmt.where(column.in_([]))
在这种调用形式中,表达式呈现“空集”表达式。这些表达式针对各个后端定制,通常试图获取一个空 SELECT 语句作为子查询。例如在 SQLite 上,表达式是
WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
在版本 1.4 中更改: 空 IN 表达式现在在所有情况下都使用运行时生成的 SELECT 子查询。
绑定参数,例如
bindparam()
,如果它包含bindparam.expanding
标志,则可以使用。stmt.where(column.in_(bindparam('value', expanding=True)))
在这种调用形式中,表达式呈现一个特殊的非 SQL 占位符表达式,看起来像
WHERE COL IN ([EXPANDING_value])
此占位符表达式在语句执行时被拦截,转换为前面说明的可变数量绑定参数形式。如果语句被执行为
connection.execute(stmt, {"value": [1, 2, 3]})
数据库将为每个值传递一个绑定参数。
WHERE COL IN (?, ?, ?)
在版本 1.2 中添加: 添加了“扩展”绑定参数。
如果传递空列表,将渲染一个特殊的“空列表”表达式,该表达式特定于使用的数据库。在 SQLite 上,这将是
WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)
在版本 1.3 中添加: “扩展”绑定参数现在支持空列表。
一个
select()
结构,通常是相关标量选择stmt.where( column.in_( select(othertable.c.y). where(table.c.x == othertable.c.x) ) )
在这种调用形式中,
ColumnOperators.in_()
按给定方式呈现。WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x)
- 参数:
other¶ – 字面量列表、
select()
结构或包含bindparam()
结构的bindparam.expanding
标志设置为 True。
-
method
sqlalchemy.sql.expression.ColumnOperators.
is_(other: Any) → ColumnOperators¶ 实现
IS
运算符。通常,
IS
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS
可能需要。
-
method
sqlalchemy.sql.expression.ColumnOperators.
is_distinct_from(other: Any) → ColumnOperators¶ 实现
IS DISTINCT FROM
运算符。在大多数平台上呈现“a IS DISTINCT FROM b”;在某些平台上(如 SQLite)可能呈现“a IS NOT b”。
-
method
sqlalchemy.sql.expression.ColumnOperators.
is_not(other: Any) → ColumnOperators¶ 实现
IS NOT
运算符。通常,
IS NOT
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS NOT
可能需要。版本 1.4 中的变更: 操作符
is_not()
在以前版本中更名为isnot()
。为了向后兼容,以前的名字仍然可以使用。
-
method
sqlalchemy.sql.expression.ColumnOperators.
is_not_distinct_from(other: Any) → ColumnOperators¶ 实现
IS NOT DISTINCT FROM
操作符。在大多数平台上呈现“a IS NOT DISTINCT FROM b”;在 SQLite 等一些平台上可能呈现“a IS b”。
版本 1.4 中的变更: 操作符
is_not_distinct_from()
在以前版本中更名为isnot_distinct_from()
。为了向后兼容,以前的名字仍然可以使用。
-
method
sqlalchemy.sql.expression.ColumnOperators.
isnot(other: Any) → ColumnOperators¶ 实现
IS NOT
运算符。通常,
IS NOT
在与None
的值进行比较时会自动生成,该值解析为NULL
。但是,如果在某些平台上与布尔值进行比较,则显式使用IS NOT
可能需要。版本 1.4 中的变更: 操作符
is_not()
在以前版本中更名为isnot()
。为了向后兼容,以前的名字仍然可以使用。
-
method
sqlalchemy.sql.expression.ColumnOperators.
isnot_distinct_from(other: Any) → ColumnOperators¶ 实现
IS NOT DISTINCT FROM
操作符。在大多数平台上呈现“a IS NOT DISTINCT FROM b”;在 SQLite 等一些平台上可能呈现“a IS b”。
版本 1.4 中的变更: 操作符
is_not_distinct_from()
在以前版本中更名为isnot_distinct_from()
。为了向后兼容,以前的名字仍然可以使用。
-
method
sqlalchemy.sql.expression.ColumnOperators.
istartswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ 实现
istartswith
操作符,例如,ColumnOperators.startswith()
的不区分大小写的版本。生成一个 LIKE 表达式,用于测试字符串值开头的非敏感匹配
lower(column) LIKE lower(<other>) || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.istartswith("foobar"))
由于该操作符使用
LIKE
,因此 <other> 表达式中存在的通配符"%"
和"_"
也将像通配符一样工作。对于文字字符串值,ColumnOperators.istartswith.autoescape
标志可以设置为True
,将这些字符在字符串值中的出现进行转义,以便它们匹配自身而不是通配符。或者,ColumnOperators.istartswith.escape
参数将建立一个给定的字符作为转义字符,当目标表达式不是文字字符串时,这很有用。- 参数:
other¶ – 要比较的表达式。这通常是普通字符串值,但也可以是任意 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会被转义,除非ColumnOperators.istartswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.istartswith("foo%bar", autoescape=True)
将呈现为
lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.istartswith("foo/%bar", escape="^")
将呈现为
lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.istartswith.autoescape
结合使用somecolumn.istartswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
like(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
like
运算符。在列上下文中,产生表达式
a LIKE other
例如:
stmt = select(sometable).\ where(sometable.c.column.like("%foobar%"))
-
method
sqlalchemy.sql.expression.ColumnOperators.
match(other: Any, **kwargs: Any) → ColumnOperators¶ 实现数据库特有的 'match' 运算符。
ColumnOperators.match()
尝试解析为后端提供的 MATCH 类函数或运算符。例如:
-
method
sqlalchemy.sql.expression.ColumnOperators.
not_ilike(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
NOT ILIKE
运算符。这等效于使用否定运算符和
ColumnOperators.ilike()
,即~x.ilike(y)
。在版本 1.4 中更改:
not_ilike()
运算符在之前的版本中被重命名为notilike()
。为了向后兼容,之前的名称仍然可用。
-
method
sqlalchemy.sql.expression.ColumnOperators.
not_in(other: Any) → ColumnOperators¶ 实现
NOT IN
运算符。这等效于使用否定运算符和
ColumnOperators.in_()
,即~x.in_(y)
。如果
other
是一个空序列,编译器将产生一个 “空不在” 表达式。默认情况下,此表达式为 “1 = 1”,在所有情况下都产生真值。create_engine.empty_in_strategy
可以用来改变这种行为。在版本 1.4 中更改:
not_in()
运算符在之前的版本中被重命名为notin_()
。为了向后兼容,之前的名称仍然可用。版本 1.2 中变更:
ColumnOperators.in_()
和ColumnOperators.not_in()
运算符现在默认情况下会为一个空的 IN 序列生成一个“静态”表达式。
-
method
sqlalchemy.sql.expression.ColumnOperators.
not_like(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
NOT LIKE
运算符。这等同于使用否定运算符与
ColumnOperators.like()
,即~x.like(y)
。版本 1.4 中变更:
not_like()
运算符从之前版本中的notlike()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
notilike(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
NOT ILIKE
运算符。这等效于使用否定运算符和
ColumnOperators.ilike()
,即~x.ilike(y)
。在版本 1.4 中更改:
not_ilike()
运算符在之前的版本中被重命名为notilike()
。为了向后兼容,之前的名称仍然可用。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
notin_(other: Any) → ColumnOperators¶ 实现
NOT IN
运算符。这等效于使用否定运算符和
ColumnOperators.in_()
,即~x.in_(y)
。如果
other
是一个空序列,编译器将产生一个 “空不在” 表达式。默认情况下,此表达式为 “1 = 1”,在所有情况下都产生真值。create_engine.empty_in_strategy
可以用来改变这种行为。在版本 1.4 中更改:
not_in()
运算符在之前的版本中被重命名为notin_()
。为了向后兼容,之前的名称仍然可用。版本 1.2 中变更:
ColumnOperators.in_()
和ColumnOperators.not_in()
运算符现在默认情况下会为一个空的 IN 序列生成一个“静态”表达式。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
notlike(other: Any, escape: str | None = None) → ColumnOperators¶ 实现
NOT LIKE
运算符。这等同于使用否定运算符与
ColumnOperators.like()
,即~x.like(y)
。版本 1.4 中变更:
not_like()
运算符从之前版本中的notlike()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
nulls_first() → ColumnOperators¶ 针对父对象生成一个
nulls_first()
子句。版本 1.4 中变更:
nulls_first()
运算符从之前版本中的nullsfirst()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
nulls_last() → ColumnOperators¶ 针对父对象生成一个
nulls_last()
子句。版本 1.4 中变更:
nulls_last()
运算符从之前版本中的nullslast()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
nullsfirst() → ColumnOperators¶ 针对父对象生成一个
nulls_first()
子句。版本 1.4 中变更:
nulls_first()
运算符从之前版本中的nullsfirst()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
nullslast() → ColumnOperators¶ 针对父对象生成一个
nulls_last()
子句。版本 1.4 中变更:
nulls_last()
运算符从之前版本中的nullslast()
重命名。旧的名称仍然可用以确保向后兼容性。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Type[TypeEngine[Any]] | TypeEngine[Any] | None = None, python_impl: Callable[..., Any] | None = None) → Callable[[Any], Operators]¶ 继承自
Operators.op()
方法Operators
生成一个通用的操作符函数。
例如
somecolumn.op("*")(5)
生成
somecolumn * 5
此函数还可用于明确地创建位运算符。例如
somecolumn.op('&')(0xff)
是
somecolumn
中值的按位与。- 参数:
opstring¶ – 将作为此元素和传递给生成函数的表达式之间的中缀运算符输出的字符串。
precedence¶ –
数据库在 SQL 表达式中预计应用于该运算符的优先级。此整数值充当 SQL 编译器的一个提示,让它知道何时应在特定操作周围渲染显式括号。较小的数字将导致表达式在应用于另一个优先级较高的运算符时被加括号。默认值
0
低于除逗号 (,
) 和AS
运算符之外的所有运算符。值为 100 将高于或等于所有运算符,而 -100 将低于或等于所有运算符。另请参阅
我正在使用 op() 生成自定义运算符,但我的括号显示不正确 - 有关 SQLAlchemy SQL 编译器如何渲染括号的详细说明
is_comparison¶ –
旧版;如果为 True,则运算符将被视为“比较”运算符,即评估为布尔值 true/false 的运算符,如
==
、>
等。提供此标志是为了让 ORM 关系能够在使用自定义联接条件时确定运算符是比较运算符。使用
is_comparison
参数已被使用Operators.bool_op()
方法取代;这个更简洁的运算符会自动设置该参数,但也会提供正确的 PEP 484 类型提示支持,因为返回的对象将表示一个“布尔”数据类型,即BinaryExpression[bool]
。return_type¶ – 一个
TypeEngine
类或对象,它将强制该运算符生成的表达式的返回类型为该类型。默认情况下,指定了Operators.op.is_comparison
的运算符将解析为Boolean
,而那些没有指定该参数的运算符将与左侧操作数的类型相同。python_impl¶ –
一个可选的 Python 函数,它可以评估两个 Python 值,与在数据库服务器上运行时此运算符的工作方式相同。这对 Python 中的 SQL 表达式评估函数很有用,例如 ORM 混合属性和 ORM“评估器”,用于在多行更新或删除后匹配会话中的对象。
例如
>>> expr = column('x').op('+', python_impl=lambda a, b: a + b)('y')
上述表达式的运算符也适用于非 SQL 左边和右边对象
>>> expr.operator(5, 10) 15
2.0 版中的新功能。
-
方法
sqlalchemy.sql.expression.ColumnOperators.
operate(op: OperatorType, *other: Any, **kwargs: Any) → Operators¶ 继承自
Operators.operate()
方法Operators
对一个参数进行操作。
这是最低级别的操作,默认情况下会引发
NotImplementedError
。在子类上覆盖它可以允许将通用行为应用于所有操作。例如,覆盖
ColumnOperators
以将func.lower()
应用于左右两边class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- 参数:
op¶ – 运算符可调用对象。
*other¶ – 运算的“另一方”。对于大多数运算来说将是一个单独的标量。
**kwargs¶ – 修饰符。这些可以由特殊运算符传递,例如
ColumnOperators.contains()
。
-
method
sqlalchemy.sql.expression.ColumnOperators.
regexp_match(pattern: Any, flags: str | None = None) → ColumnOperators¶ 实现特定于数据库的“正则表达式匹配”运算符。
例如:
stmt = select(table.c.some_column).where( table.c.some_column.regexp_match('^(b|c)') )
ColumnOperators.regexp_match()
尝试解析为后端提供的类似 REGEXP 的函数或运算符,但是可用的特定正则表达式语法和标志是 **不是后端无关的**。示例包括
PostgreSQL - 渲染
x ~ y
或x !~ y
当否定时。Oracle - 渲染
REGEXP_LIKE(x, y)
SQLite - 使用 SQLite 的
REGEXP
占位符运算符,并调用 Pythonre.match()
内置函数。其他后端可能提供特殊的实现。
没有特殊实现的后端将发出运算符为“REGEXP”或“NOT REGEXP”。例如,这与 SQLite 和 MySQL 兼容。
正则表达式支持目前已在 Oracle、PostgreSQL、MySQL 和 MariaDB 中实现。SQLite 提供部分支持。第三方方言之间的支持可能会有所不同。
- 参数:
1.4 版中的新功能。
在版本 1.4.48 中更改,: 2.0.18 请注意,由于实现错误,以前“flags”参数除了纯 Python 字符串外,还接受 SQL 表达式对象,例如列表达式。此实现无法与缓存正确配合,因此已删除;对于“flags”参数,应仅传递字符串,因为这些标志在 SQL 表达式中以文字内联值的
-
method
sqlalchemy.sql.expression.ColumnOperators.
regexp_replace(pattern: Any, replacement: Any, flags: str | None = None) → ColumnOperators¶ 实现特定于数据库的“正则表达式替换”运算符。
例如:
stmt = select( table.c.some_column.regexp_replace( 'b(..)', 'XY', flags='g' ) )
ColumnOperators.regexp_replace()
尝试解析为后端提供的类似 REGEXP_REPLACE 的函数,该函数通常会发出函数REGEXP_REPLACE()
。但是,可用的特定正则表达式语法和标志是 **不是后端无关的**。正则表达式替换支持目前已在 Oracle、PostgreSQL、MySQL 8 或更高版本以及 MariaDB 中实现。第三方方言之间的支持可能会有所不同。
- 参数:
1.4 版中的新功能。
在版本 1.4.48 中更改,: 2.0.18 请注意,由于实现错误,以前“flags”参数除了纯 Python 字符串外,还接受 SQL 表达式对象,例如列表达式。此实现无法与缓存正确配合,因此已删除;对于“flags”参数,应仅传递字符串,因为这些标志在 SQL 表达式中以文字内联值的
-
method
sqlalchemy.sql.expression.ColumnOperators.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → Operators¶ inherited from the
Operators.reverse_operate()
method ofOperators
对参数进行反向操作。
用法与
operate()
相同。
-
method
sqlalchemy.sql.expression.ColumnOperators.
startswith(other: Any, escape: str | None = None, autoescape: bool = False) → ColumnOperators¶ 实现
startswith
运算符。生成一个 LIKE 表达式,它测试与字符串值开头的匹配。
column LIKE <other> || '%'
例如:
stmt = select(sometable).\ where(sometable.c.column.startswith("foobar"))
由于该运算符使用
LIKE
,因此在 <other> 表达式中出现的通配符字符"%"
和"_"
也将像通配符一样工作。对于文字字符串值,ColumnOperators.startswith.autoescape
标志可以设置为True
,以对字符串值内的这些字符的出现进行转义,以便它们本身匹配,而不是作为通配符字符。或者,ColumnOperators.startswith.escape
参数将建立一个给定的字符作为转义字符,当目标表达式不是文字字符串时,这将很有用。- 参数:
other¶ – 要比较的表达式。这通常是纯字符串值,但也可能是任意 SQL 表达式。LIKE 通配符字符
%
和_
默认情况下不会转义,除非ColumnOperators.startswith.autoescape
标志设置为 True。autoescape¶ –
布尔值;当为 True 时,在 LIKE 表达式中建立一个转义字符,然后将其应用于比较值中
"%"
、"_"
和转义字符本身的所有出现,假设该值是一个字面字符串,而不是 SQL 表达式。例如,表达式
somecolumn.startswith("foo%bar", autoescape=True)
将呈现为
somecolumn LIKE :param || '%' ESCAPE '/'
其中
:param
的值为"foo/%bar"
。escape¶ –
一个字符,当给出时将使用
ESCAPE
关键字渲染,以建立该字符作为转义字符。然后,该字符可以放在%
和_
的出现之前,以允许它们充当自身,而不是通配符字符。例如,表达式
somecolumn.startswith("foo/%bar", escape="^")
将呈现为
somecolumn LIKE :param || '%' ESCAPE '^'
该参数也可以与
ColumnOperators.startswith.autoescape
组合使用somecolumn.startswith("foo%bar^bat", escape="^", autoescape=True)
在上面,给定的字面参数将在传递给数据库之前被转换为
"foo^%bar^^bat"
。
-
attribute
sqlalchemy.sql.expression.ColumnOperators.
timetuple: Literal[None] = None¶ Hack,允许 datetime 对象在 LHS 上进行比较。
-
method
- class sqlalchemy.sql.expression.Extract¶
表示一个 SQL EXTRACT 子句,
extract(field FROM expr)
。
- class sqlalchemy.sql.expression.False_¶
表示 SQL 语句中的
false
关键字,或等效项。类签名
class
sqlalchemy.sql.expression.False_
(sqlalchemy.sql.expression.SingletonConstant
,sqlalchemy.sql.roles.ConstExprRole
,sqlalchemy.sql.expression.ColumnElement
)
- class sqlalchemy.sql.expression.FunctionFilter¶
表示一个函数 FILTER 子句。
这是一种针对聚合函数和窗口函数的特殊运算符,它控制传递给它的行。它仅受某些数据库后端支持。
调用
FunctionFilter
是通过FunctionElement.filter()
进行的。func.count(1).filter(True)
类签名
类
sqlalchemy.sql.expression.FunctionFilter
(sqlalchemy.sql.expression.Generative
,sqlalchemy.sql.expression.ColumnElement
)-
方法
sqlalchemy.sql.expression.FunctionFilter.
filter(*criterion: _ColumnExpressionArgument[bool]) → Self¶ 对该函数生成额外的 FILTER。
此方法在
FunctionElement.filter()
设置的初始条件的基础上添加额外的条件。多个条件在 SQL 渲染时通过
AND
连接在一起。
-
方法
sqlalchemy.sql.expression.FunctionFilter.
over(partition_by: Iterable[_ColumnExpressionArgument[Any]] | _ColumnExpressionArgument[Any] | None = None, order_by: Iterable[_ColumnExpressionArgument[Any]] | _ColumnExpressionArgument[Any] | None = None, range_: typing_Tuple[int | None, int | None] | None = None, rows: typing_Tuple[int | None, int | None] | None = None) → Over[_T]¶ 对这个已过滤函数生成一个 OVER 子句。
针对聚合或所谓“窗口”函数使用,适用于支持窗口函数的数据库后端。
表达式
func.rank().filter(MyClass.y > 5).over(order_by='x')
是以下的简写
from sqlalchemy import over, funcfilter over(funcfilter(func.rank(), MyClass.y > 5), order_by='x')
有关完整描述,请参见
over()
。
-
方法
sqlalchemy.sql.expression.FunctionFilter.
self_group(against: OperatorType | None = None) → Self | Grouping[_T]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。在表达式组合在一起时,
self_group()
的应用是自动的 - 用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造会考虑运算符优先级 - 因此在类似x OR (y AND z)
的表达式中可能不需要圆括号 - AND 的优先级高于 OR。ClauseElement
的基本self_group()
方法只返回自身。
-
方法
sqlalchemy.sql.expression.FunctionFilter.
within_group(*order_by: _ColumnExpressionArgument[Any]) → WithinGroup[_T]¶ 对该函数生成一个 WITHIN GROUP (ORDER BY expr) 子句。
-
方法
- 类 sqlalchemy.sql.expression.Label¶
表示一个列标签 (AS)。
表示一个标签,通常使用
AS
sql 关键字应用于任何列级元素。类签名
类
sqlalchemy.sql.expression.Label
(sqlalchemy.sql.roles.LabeledColumnExprRole
,sqlalchemy.sql.expression.NamedColumn
)-
属性
sqlalchemy.sql.expression.Label.
foreign_keys: AbstractSet[ForeignKey]¶
-
属性
sqlalchemy.sql.expression.Label.
primary_key: bool¶
-
方法
sqlalchemy.sql.expression.Label.
self_group(against: OperatorType | None = None) → Label[_T]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()
的应用是自动的 - 终端用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造会考虑运算符优先级 - 因此在像x OR (y AND z)
这样的表达式中可能不需要括号 - AND 的优先级高于 OR。self_group()
的基本方法ClauseElement
只是返回自身。
-
属性
- class sqlalchemy.sql.expression.Null¶
表示 SQL 语句中的 NULL 关键字。
类签名
class
sqlalchemy.sql.expression.Null
(sqlalchemy.sql.expression.SingletonConstant
,sqlalchemy.sql.roles.ConstExprRole
,sqlalchemy.sql.expression.ColumnElement
)
- class sqlalchemy.sql.expression.Operators¶
比较和逻辑运算符的基础。
实现基本方法
Operators.operate()
和Operators.reverse_operate()
,以及Operators.__and__()
,Operators.__or__()
,Operators.__invert__()
。成员
__and__(), __invert__(), __or__(), __sa_operate__(), bool_op(), op(), operate(), reverse_operate()
通常通过其最常见的子类
ColumnOperators
使用。-
method
sqlalchemy.sql.expression.Operators.
__and__(other: Any) → Operators¶ 实现
&
操作符。在与 SQL 表达式一起使用时,会导致 AND 操作,等效于
and_()
,即a & b
等效于
from sqlalchemy import and_ and_(a, b)
在使用
&
时,应注意运算符优先级;&
运算符具有最高优先级。如果操作数包含进一步的子表达式,则应将它们括在括号中。(a == 2) & (b == 4)
-
method
sqlalchemy.sql.expression.Operators.
__invert__() → Operators¶ 实现
~
运算符。在与 SQL 表达式一起使用时,会导致 NOT 操作,等效于
not_()
,即~a
等效于
from sqlalchemy import not_ not_(a)
-
method
sqlalchemy.sql.expression.Operators.
__or__(other: Any) → Operators¶ 实现
|
运算符。当与 SQL 表达式一起使用时,会产生一个 OR 操作,等效于
or_()
,即a | b
等效于
from sqlalchemy import or_ or_(a, b)
在使用
|
时应注意运算符优先级;|
运算符具有最高优先级。如果操作数包含进一步的子表达式,则应将其括在括号中。(a == 2) | (b == 4)
-
method
sqlalchemy.sql.expression.Operators.
__sa_operate__(op: OperatorType, *other: Any, **kwargs: Any) → Operators¶ 对一个参数进行操作。
这是最低级别的操作,默认情况下会引发
NotImplementedError
。在子类上覆盖它可以允许将通用行为应用于所有操作。例如,覆盖
ColumnOperators
以将func.lower()
应用于左右两边class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- 参数:
op¶ – 运算符可调用对象。
*other¶ – 操作的“另一侧”。对于大多数操作来说,它将是一个标量。
**kwargs¶ – 修饰符。这些可能由特殊运算符传递,例如
ColumnOperators.contains()
。
-
method
sqlalchemy.sql.expression.Operators.
bool_op(opstring: str, precedence: int = 0, python_impl: Callable[[...], Any] | None = None) → Callable[[Any], Operators]¶ 返回一个自定义布尔运算符。
此方法是调用
Operators.op()
并传递Operators.op.is_comparison
标志为 True 的简写。使用Operators.bool_op()
的一个主要优点是,当使用列构造时,返回表达式的“布尔”性质将对 PEP 484 目的有效。另请参阅
-
method
sqlalchemy.sql.expression.Operators.
op(opstring: str, precedence: int = 0, is_comparison: bool = False, return_type: Type[TypeEngine[Any]] | TypeEngine[Any] | None = None, python_impl: Callable[..., Any] | None = None) → Callable[[Any], Operators]¶ 生成一个通用的操作符函数。
例如
somecolumn.op("*")(5)
生成
somecolumn * 5
此函数还可用于明确地创建位运算符。例如
somecolumn.op('&')(0xff)
是
somecolumn
中值的按位与。- 参数:
opstring¶ – 将作为此元素和传递给生成的函数的表达式之间的中缀运算符输出的字符串。
precedence¶ –
数据库在 SQL 表达式中预计应用于该运算符的优先级。此整数值充当 SQL 编译器的一个提示,让它知道何时应在特定操作周围渲染显式括号。较小的数字将导致表达式在应用于另一个优先级较高的运算符时被加括号。默认值
0
低于除逗号 (,
) 和AS
运算符之外的所有运算符。值为 100 将高于或等于所有运算符,而 -100 将低于或等于所有运算符。另请参阅
我正在使用 op() 生成自定义运算符,但我的括号显示不正确 - 有关 SQLAlchemy SQL 编译器如何渲染括号的详细说明
is_comparison¶ –
旧版;如果为 True,则运算符将被视为“比较”运算符,即评估为布尔值 true/false 的运算符,如
==
、>
等。提供此标志是为了让 ORM 关系能够在使用自定义联接条件时确定运算符是比较运算符。使用
is_comparison
参数已被使用Operators.bool_op()
方法代替;此更简洁的运算符会自动设置此参数,但也提供正确的 PEP 484 类型支持,因为返回的对象将表示“布尔”数据类型,即BinaryExpression[bool]
。return_type¶ – 一个
TypeEngine
类或对象,它将强制由该运算符生成的表达式的返回类型为该类型。默认情况下,指定Operators.op.is_comparison
的运算符将解析为Boolean
,而那些不指定运算符将与左手操作数的类型相同。python_impl¶ –
一个可选的 Python 函数,它可以评估两个 Python 值,与在数据库服务器上运行时此运算符的工作方式相同。这对 Python 中的 SQL 表达式评估函数很有用,例如 ORM 混合属性和 ORM“评估器”,用于在多行更新或删除后匹配会话中的对象。
例如
>>> expr = column('x').op('+', python_impl=lambda a, b: a + b)('y')
上述表达式的运算符也适用于非 SQL 左边和右边对象
>>> expr.operator(5, 10) 15
2.0 版中的新功能。
-
method
sqlalchemy.sql.expression.Operators.
operate(op: OperatorType, *other: Any, **kwargs: Any) → Operators¶ 对一个参数进行操作。
这是最低级别的操作,默认情况下会引发
NotImplementedError
。在子类上覆盖它可以允许将通用行为应用于所有操作。例如,覆盖
ColumnOperators
以将func.lower()
应用于左右两边class MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
- 参数:
op¶ – 运算符可调用对象。
*other¶ – 运算的“另一侧”。对于大多数运算而言,将是一个单独的标量。
**kwargs¶ – 修饰符。这些可能由诸如
ColumnOperators.contains()
的特殊运算符传递。
-
method
sqlalchemy.sql.expression.Operators.
reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → Operators¶ 对参数进行反向操作。
用法与
operate()
相同。
-
method
- class sqlalchemy.sql.expression.Over¶
表示一个 OVER 子句。
这是一个针对所谓的“窗口”函数以及任何聚合函数的特殊运算符,它会生成相对于结果集本身的结果。大多数现代 SQL 后端现在都支持窗口函数。
成员
-
attribute
sqlalchemy.sql.expression.Over.
element: ColumnElement[_T]¶ 此
Over
对象所引用的基础表达式对象。
-
attribute
- class sqlalchemy.sql.expression.SQLColumnExpression¶
一个类型,可用于指示任何 SQL 列元素或充当其替代的对象。
SQLColumnExpression
是ColumnElement
的基类,以及 ORM 元素(例如InstrumentedAttribute
)的基础类中的一部分,它可以用于 PEP 484 类型来指示应该作为列表达式工作的参数或返回值。版本 2.0.0b4 中的新内容。
类签名
class
sqlalchemy.sql.expression.SQLColumnExpression
(sqlalchemy.sql.expression.SQLCoreOperations
,sqlalchemy.sql.roles.ExpressionElementRole
,sqlalchemy.util.langhelpers.TypingOnly
)
- class sqlalchemy.sql.expression.TextClause¶
表示一个文字 SQL 文本片段。
例如:
from sqlalchemy import text t = text("SELECT * FROM users") result = connection.execute(t)
使用
text()
函数可以生成TextClause
构造;有关完整文档,请参见该函数。另请参阅
类签名
class
sqlalchemy.sql.expression.TextClause
(sqlalchemy.sql.roles.DDLConstraintColumnRole
,sqlalchemy.sql.roles.DDLExpressionRole
,sqlalchemy.sql.roles.StatementOptionRole
,sqlalchemy.sql.roles.WhereHavingRole
,sqlalchemy.sql.roles.OrderByRole
,sqlalchemy.sql.roles.FromClauseRole
,sqlalchemy.sql.roles.SelectStatementRole
,sqlalchemy.sql.roles.InElementRole
,sqlalchemy.sql.expression.Generative
,sqlalchemy.sql.expression.Executable
,sqlalchemy.sql.expression.DQLDMLClauseElement
,sqlalchemy.sql.roles.BinaryElementRole
,sqlalchemy.inspection.Inspectable
)-
method
sqlalchemy.sql.expression.TextClause.
bindparams(*binds: BindParameter[Any], **names_to_values: Any) → Self¶ 在该
TextClause
构造中,建立绑定参数的值和/或类型。给定一个文本构造,例如
from sqlalchemy import text stmt = text("SELECT id, name FROM user WHERE name=:name " "AND timestamp=:timestamp")
可以使用
TextClause.bindparams()
方法使用简单的关键字参数来建立:name
和:timestamp
的初始值stmt = stmt.bindparams(name='jack', timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5))
上面的内容中,将生成新的
BindParameter
对象,其名称分别为name
和timestamp
,值分别为jack
和datetime.datetime(2012, 10, 8, 15, 12, 5)
。类型将从给定值推断,在本例中分别为String
和DateTime
.当需要特定类型行为时,可以使用位置
*binds
参数来指定bindparam()
构造。这些构造必须至少包含key
参数,然后是可选值和类型from sqlalchemy import bindparam stmt = stmt.bindparams( bindparam('name', value='jack', type_=String), bindparam('timestamp', type_=DateTime) )
在上面,我们为
timestamp
绑定指定了DateTime
类型,为name
绑定指定了String
类型。在name
的情况下,我们还设置了"jack"
的默认值。可以在语句执行时提供其他绑定参数,例如
result = connection.execute(stmt, timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5))
可以重复调用
TextClause.bindparams()
方法,它将重新使用现有的BindParameter
对象来添加新信息。例如,我们可以先使用类型信息调用TextClause.bindparams()
,然后使用值信息调用TextClause.bindparams()
,并且它将被合并stmt = text("SELECT id, name FROM user WHERE name=:name " "AND timestamp=:timestamp") stmt = stmt.bindparams( bindparam('name', type_=String), bindparam('timestamp', type_=DateTime) ) stmt = stmt.bindparams( name='jack', timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) )
TextClause.bindparams()
方法还支持 **唯一** 绑定参数的概念。这些参数是在语句编译时根据名称进行“唯一化”的,因此,可以将多个text()
构造组合在一起,而不会出现名称冲突。要使用此功能,请在每个bindparam()
对象上指定BindParameter.unique
标志stmt1 = text("select id from table where name=:name").bindparams( bindparam("name", value='name1', unique=True) ) stmt2 = text("select id from table where name=:name").bindparams( bindparam("name", value='name2', unique=True) ) union = union_all( stmt1.columns(column("id")), stmt2.columns(column("id")) )
上面的语句将呈现为
select id from table where name=:name_1 UNION ALL select id from table where name=:name_2
New in version 1.3.11: 添加了对
BindParameter.unique
标志的支持,以与text()
构造一起使用。
-
method
sqlalchemy.sql.expression.TextClause.
columns(*cols: _ColumnExpressionArgument[Any], **types: _TypeEngineArgument[Any]) → TextualSelect¶ 将该
TextClause
对象转换为TextualSelect
对象,该对象在功能上等同于 SELECT 语句。TextualSelect
是SelectBase
层次结构的一部分,可以通过使用TextualSelect.subquery()
方法将其嵌入到另一个语句中,以生成Subquery
对象,然后可以从中进行 SELECT 操作。此函数实际上弥合了完全文本 SELECT 语句与 SQL 表达式语言中“可选择”的概念之间的差距
from sqlalchemy.sql import column, text stmt = text("SELECT id, name FROM some_table") stmt = stmt.columns(column('id'), column('name')).subquery('st') stmt = select(mytable).\ select_from( mytable.join(stmt, mytable.c.name == stmt.c.name) ).where(stmt.c.id > 5)
在上面,我们向
TextClause.columns()
方法传递了一系列column()
元素。这些column()
元素现在成为TextualSelect.selected_columns
列集合中的第一类元素,然后在调用TextualSelect.subquery()
之后成为Subquery.c
集合的一部分。传递给
TextClause.columns()
的列表达式也可以被类型化;当我们这样做时,这些TypeEngine
对象将成为该列的有效返回类型,以便 SQLAlchemy 的结果集处理系统可以在返回值上使用。这通常需要用于日期或布尔类型,以及在某些方言配置上的 Unicode 处理。stmt = text("SELECT id, name, timestamp FROM some_table") stmt = stmt.columns( column('id', Integer), column('name', Unicode), column('timestamp', DateTime) ) for id, name, timestamp in connection.execute(stmt): print(id, name, timestamp)
作为上面语法的快捷方式,如果只需要类型转换,可以使用引用类型的关键字参数。
stmt = text("SELECT id, name, timestamp FROM some_table") stmt = stmt.columns( id=Integer, name=Unicode, timestamp=DateTime ) for id, name, timestamp in connection.execute(stmt): print(id, name, timestamp)
TextClause.columns()
的位置形式还提供了**位置列目标**的独特功能,这在使用 ORM 进行复杂文本查询时特别有用。如果我们从模型中指定列到TextClause.columns()
,结果集将按位置与这些列匹配,这意味着文本 SQL 中列的名称或来源无关紧要。stmt = text("SELECT users.id, addresses.id, users.id, " "users.name, addresses.email_address AS email " "FROM users JOIN addresses ON users.id=addresses.user_id " "WHERE users.id = 1").columns( User.id, Address.id, Address.user_id, User.name, Address.email_address ) query = session.query(User).from_statement(stmt).options( contains_eager(User.addresses))
TextClause.columns()
方法提供了一条直接调用FromClause.subquery()
以及SelectBase.cte()
的路径,针对文本 SELECT 语句。stmt = stmt.columns(id=Integer, name=String).cte('st') stmt = select(sometable).where(sometable.c.id == stmt.c.id)
- 参数:
*cols¶ – 一系列
ColumnElement
对象,通常是来自Table
或 ORM 级别的列映射属性的Column
对象,表示此文本字符串将从中 SELECT 的一组列。**types**¶ – 一个将字符串名称映射到
TypeEngine
类型对象的映射,指示要用于从文本字符串中 SELECT 的名称的数据类型。建议使用*cols
参数,因为它也指示位置排序。
-
method
sqlalchemy.sql.expression.TextClause.
self_group(against: OperatorType | None = None) → Self | Grouping[Any]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
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.TryCast¶
表示一个 TRY_CAST 表达式。
有关
TryCast
用法的详细信息,请参见try_cast()
。-
attribute
sqlalchemy.sql.expression.TryCast.
inherit_cache: bool | None = True¶ 指示此
HasCacheKey
实例是否应使用其直接超类的缓存键生成方案。该属性默认为
None
,这表示一个构造函数尚未考虑它是否适合参与缓存;这在功能上等同于将值设置为False
,只是还会发出警告。如果与对象对应的 SQL 不根据此类的本地属性(而不是其超类)而更改,则可以在特定类上将此标志设置为
True
。另请参阅
为自定义结构启用缓存支持 - 为第三方或用户定义的 SQL 结构设置
HasCacheKey.inherit_cache
属性的一般指南。
-
attribute
- class sqlalchemy.sql.expression.Tuple¶
表示一个 SQL 元组。
成员
类签名
class
sqlalchemy.sql.expression.Tuple
(sqlalchemy.sql.expression.ClauseList
,sqlalchemy.sql.expression.ColumnElement
)-
method
sqlalchemy.sql.expression.Tuple.
self_group(against: OperatorType | None = None) → Self¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
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.WithinGroup¶
表示一个 WITHIN GROUP (ORDER BY) 子句。
这是一个针对所谓“有序集合聚合”和“假设集合聚合”函数的特殊运算符,包括
percentile_cont()
、rank()
、dense_rank()
等。它只受某些数据库后端支持,例如 PostgreSQL、Oracle 和 MS SQL Server。
该
WithinGroup
结构从方法FunctionElement.within_group_type()
中提取其类型。如果此方法返回None
,则使用该函数的.type
。-
方法
sqlalchemy.sql.expression.WithinGroup.
filter(*criterion: _ColumnExpressionArgument[bool]) → Self | FunctionFilter[_T]¶ 针对此函数生成 FILTER 子句。
-
方法
sqlalchemy.sql.expression.WithinGroup.
over(*, partition_by: _ByArgument | None = None, order_by: _ByArgument | None = None, rows: typing_Tuple[int | None, int | None] | None = None, range_: typing_Tuple[int | None, int | None] | None = None) → Over[_T]¶ 针对此
WithinGroup
结构生成 OVER 子句。此函数的签名与
FunctionElement.over()
的签名相同。
-
方法
- 类 sqlalchemy.sql.elements.WrapsColumnExpression¶
混合类,将一个
ColumnElement
定义为一个包装器,对已有名稱的表达式具有特殊的标签行为。1.4 版中的新功能。
类签名
类
sqlalchemy.sql.expression.WrapsColumnExpression
(sqlalchemy.sql.expression.ColumnElement
)
- 类 sqlalchemy.sql.expression.True_¶
表示 SQL 语句中的
true
关键字,或等效项。类签名
类
sqlalchemy.sql.expression.True_
(sqlalchemy.sql.expression.SingletonConstant
,sqlalchemy.sql.roles.ConstExprRole
,sqlalchemy.sql.expression.ColumnElement
)
- 类 sqlalchemy.sql.expression.TypeCoerce¶
表示一个 Python 端类型强制转换包装器。
TypeCoerce
提供type_coerce()
函数;有关用法详细信息,请参阅该函数。成员
类签名
类
sqlalchemy.sql.expression.TypeCoerce
(sqlalchemy.sql.expression.WrapsColumnExpression
)-
方法
sqlalchemy.sql.expression.TypeCoerce.
self_group(against: OperatorType | None = None) → TypeCoerce[_T]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()
的应用是自动的 - 最终用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造会考虑运算符优先级 - 因此,例如,在表达式x OR (y AND z)
中,可能不需要括号 - AND 的优先级高于 OR。self_group()
的基本ClauseElement
方法只返回自身。
-
方法
- 类 sqlalchemy.sql.expression.UnaryExpression¶
定义一个“一元”表达式。
一元表达式具有单个列表达式和一个运算符。运算符可以放置在列表达式的左侧(称为“运算符”)或右侧(称为“修饰符”)。
UnaryExpression
是几个一元运算符的基础,包括desc()
、asc()
、distinct()
、nulls_first()
和nulls_last()
使用的那些运算符。成员
-
方法
sqlalchemy.sql.expression.UnaryExpression.
self_group(against: OperatorType | None = None) → Self | Grouping[_T]¶ 对这个
ClauseElement
应用“分组”。此方法被子类覆盖以返回“分组”构造,即括号。特别是,它被“二元”表达式用于在放置到更大的表达式中时在其自身周围提供一个分组,以及被
select()
构造用于放置到另一个select()
的 FROM 子句中。(请注意,子查询通常应该使用Select.alias()
方法创建,因为许多平台要求嵌套的 SELECT 语句被命名)。当表达式组合在一起时,
self_group()
的应用是自动的 - 终端用户代码永远不需要直接使用此方法。请注意,SQLAlchemy 的子句构造会考虑运算符优先级 - 因此,例如在x OR (y AND z)
这样的表达式中,可能不需要括号 - AND 的优先级高于 OR。self_group()
的基础方法ClauseElement
只是返回自身。
-
方法
列元素类型化实用程序¶
从 sqlalchemy
命名空间导入的独立实用程序函数,以通过类型检查器提高支持。
对象名称 | 描述 |
---|---|
NotNullable(val) |
将列或 ORM 类类型化为不可为空。 |
Nullable(val) |
将列或 ORM 类类型化为可为空。 |
- function sqlalchemy.NotNullable(val: _TypedColumnClauseArgument[_T | None] | Type[_T] | None) → _TypedColumnClauseArgument[_T]¶
将列或 ORM 类类型化为不可为空。
这可以在 select 和其他上下文中使用,以表示列的值不能为 null,例如由于对可为空列的 where 条件。
stmt = select(NotNullable(A.value)).where(A.value.is_not(None))
在运行时,此方法返回未更改的输入。
版本 2.0.20 中的新增功能。
- function sqlalchemy.Nullable(val: _TypedColumnClauseArgument[_T]) → _TypedColumnClauseArgument[_T | None]¶
将列或 ORM 类类型化为可为空。
这可以在 select 和其他上下文中使用,以表示列的值可以为 null,例如由于外连接。
stmt1 = select(A, Nullable(B)).outerjoin(A.bs) stmt2 = select(A.data, Nullable(B.data)).outerjoin(A.bs)
在运行时,此方法返回未更改的输入。
版本 2.0.20 中的新增功能。
flambé! 火龙和 炼金术士 图像设计由 Rotem Yaari 创作并慷慨捐赠。
使用 Sphinx 7.2.6 创建。文档最后生成时间:2024 年 11 月 8 日星期五 美国东部时间上午 08:41:19