SqlAlchemy 2.0 中文文档(五十八)(1)https://developer.aliyun.com/article/1563133
2.0.17
发布日期:2023 年 6 月 23 日
orm
- [orm] [bug] [regression]
修复了 2.0 系列中的回归,其中使用undefer_group()
与selectinload()
或subqueryload()
的查询会引发AttributeError
。 感谢 Matthew Martin 提供的拉取请求。
参考:#9870 - [orm] [bug]
修复了在 ORM Annotated Declarative 中的问题,该问题阻止了在不返回Mapped
数据类型的混合使用declared_attr
的情况,而是返回了额外的 ORM 数据类型,如AssociationProxy
。声明式运行时错误地尝试将此注释解释为需要Mapped
并引发错误。
参考:#9957 - [orm] [bug] [typing]
修复了使用declared_attr
函数从AssociationProxy
返回类型的类型问题被禁止的问题。
参考:#9957 - [orm] [bug] [regression]
修复了在 2.0.16 中由#9879引入的回归,其中将可调用对象传递给mapped_column.default
参数时,同时设置init=False
会将此值解释为 Dataclass 默认值,该值将直接分配给新实例的对象,绕过了作为底层Column.default
值生成器的默认生成器的过程。现在检测到这种情况,以保持先前的行为,但对于这种模棱两可的用法会发出弃用警告;要为Column
填充默认生成器,应使用mapped_column.insert_default
参数,该参数与固定名称的mapped_column.default
参数相区分,其名称根据 pep-681 固定。
参考:#9936 - [orm] [bug]
对 ORMSession
“状态更改”系统进行了额外的加固和文档,该系统检测到同时使用Session
和AsyncSession
对象的并发使用;在获取来自底层引擎的连接的过程中添加了额外的检查,这是关于内部连接管理的关键部分。
参考:#9973 - [orm] [bug]
在 ORM 加载器策略逻辑中修复了问题,进一步允许在复杂的继承多态/别名/of_type()关系链上的长链中使用contains_eager()
加载器选项,以便在查询中正确生效。
参考:#10006 - [orm] [bug]
修复了对Enum
数据类型在registry.type_annotation_map
中的支持,该支持是作为 #8859 的一部分首次添加的,在此过程中,如果在映射中使用了带有固定配置的自定义Enum
,则会失败传递Enum.name
参数,这将导致 PostgreSQL 枚举无法正常工作,如果枚举值被传递为单个值,则会产生其他问题。逻辑已更新,以便传递“名称”,但也使默认Enum
不会设置硬编码名称为"enum"
,该默认枚举是针对纯 Python 枚举 enum.Enum 类或其他“空”枚举的。
参考:#9963
ORM 声明式
- [orm] [declarative] [bug]
当将 ORMrelationship()
和其他MapperProperty
对象同时分配给两个不同的类属性时,会发出警告;只有其中一个属性会被映射。对于此条件,已经为Column
和mapped_column
对象设置了警告。
参考:#3532
扩展
- [extensions] [bug]
修复了与 mypy 1.4 结合使用的 mypy 插件中的问题。
这个更改也被 回溯 到:1.4.49
typing
- [typing] [bug]
修复了类型问题,该问题导致无法完全在 ORM 查询中使用WriteOnlyMapped
和DynamicMapped
属性。
引用:#9985
postgresql
- [postgresql] [usecase]
pg8000 方言现在支持 RANGE 和 MULTIRANGE 数据类型,使用现有的 Range and Multirange Types 中描述的 RANGE API。 Range 和 multirange 类型在 pg8000 驱动程序的版本 1.29.8 中受支持。感谢 Tony Locke 提供的拉取请求。
引用:#9965
2.0.16
发布日期:2023 年 6 月 10 日
平台
- [platform] [usecase]
兼容性改进,使完整的测试套件可以在 Python 3.12.0b1 上通过。
orm
- [orm] [usecase]
改进了DeferredReflection.prepare()
,使其接受传递给MetaData.reflect()
的任意**kw
参数,允许使用诸如反射视图等用例以及传递给方言特定参数。另外,还现代化了DeferredReflection.prepare.bind
参数,以便将Engine
或Connection
作为“bind”参数接受。
引用:#9828 - [orm] [bug]
修复了DeclarativeBaseNoMeta
声明基类无法与非映射混合类或抽象类一起使用的问题,而是引发AttributeError
。
引用:#9862 - [orm] [bug] [regression]
修复了 2.0 系列中的一个回归,其中validates.include_backrefs
的默认值在validates()
函数中更改为False
。现在将该默认值恢复为True
。
引用:#9820 - [orm] [bug]
在版本 2.0.11 中作为#9583的一部分新增的功能中修复了一个 bug,该功能允许在 ORM 按主键批量更新时与 WHERE 子句一起使用,发送不包含每行主键值的字典将通过批量处理,并为行包括“pk=NULL”,但不会引发异常。如果未提供批量更新的主键值,则现在会引发异常。
引用:#9917 - [orm] [bug] [dataclasses]
修复了一个问题,其中生成指定了default
值并设置init=False
的 dataclasses 字段将无效。在这种情况下,dataclasses 行为是在类上设置默认值,这与 SQLAlchemy 使用的描述符不兼容。为了支持这种情况,在生成 dataclass 时将默认值转换为default_factory
。
引用:#9879 - [orm] [bug]
当向Mapper
添加属性时已经配置了 ORM 映射属性,或者类上已经存在属性时,将发出弃用警告。先前,对于此情况存在一个非弃用警告,但并非始终一致发出。已改进此警告的逻辑,以便在检测到属性的终端用户替换时发出警告,同时对于内部 Declarative 和其他情况,其中用新的属性替换描述符是预期的情况,不会产生误报。
引用:#9841 - [orm] [bug]
改进了registry.map_imperatively()
方法的map_imperatively.local_table
参数上的参数检查,确保只传递Table
或其他FromClause
,而不是已存在的映射类,因为该对象将被进一步解释为新的映射时会导致未定义的行为。
引用:#9869 - [orm] [bug]
InstanceState.unloaded_expirable
属性是InstanceState.unloaded
的同义词,现在已弃用;此属性始终是特定于实现的,不应公开。
参考:#9913
asyncio
- [asyncio] [用例]
添加了新的create_async_engine.async_creator
参数到create_async_engine()
,其完成了与create_engine.creator
参数相同的目的create_engine()
。这是一个不带参数的可调用对象,提供一个新的 asyncio 连接,直接使用 asyncio 数据库驱动程序。create_async_engine()
函数将在适当的结构中封装驱动程序级别的连接。贡献者 Jack Wotherspoon。
参考:#8215
postgresql
- [postgresql] [用例] [反射]
在 PostgreSQL 反射中使用ARRAY_AGG
时,将NAME
列强制转换为TEXT
。这似乎改善了一些 PostgreSQL 派生产品可能不支持NAME
类型的聚合的兼容性。
参考:#9838 - [postgresql] [用例]
统一了自定义 PostgreSQL 运算符定义,因为它们在多种不同的数据类型之间共享。
参考:#9041 - [postgresql] [用例]
添加了对 PostgreSQL 10NULLS NOT DISTINCT
唯一索引和唯一约束功能的支持,使用方言选项postgresql_nulls_not_distinct
。更新反射逻辑以正确考虑此选项。贡献者 Pavel Siarchenia。
参考:#8240 - [postgresql] [错误]
在 PostgreSQL 特定运算符上使用适当的优先级,如@>
。以前优先级错误,导致针对ANY
或ALL
结构呈现时括号错误。
参考:#9836 - [postgresql] [错误]
修复了一个问题,即ColumnOperators.like.escape
和类似的参数不允许空字符串作为参数,该参数将作为“转义”字符传递;这是 PostgreSQL 支持的语法。贡献者 Martin Caslavsky。
参考:#9907
2.0.15
发布日期:2023 年 5 月 19 日
orm
- [orm] [错误]
随着越来越多的项目使用新式“2.0”ORM 查询,显然,“autoflush”的条件性,即基于给定语句是否引用 ORM 实体,正在变得更加重要。到目前为止,“ORM”标志对于语句是否返回与 ORM 实体或列对应的行已经存在了一定程度的松散关联;“ORM”标志的原始目的是启用应用于 Core 结果集的 ORM 实体获取规则以及应用于语句的 ORM 加载策略的后处理。对于不基于包含 ORM 实体的行构建的语句,认为“ORM”标志基本上是不必要的。
仍然可能存在“autoflush”对于所有使用Session.execute()
和相关方法的情况更加有效的情况,即使是对纯粹的 Core SQL 构造也是如此。然而,这可能会影响到未预期的旧有情况,并且可能更多地成为 2.1 版本的事情。但是,现在“ORM-标志”的规则已经被放宽,因此包含任何 ORM 实体或属性的语句,包括仅在 WHERE / ORDER BY / GROUP BY 子句中的语句,在标量子查询中等等,都将启用此标志。这将导致这样的语句发生“autoflush”,并且还可以通过ORMExecuteState.is_orm_statement
事件级别属性可见。
引用:#9805
postgresql
- [postgresql] [bug] [regression]
修复了针对 PostgreSQL 方言的基础Uuid
数据类型,以便在选择“native_uuid”时充分利用 PG 特定的UUID
方言特定的数据类型,以便包含 PG 驱动程序行为。这个问题因为作为#9618的一部分进行的 insertmanyvalues 改进而显现出来,其中类似于#9739,asyncpg 驱动程序对是否存在数据类型转换非常敏感,当使用此通用类型时,必须调用 PostgreSQL 驱动程序特定的本机UUID
数据类型,以便进行这些转换。
引用:#9808
2.0.14
发布日期:2023 年 5 月 18 日
orm
- [orm] [bug]
在一个特定领域修改了JoinedLoader
的实现,以使用更简单的方法,此前它使用了一个在多个线程之间共享的缓存结构。这样做的理由是为了避免潜在的竞争条件,这被怀疑是导致一个特定崩溃的原因,该崩溃已经被多次报告。所讨论的缓存结构最终仍然通过编译的 SQL 缓存“缓存”,因此不会预期性能下降。
参考:#9777 - [orm] [bug] [回归]
修复了在CTE
构造中使用update()
或delete()
后,在select()
中使用会引发CompileError
的回归问题,这是由于执行 ORM 级别更新/删除语句的 ORM 相关规则造成的。
参考:#9767 - [orm] [bug]
在新的 ORM 注释式声明中修复了问题,其中通过pep-593
的Annotated
将ForeignKey
(或其他列级约束)放在mapped_column()
中,然后通过模型复制到模型会将每个约束的副本应用到生成的Table
中的Column
中,导致不正确的 CREATE TABLE DDL 以及在 Alembic 下的迁移指令。
参考:#9766 - [orm] [bug]
使用joinedload()
加载器选项时,如果使用额外的关系标准,其中额外的标准本身包含引用联接实体的相关子查询,因此也需要对别名实体进行“调整”,则将排除这种适应,从而为joinedload
生成错误的 ON 子句。
参考:#9779
sql
- [sql] [用例]
将 MSSQL 的try_cast()
函数泛化到sqlalchemy.
导入命名空间中,以便第三方方言也可以实现它。在 SQLAlchemy 中,try_cast()
函数仍然是一个仅适用于 SQL Server 的构造,如果在不支持它的后端使用它,则会引发CompileError
。try_cast()
实现了一个 CAST,其中无法转换的转换返回为 NULL,而不是引发错误。理论上,该构造可以由 Google BigQuery、DuckDB 和 Snowflake 等第三方方言实现,并可能是其他方言。
感谢 Nick Crews 的拉取请求。
引用:#9752 - [sql] [bug]
修复了values()
构造中的问题,在标量子查询中使用该构造将导致内部编译错误。
引用:#9772
postgresql
- [postgresql] [bug]
修复了一个显然非常久远的问题,即当ENUM.create_type
参数设置为其非默认值False
时,当复制其所属的Column
时,它将不会被传播,这在使用 ORM 声明性混合时很常见。
引用:#9773
测试
- [tests] [bug] [pypy]
修复了依赖于sys.getsizeof()
函数不在 pypy 上运行的测试问题,在 pypy 上,该函数似乎具有与 cpython 不同的行为。
引用:#9789
2.0.13
发布日期:2023 年 5 月 10 日
orm
- [orm] [bug]
修复了 ORM 声明式注释在所有情况下无法正确解析前向引用的问题;特别是在与 Pydantic 数据类结合使用from __future__ import annotations
时。
引用:#9717 - [orm] [bug]
修复了新的使用 RETURNING 与 upsert 语句功能中的问题,其中populate_existing
执行选项未被传播到加载选项,导致现有属性无法被就地刷新。
引用:#9746 - [orm] [bug]
修复了加载器策略路径问题,例如joinedload()
/selectinload()
将无法完全遍历多层次深度的加载问题,后跟具有with_polymorphic()
或类似构造的中间成员。
引用:#9715 - [orm] [bug]
修复了mapped_column()
构造中的问题,当 ORM 映射属性引用相同的Column
时,如果涉及mapped_column()
构造,将不会发出“直接多次命名列 X”的正确警告,而是引发内部断言。
参考:#9630
sql
- [sql] [usecase]
实现了对包含多个未相关的表的 UPDATE 和 DELETE 语句的“笛卡尔积警告”。
参考:#9721 - [sql] [bug]
修复了特定方言浮点/双精度类型的基类;OracleBINARY_DOUBLE
现在是Double
的子类,而用于 asyncpg 和 pg8000 的内部类型现在正确地是Float
的子类。 - [sql] [bug]
修复了包含多个表且没有 VALUES 子句的update()
构造会引发内部错误的问题。当前对于没有值的Update
的行为是生成一个带有空“set”子句的 SQL UPDATE 语句,因此对于这个特定子情况已经保持一致。
schema
- [schema] [performance]
改进了添加表列的方式,避免了不必要的分配,显著加快了创建许多表的速度,比如在反射整个模式时。
参考:#9597
typing
- [typing] [bug]
修复了Session.get()
和Session.refresh()
(以及AsyncSession
上的相应方法)的Session.get.with_for_update
参数的类型,以接受布尔值True
和运行时参数接受的所有其他形式。
参考:#9762 - [typing] [sql]
添加了类型ColumnExpressionArgument
作为一个公共类型,指示传递给 SQLAlchemy 构造的面向列的参数,例如Select.where()
、and_()
等。这可以用于为调用这些方法的最终用户函数添加类型。
参考:#9656
asyncio
- [asyncio] [usecase]
添加了一个新的辅助混合类AsyncAttrs
,旨在改进使用 asyncio 的延迟加载器和其他已过期或延迟的 ORM 属性,提供一个简单的属性访问器,为任何 ORM 属性提供一个await
接口,无论它是否需要发出 SQL。
另请参阅AsyncAttrs
参考:#9731 - [asyncio] [bug]
修复了半私有的await_only()
和await_fallback()
并发函数中的问题,如果函数抛出GreenletError
,则给定的可等待对象将保持未等待状态,这可能会导致程序后续出现“未等待”警告。在这种情况下,在抛出异常之前,给定的可等待对象现在将被取消。
postgresql
- [postgresql] [bug] [regression]
修复了 2.0.10 中“insertmanyvalues”更改导致的另一个回归问题,类似于回归问题#9701,在使用 asyncpg 驱动程序时,LargeBinary
数据类型也需要额外的转换以便与新的批量插入格式一起使用。
参考:#9739
oracle
- [oracle] [reflection]
在 Oracle 方言中为基于表达式的索引和索引表达式的排序方向添加了反射支持。
参考:#9597
杂项
- [bug] [ext]
修复了Mutable
中的问题,其中为 ORM 映射属性注册事件会在映射继承子类中重复调用,导致在继承层次结构中调用重复事件。
参考:#9676
2.0.12
发布日期:2023 年 4 月 30 日
orm
- [orm] [bug]
修复了严重的缓存问题,其中aliased()
和hybrid_property()
表达式组合的组合会导致缓存键不匹配,导致缓存键持有实际aliased()
对象,同时又不匹配相等结构的缓存键,填充了缓存。
此更改也已回溯到:1.4.48
参考:#9728
mysql
- [mysql] [bug] [mariadb]
修复了关于Table
和Column
对象的注释反射问题,其中注释包含控制字符,如换行符。对于这些字符以及扩展的 Unicode 字符在表和列注释中的测试支持也已添加到总体测试中。
参考:#9722
2.0.11
发布日期:2023 年 4 月 26 日
orm
- [orm] [用例]ORM 批量 INSERT 和 UPDATE 现在添加了这些功能:
- 使用“orm” dml_strategy 设置时,不再需要传递额外参数的要求。
- 使用 ORM UPDATE 时,不再需要满足“bulk” dml_strategy 设置时不传递额外的 WHERE 条件的要求。注意,在这种情况下,预期行数的检查被关闭了。
- 参考:#9583, #9595
- [orm] [bug]
修复了 2.0 中的回归问题,其中在使用 ORMSession
执行Insert
语句时,在Insert.values()
中使用bindparam()
将无法被正确解释,因为新的 ORM 启用的插入功能 没有实现这种用例。
参考:#9583, #9595
engine
- [engine] [performance]对
Row
进行了一系列性能增强:
__getattr__
方法在行的“命名元组”接口的性能得到了提升;在这个变化中,Row
的实现已经简化,移除了在 1.4 版本及以前的 SQLAlchemy 中特有的构造和逻辑。作为这一变化的一部分,Row
的序列化格式已经略微修改,然而使用之前的 SQLAlchemy 2.0 版本进行 pickle 的行将在新格式中被识别。Pull request 由 J. Nick Koston 提供。- 通过使“bytes”处理程序在每个驱动程序基础上具有条件性,改进了“二进制”数据类型的行处理性能。因此,除了 psycopg2 之外的几乎所有现代形式的驱动程序都已删除了“bytes”结果处理程序,它们都支持直接返回 Python “bytes”。Pull request 由 J. Nick Koston 提供。
- 在
Row
内部进行了进一步的重构,以提高性能。由 Federico Caselli 提供。
sql
- [sql] [usecase]
增加了对ColumnCollection
的切片访问支持,例如table.c[0:5]
、subquery.c[:-1]
等。切片访问返回一个子ColumnCollection
,方式与传递键元组相同。这是对 #8285 添加的键元组访问的自然延续,其中切片访问用例被省略似乎是一个疏忽。
引用:#8285
typing
- [typing] [bug]
改进了对RowMapping
的类型标注,以表明它还支持Column
作为索引对象,而不仅仅是字符串名称。Pull request 由 Andy Freeland 提供。
引用:#9644
postgresql
- [postgresql] [bug] [regression]
修复了由#9618引起的严重回归,该回归修改了 2.0.10 的 insertmanyvalues 功能的架构,导致使用 psycopg2 或 psycopg 驱动程序使用 insertmanyvalues 功能插入时,浮点值失去所有小数位。
参考:#9701
mssql
- [mssql] [bug]
为 SQL Server 实现了Double
类型,在 DDL 时将渲染DOUBLE PRECISION
。这是使用新的 MSSQL 数据类型DOUBLE_PRECISION
实现的,也可以直接使用。
oracle
- [oracle] [bug]
修复了 Oracle 方言中的问题,例如在使用Insert.returning()
子句返回 INSERT 的值时,Decimal
返回类型(例如Numeric
)会返回浮点值,而不是Decimal
对象的问题。
2.0.10
发布日期:2023 年 4 月 21 日
orm
- [orm] [bug]
修复了各种 ORM 特定的获取器,例如ORMExecuteState.is_column_load
,ORMExecuteState.is_relationship_load
,ORMExecuteState.loader_strategy_path
等,如果 SQL 语句本身是“复合选择”,如 UNION,则会抛出AttributeError
。
此更改还回溯到:1.4.48
参考:#9634 - [orm] [bug]
修复了当应用于__mapper_args__
特殊方法名时,declared_attr.directive()
修改器未正确地应用于子类的问题,与直接使用declared_attr
相反。这两种构造在运行时行为应该相同。
参考:#9625 - [orm] [bug]
对with_loader_criteria()
加载器选项进行了改进,允许在不是 ORM 语句本身的顶级语句的Executable.options()
方法中指示它。示例包括嵌入在诸如union()
的复合语句中的select()
,在Insert.from_select()
构造中,以及在不是 ORM 相关的顶级 CTE 表达式中。
参考:#9635 - [orm] [bug]
修复了 ORM 批量插入功能中的错误,如果请求返回单独列,则在 INSERT 语句中会渲染出额外的不必要列。
参考:#9685 - [orm] [bug]
在 ORM 声明式数据类中修复了一个错误,query_expression()
和column_property()
构造被记录为只读构造,不能在没有添加init=False
的情况下与MappedAsDataclass
类一起使用,而在query_expression()
中没有可能添加init
参数,因此这个问题不可避免。这些构造已从数据类的角度进行了修改,假定为“只读”,默认设置init=False
,并不再包含在 pep-681 构造函数中。column_property()
的数据类参数init
、default
、default_factory
、kw_only
现已弃用;这些字段不适用于在 Declarative 数据类配置中使用的column_property()
,因为该构造将是只读的。还为query_expression()
添加了一个特定于读取的参数query_expression.compare
;query_expression.repr
已经存在。
参考:#9628 - [orm] [错误]
向mapped_column()
构造添加了缺失的mapped_column.active_history
参数。
引擎
- [引擎] [用例]
添加了create_pool_from_url()
和create_async_pool_from_url()
来自字符串或URL
传入的输入 url 创建Pool
实例。
参考:#9613 - [引擎] [错误]
修复了在 2.0 系列首次引入的 “Insert Many Values” Behavior for INSERT statements 性能优化功能中发现的一个主要缺陷。这是对 2.0.9 中的更改的延续,该更改禁用了 SQL Server 版本的功能,因为 ORM 依赖于似乎不保证发生的行排序。该修复为所有“insertmanyvalues”操作应用了新逻辑,当在Insert.returning()
或UpdateBase.return_defaults()
方法上设置了一个新参数Insert.returning.sort_by_parameter_order
时生效,通过一种交替的 SQL 形式、客户端参数的直接对应以及在某些情况下降级到逐行运行,将对每个返回行批次应用与主键或其他唯一值的对应关系,这些值可以与输入数据相关联。
预计性能影响将是最小的,因为几乎所有常见的主键场景都适合于在除了 SQLite 之外的所有后端实现参数排序批处理,而“逐行”模式与 1.x 系列中使用的非常沉重的方法相比,具有最少的 Python 开销。对于 SQLite,当使用“逐行”模式时,性能没有区别。
预计通过具有高效的“逐行”INSERT 与 RETURNING 批处理功能,后续可以更容易地将“insertmanyvalues”功能推广到包括 RETURNING 支持但不一定易于保证与参数顺序对应的第三方后端。
另请参阅
将返回的行与参数集相关联
参考:#9603, #9618
typing
- [typing] [bug]
为最近添加的运算符ColumnOperators.icontains()
、ColumnOperators.istartswith()
、ColumnOperators.iendswith()
和位运算符ColumnOperators.bitwise_and()
、ColumnOperators.bitwise_or()
、ColumnOperators.bitwise_xor()
、ColumnOperators.bitwise_not()
、ColumnOperators.bitwise_lshift()
和ColumnOperators.bitwise_rshift()
添加了类型信息。感谢 Martijn Pieters 的拉取请求。
参考:#9650 - [typing] [bug]
对代码库进行更新,以通过 Mypy 1.2.0 的类型检查。 - [typing] [bug]
修复了在加载器选项中(如selectinload()
)中,PropComparator.and_()
表达式未正确类型化的问题。
参考:#9669
postgresql
- [postgresql] [usecase]
在 asyncpg 方言中添加了prepared_statement_name_func
连接参数选项。此选项允许传递一个可调用对象,用于自定义执行查询时驱动程序将创建的准备语句的名称。感谢 Pavel Sirotkin 的拉取请求。
另请参阅
使用 PGBouncer 的预准备语句名称
参考:#9608 - [postgresql] [usecase]
添加了缺失的Range.intersection()
方法。感谢 Yurii Karabas 的拉取请求。
参考:#9509 - [postgresql] [bug]
在ENUM
的签名中,恢复了ENUM.name
参数作为可选参数,因为这是根据给定的 pep-435Enum
类型自动选择的。
参考:#9611 - [postgresql] [bug]
修复了对普通字符串进行ENUM
比较时将右侧类型转换为 VARCHAR 的问题,这是由于在诸如 asyncpg 等方言中添加了更明确的转换而导致的 PostgreSQL 类型不匹配错误。
参考:#9621 - [postgresql] [bug]
修复了在 PostgreSQL 中无法反射基于表达式的长表达式索引的问题。表达式错误地被截断为标识符长度(默认为 63 字节)。
参考:#9615
mssql
- [mssql] [bug]
恢复了 Microsoft SQL Server 的 insertmanyvalues 功能。该功能在版本 2.0.9 中被禁用,因为似乎依赖于 RETURNING 的排序,这是不被保证的。“insertmanyvalues” 功能的架构已经重做,以适应 INSERT 语句的特定组织和可以保证返回行与输入记录对应的结果行处理。
参见
将 RETURNING 行与参数集对应
参考:#9603, #9618
oracle
- [oracle] [bug]
修复了在 Oracle 方言的 INSERT…RETURNING 子句中无法使用Uuid
数据类型的问题。
2.0.9
发布日期:2023 年 4 月 5 日
orm
- [orm] [bug]
修复了当使用“关联到别名类”的特性并且在加载器中指定了一个递归的 eager 加载器(如lazy="selectinload"
)与另一个相对端的另一个 eager 加载器结合使用时可能发生的无限循环问题。循环检查已修复以包括别名类关系。
这个变更也被 反向移植 到了:1.4.48
参考:#9590
mariadb
- [mariadb] [bug]
在 MariaDb 中将row_number
添加为保留字。
参考:#9588
mssql
- [mssql] [bug]
SQLAlchemy 的“insertmanyvalues”功能允许快速插入许多行,同时还支持 RETURNING,目前已暂时禁用了 SQL Server。由于工作单元当前依赖于此功能,以便将现有 ORM 对象匹配到返回的主键标识,因此此特定使用模式在某些情况下无法与 SQL Server 一起使用,因为“OUTPUT inserted” 返回的行的顺序可能并不总是与发送元组的顺序匹配,导致 ORM 在后续操作中对这些对象做出错误决策。
此功能将在即将发布的版本中重新启用,并且将再次对多行 INSERT 语句产生影响,但是工作单元对此功能的使用将被禁用,可能对所有方言都禁用,除非 ORM 映射的表还包括一个“sentinel”列,以便可以将返回的行引用回传递的原始数据。
参考:#9603 - [mssql] [bug]
当fast_executemany
设置为True
时,已更改用于 SQL Server 的批量 INSERT 策略“executemany”与 pyodbc,使用fast_executemany
/cursor.executemany()
用于不包含 RETURNING 的批量 INSERT,当此参数设置时,恢复了与 SQLAlchemy 1.4 中使用的相同行为。
最新的终端用户性能细节显示,对于非常大的数据集,fast_executemany
仍然比较快,因为它使用可以在单次往返中接收所有行的 ODBC 命令,允许比“insertmanyvalues”发送的批次更大得多的数据大小,后者已为 SQL Server 实现。
尽管此更改使得“insertmanyvalues”仍然被用于包含 RETURNING 的 INSERT,并且如果未设置fast_executemany
,由于#9603,在任何情况下,“insertmanyvalues” 策略已被完全禁用于 SQL Server。
参考:#9586
2.0.8
发布日期:2023 年 3 月 31 日
orm
- [orm] [usecase]
当使用MappedAsDataclass
混合类或registry.mapped_as_dataclass()
装饰器时,Python 数据类引发的诸如TypeError
和ValueError
等异常现在将在一个InvalidRequestError
包装器中进行包装,其中包含有关错误消息的信息性上下文,参考 Python 数据类文档作为异常原因的官方来源。
参见
创建<类名>数据类时遇到的 Python 数据类错误
参考:#9563 - [orm] [bug]
修复了 ORM 注释声明中的问题,其中使用递归类型(例如使用嵌套的字典类型)会导致 ORM 的注释解析逻辑中发生递归溢出,即使这种数据类型不是必要的来映射列。
参考:#9553 - [orm] [bug]
修复了在 Declarative mixin 上使用mapped_column()
构造时,如果包含mapped_column.deferred
参数会引发内部错误的问题。
参考:#9550 - [orm] [bug]
扩展了在声明式映射中存在普通column()
对象时发出的警告,以包括任何未在适当属性类型内声明的任意 SQL 表达式,例如column_property()
、deferred()
等。这些属性在类字典中保持不变且未映射。由于这种表达式通常不是预期的内容,因此现在对所有这些否则被忽略的表达式发出警告,而不仅仅是column()
的情况。
参考:#9537 - [orm] [bug]
修复了在访问一个混合属性的表达式值时出现的回归问题,该属性位于一个未映射或尚未映射的类上(例如在declared_attr()
方法中调用它),会引发内部错误,因为对父类映射器的内部获取将失败,并且对于此失败的指令被无意中在 2.0 中删除。
参考:#9519 - [orm] [bug]
在声明式 Mixins 上声明的字段,然后与使用MappedAsDataclass
的类组合在一起,其中这些 Mixin 字段本身不是数据类的一部分,现在会发出弃用警告,因为这些字段将在将来的版本中被忽略,因为 Python 数据类的行为是忽略这些字段。类型检查器在 pep-681 下不会看到这些字段。
另请参阅
当将转换为数据类时,属性(s)源自不是数据类的超类。 - 关于背景的理由
使用 Mixins 和抽象超类
参考:#9350 - [orm] [bug]
修复了一个问题,其中BindParameter.render_literal_execute()
方法在调用带有 ORM 注释的参数时会失败。在实践中,当使用一些类似于 Oracle 的使用“FETCH FIRST”的方言以及使用Select
构造的Select.limit()
的组合时,在一些 ORM 上下文中会观察到这种情况,包括如果该语句嵌入在关系 primaryjoin 表达式中时,SQL 编译失败。
参考:#9526 - [orm] [bug]
为了与为 #5984 和 #8862 所做的工作单元一致性保持一致,这两者都禁用了在Session
进程中的“惰性=‘raise’”处理,这些处理并非由属性访问触发,Session.delete()
方法现在在遍历关系路径以处理“delete”和“delete-orphan”级联规则时,也将禁用“惰性=‘raise’”处理。以前,没有简单的方法可以通用地调用Session.delete()
在设置了“惰性=‘raise’”的对象上,以便只加载必要的关系。由于“惰性=‘raise’”主要用于捕获在属性访问时发出的 SQL 加载,因此Session.delete()
现在被制作成像其他Session
方法一样,包括Session.merge()
以及Session.flush()
以及 autoflush。
参考:#9549 - [orm] [bug]
修复了一个问题,其中仅注释的Mapped
指令无法在声明性混合类中使用,而不会尝试让该属性对已经映射了该属性的超类的单个或联合继承子类产生影响,从而产生冲突的列错误和/或警告。
参考:#9564 - [orm] [bug] [typing]
适当地对Insert.from_select.names
进行类型定义,以接受字符串列表或列或映射属性。
参考:#9514
示例
- [examples] [bug]
修复了“版本历史”示例中的问题,使用从DeclarativeBase
派生的声明性基类会导致映射失败的问题。此外,修复了给定的测试套件,以便通过 Python unittest 运行示例的文档说明现在再次有效。
类型
- [typing] [bug]
修复了deferred()
和query_expression()
在与 2.0 样式映射正确配合使用时的类型。
参考:#9536
postgresql
- [postgresql] [bug]
修复了 PostgreSQL 方言中的关键回归问题,例如 asyncpg 依赖于 SQL 中的显式转换,以便将数据类型正确传递给驱动程序,其中String
数据类型将与要比较的确切列长度一起转换,导致在比较较小长度的VARCHAR
与较大长度的字符串时进行隐式截断,而不管使用的操作符是什么(例如 LIKE,MATCH 等)。 PostgreSQL 方言现在在呈现这些转换时省略VARCHAR
的长度。
参考:#9511
mysql
- [mysql] [bug]
修复了字符串数据类型(如CHAR
、VARCHAR
、TEXT
),以及二进制BLOB
无法使用零长度明确生成的问题,这在 MySQL 中具有特殊含义。感谢 J. Nick Koston 提出的拉取请求。
参考:#9544
杂项
- [bug] [util]
在 OrderedSet 类中实现了缺失的copy
和pop
方法。
参考:#9487
2.0.7
发布日期:2023 年 3 月 18 日
类型
- [typing] [bug]
修复了composite()
不允许任意可调用对象作为复合类来源的类型问题。
参考:#9502
postgresql
- [postgresql] [usecase]
添加了新的 PostgreSQL 类型CITEXT
。拉取请求由 Julian David Rath 提供。
参考:#9416 - [postgresql] [用例]
修改了基本 PostgreSQL 方言,以更好地与 SQLAlchemy 2.0 的第三方方言 sqlalchemy-redshift 进行集成。拉取请求由 matthewgdv 提供。
参考:#9442
2.0.6
发布日期:2023 年 3 月 13 日
orm
- [orm] [错误]
修复了“活动历史记录”功能对复合属性未完全实现的错误,这使得无法接收包含“旧”值的事件成为可能。这似乎也是旧的 SQLAlchemy 版本的情况,其中“active_history”将传播到基础基于列的属性,但是即使设置了 active_history=True 的复合(),监听复合属性本身的事件处理程序也不会收到被替换的“旧”值。
另外,修复了一个局限于 2.0 的回归,该回归禁止了对复合的 active_history 被分配到带有attr.impl.active_history=True
的实现。
参考:#9460 - [orm] [错误]
修复了在为版本 2.0 重构代码时,涉及 Python 行的 pickling 在 cython 和纯 Python 实现之间发生的回归,这发生在对Row
进行了带有类型信息的代码重构时。对于纯 Python 版本的Row
,一个特定的常量被转换为基于字符串的Enum
,而 cython 版本继续使用整数常量,导致反序列化失败。
参考:#9418
sql
- [sql] [错误] [回归]
修复了在 1.4 系列中发布的用于 lambda SQL API 的一层并发安全检查的修复引起的回归,该修复针对的是#8098,在补丁中包含了未能应用到主分支的额外修复。这些额外的修复已经应用。
参考:#9461 - [sql] [错误]
修复了在select()
构造中,如果没有给定列而然后在 EXISTS 的上下文中使用,则无法呈现的回归,而是引发了内部异常。虽然一个空的“SELECT”通常不是有效的 SQL,但在 EXISTS 数据库中(例如 PostgreSQL)允许它,在任何情况下,该条件现在不再引发内部异常。
参考:#9440
打字
- [打字] [错误]
修复了ColumnElement.cast()
中的类型问题,它不允许独立于ColumnElement
本身的类型引擎参数,而ColumnElement.cast()
的目的就是这样。
参考:#9451 - [typing] [bug]
修复问题以允许在 Mypy 1.1.1 下通过类型测试。
oracle
- [oracle] [bug]
修复了 Oracle “名称标准化”在反射"PUBLIC"
模式下无法正确工作的反射错误,例如在 Python 端不能将 PUBLIC 名称指定为小写用于Table.schema
参数。使用大写的"PUBLIC"
将起作用,但会导致包括引号的 SQL 查询以及在大写"PUBLIC"
下索引表,这是不一致的。
参考:#9459
2.0.5.post1
发布日期:2023 年 3 月 5 日
orm
- [orm] [bug]
向内置映射集合类型添加构造函数参数,包括KeyFuncDict
、attribute_keyed_dict()
、column_keyed_dict()
等,以便可以根据提供的数据即时构造这些字典类型;这进一步与诸如 Python 数据类.asdict()
等工具兼容,后者依赖于直接调用这些类作为普通字典类。
参考:#9418 - [orm] [bug] [regression]
由于 #8372 引起的多个退化已修复,涉及attribute_mapped_collection()
(现在称为attribute_keyed_dict()
)。
首先,收集现在不再可用于具有不是普通映射属性的“键”属性;已修复了与描述符和/或关联代理属性相关的属性。
其次,如果事件或其他操作需要访问“key”以便从未加载的映射属性填充字典,那么这也会不适当地引发错误,而不是像 1.4 版本中那样尝试加载属性。这个问题也已经修复。
对于这两种情况,扩展了#8372的行为。#8372引入了一个错误,当作为映射字典键使用的派生键实际上未被赋值时会引发错误。在此更改中,仅在“.key”属性的有效值为None
时才发出警告,无法明确确定这个None
是否是有意的。None
将不再作为映射集合字典键的支持(因为它通常指的是 NULL,表示“未知”)。设置attribute_keyed_dict.ignore_unpopulated_attribute
现在也将导致忽略这样的None
键。
参考:#9424 - [orm] [bug]
确定了sqlite
和mssql+pyodbc
方言现在与 SQLAlchemy ORM 的“versioned rows”功能兼容,因为 SQLAlchemy 现在通过计算返回的行数来计算 RETURNING 语句的行数,而不是依赖于cursor.rowcount
。特别是,ORM 版本的行用例(在配置版本计数器文档中有描述)现在应该完全支持与 SQL Server pyodbc 方言一起使用。 - [orm] [bug]
添加了对Mapper.polymorphic_load
参数的支持,该参数应用于继承层次结构中超过一级的每个映射器,允许通过单个语句为层次结构中的所有类加载列,这些列指示使用"selectin"
,而不是忽略那些中间类上的元素,尽管它们也指示它们将参与"selectin"
加载,但它们不是基本的 SELECT 语句的一部分。
参考:#9373 - [orm] [bug]
继续修复 #8853,允许Mapped
名称完全合格,无论是否存在from __annotations__ import future
。此问题首次在 2.0.0b3 中修复,确认此情况通过测试套件工作,但是测试套件显然没有测试名称Mapped
完全不存在的行为;字符串解析已更新以确保 ORM 如何使用这些函数。
参考:#8853, #9335
orm 声明式
- [bug] [orm declarative]
修复了新mapped_column.use_existing_column
功能无法工作的问题,如果两个同名列被映射到与列本身的显式名称不同的属性名下。现在,当使用此参数时,属性名称可以不同。
参考:#9332
引擎
- [engine] [performance]
对Result
的 Cython 实现进行了小优化,使用了一个特定 int 值的 cdef 来避免 Python 开销。拉取请求由 Matus Valo 提供。
参考:#9343 - [engine] [bug]
修复了Row
对象由于意外依赖不稳定的哈希值而无法在进程间可靠地反序列化的 bug。
参考:#9423
SQL
- [sql] [bug] [regression]
将nullslast()
和nullsfirst()
旧版本函数恢复到sqlalchemy
导入命名空间中。之前,较新的nulls_last()
和nulls_first()
函数是可用的,但是旧版本函数不小心被移除了。
参考:#9390
模式
- [schema]
验证当提供给MetaData
的MetaData.schema
参数时,它是一个字符串。
typing
- [typing] [usecase]
导出了由scoped_session.query_property()
返回的类型,使用了一个新的公共类型QueryPropertyDescriptor
。
参考:#9338 - [typing] [bug]
修复了Connection.scalars()
方法未被标记为允许多参数列表的错误,现在支持使用insertmanyvalues
操作。 - [typing] [bug]
对传递给Insert.values()
和Update.values()
的映射的类型进行了改进,使之更加开放,指示只读Mapping
而不是可写Dict
,后者在键类型过于有限时会出错。
参考:#9376 - [typing] [bug]
在Numeric
类型对象中添加了缺失的初始化重载,以便 pep-484 类型检查器可以正确解析完整的类型,从Numeric.asdecimal
参数派生,确定将表示Decimal
还是float
对象。
参考:#9391 - [typing] [bug]
修复了类型错误,Select.from_statement()
将不接受text()
或TextualSelect
对象作为有效类型的 bug。此外,修复了columns
方法的返回类型缺失的问题。
参考:#9398 - [typing] [bug]
修复了with_polymorphic()
未正确记录类类型的类型问题。
参考:#9340
postgresql
- [postgresql] [bug]
修复了在 PostgreSQLExcludeConstraint
中的问题,其中文字值被编译为绑定参数而不是直接的内联值,这是 DDL 所必需的。
参考:#9349 - [postgresql] [bug]
修复了 PostgreSQLExcludeConstraint
构造中的问题,如果约束包含文本表达式元素,则在Table.to_metadata()
等操作中以及在一些 Alembic 方案中无法复制。
参考:#9401
mysql
- [mysql] [bug] [postgresql]
为了解决在 2.0.0b1 中为 #5648 添加的池 ping 监听器通过DialectEvents.handle_error()
事件接收异常事件的支持未考虑到诸如 MySQL 和 PostgreSQL 的特定方言的 ping 程序的问题。方言特性已重新设计,使得所有方言都参与事件处理。另外,添加了一个新的布尔元素ExceptionContext.is_pre_ping
,用于标识此操作是否在预 ping 操作中进行。
对于此版本,实现自定义Dialect.do_ping()
方法的第三方方言可以选择通过不再捕获异常或检查异常是否为“is_disconnect”,而是直接将所有异常传播出去来选择新的改进行为。现在由默认方言的一个包围方法来检查异常是否为“is_disconnect”,这确保了在测试异常是否为“断开连接”异常之前调用事件挂钩以处理所有异常情况。如果现有的do_ping()
方法继续捕获异常并检查“is_disconnect”,则它将像以前一样工作,但是如果不将异常传播出去,handle_error
钩子将无法访问异常。
参考:#5648
sqlite
- [sqlite] [bug] [regression]
修复了在 SQLite 连接中的回归,其中在建立数据库函数时使用deterministic
参数会导致旧版 SQLite 版本(3.8.3 之前的版本)失败。版本检查逻辑已经改进以适应此情况。
参考:#9379
mssql
- [mssql] [bug]
修复了新的Uuid
数据类型中的问题,该问题导致它无法与 pymssql 驱动程序一起工作。由于 pymssql 似乎又开始维护,因此恢复了对 pymssql 的测试支持。
参考:#9414 - [mssql] [bug]
调整了 pymssql 方言,以更好地利用 RETURNING 来获取 INSERT 语句的最后插入的主键值,与当前的 mssql+pyodbc 方言一样。
杂项
- [bug] [ext]
修复了在 automap 中的问题,调用AutomapBase.prepare()
时,从特定映射类而不是直接从AutomapBase
调用,当 automap 检测到新表时,不会使用正确的基类,而是使用给定的类,导致映射器尝试配置继承关系。虽然通常情况下应该从基类调用AutomapBase.prepare()
,但在从子类调用时不应该出现严重问题。
参考:#9367 - [bug] [ext] [regression]
由于针对 #8667 添加的类型,导致了sqlalchemy.ext.mutable
的回归错误,其中.pop()
方法的语义发生了变化,使得该方法无法工作。感谢 Nils Philippsen 提交的拉取请求。
参考:#9380
2.0.4
发布日期:2023 年 2 月 17 日
orm
- [orm] [usecase]
为了适应 SQLAlchemy 2.0 中 ORM 声明式使用的列顺序的变化,新增了一个参数mapped_column.sort_order
,可用于控制 ORM 定义的表中列的顺序,适用于常见用例,如具有应首先出现在表中的主键列的混合类。变更说明在 ORM 声明式以不同方式应用列顺序;使用 sort_order 控制行为 中说明了默认的顺序变更行为(这是所有 SQLAlchemy 2.0 发行版的一部分),以及在使用混合类和多个类时使用mapped_column.sort_order
控制列顺序的用法(2.0.4 中新增)。
另请参阅
ORM 声明式以不同方式应用列顺序;使用 sort_order 控制行为
参考:#9297 - [orm] [usecase]
Session.refresh()
方法现在将立即加载在Session.refresh.attribute_names
集合中明确命名的与关系绑定的属性,即使它当前链接到“select”加载程序,通常是一个不会在刷新期间触发的“lazy”加载程序。 “懒加载器”策略现在将检测到操作明确是用户发起的Session.refresh()
操作,该操作明确命名了此属性,然后将调用“immediateload”策略实际发出 SQL 以加载属性。这对于某些 asyncio 情况特别有帮助,其中必须强制加载未加载的惰性加载属性,而不使用实际不支持 asyncio 的惰性加载属性模式。
参考:#9298 - [orm] [bug] [regression]
由于#9217引入的版本 2.0.2 中的回归错误已修复,其中使用 DML RETURNING 语句以及Select.from_statement()
构造,如在#9217中“修复”的那样,与使用column_property()
等表达式的 ORM 映射类一起使用,会导致 Core 内部错误,其中它会尝试按名称匹配表达式。修复了 Core 问题,并且还调整了#9217中的修复,以便不会对 DML RETURNING 用例产生影响,其中它增加了不必要的开销。
参考:#9273 - [orm] [bug]
将内部EvaluatorCompiler
模块标记为 ORM 私有,并将其重命名为_EvaluatorCompiler
。对于可能依赖于此的用户,名称EvaluatorCompiler
仍然存在,但不支持此用法,并将在将来的版本中删除。
orm declarative
- [usecase] [orm declarative]
向MappedAsDataclass
类和registry.mapped_as_dataclass()
方法添加了新参数dataclasses_callable
,允许使用替代的可调用对象来生成 Pythondataclasses.dataclass
。这里的用例是替换为 Pydantic 的 dataclass 函数。对版本 2.0.1 中为#9179添加的 mixin 支持进行了调整,以便将 mixin 的__annotations__
集合重写,不包括Mapped
容器,与映射类一样,以便 Pydantic dataclasses 构造函数不会暴露给未知类型。
另请参阅
与 Pydantic 等替代 Dataclass 提供者集成
参考:#9266
sql
- [sql] [bug]
修复了元组值的元素类型将被硬编码为从比较的元组中获取类型的问题,当比较使用ColumnOperators.in_()
运算符时。这与通常确定二进制表达式类型的方式不一致,通常情况下会首先考虑右侧的实际元素类型,然后再应用左侧的类型。
参考:#9313 - [sql]
添加了公共属性Table.autoincrement_column
,该属性返回在列中标识为自增的列。
参考:#9277
typing
- [typing] [usecase]
改进了 Hybrid Attributes 扩展的类型支持,更新了所有文档以使用 ORM Annotated Declarative mappings,并添加了一个名为hybrid_property.inplace
的新修改器。此修改器提供了一种改变hybrid_property
的状态的方式,这在 SQLAlchemy 版本 1.2.0 之前的非常早期版本的混合属性中基本上是做的,版本 1.2.0 #3912 改变了这一点,删除了原地突变。现在,在选择加入的基础上恢复了这种原地突变,以允许单个混合具有多个设置的方法,无需命名所有方法相同,也无需仔细“链”不同命名的方法以维护组合。类型工具如 Mypy 和 Pyright 不允许在类上使用同名方法,因此通过此更改恢复了一种简洁的设置混合与类型支持的方法。
另请参阅
使用 inplace 创建符合 pep-484 标准的混合属性
参考:#9321
oracle
- [oracle] [bug]
调整了thick_mode
参数的行为,以使 python-oracledb 方言正确接受False
作为值。以前,只有None
会表示应禁用 thick mode。
参考:#9295
2.0.3
发布日期:2023 年 2 月 9 日
sql
- [sql] [bug] [regression]
由于 #7744,在 2.0 系列中修复了 SQL 表达式制定的严重回归,改进了对包含许多相同操作符的 SQL 表达式的支持;表达式元素超过前两个元素后,括号分组将丢失。
参考:#9271
typing
- [typing] [bug]
删除了typing.Self
的临时解决方案,现在使用了 PEP 673 来处理大多数返回Self
的方法。由于这个变化,现在需要mypy>=1.0.0
来对 SQLAlchemy 代码进行类型检查。感谢 Yurii Karabas 提供的拉取请求。
参考:#9254
2.0.2
发布日期:2023 年 2 月 6 日
orm
- [orm] [usecase]
添加了新的事件钩子MapperEvents.after_mapper_constructed()
,提供了一个事件钩子,可以在Mapper
对象完全构建完成后但在调用registry.configure()
之前发生。这允许根据Mapper
的初始配置创建额外映射和表结构的代码,也与声明性配置集成。以前,在使用声明性时,Mapper
对象是在类创建过程中创建的,此时没有记录的方法来运行代码。这个改变立即使得自定义映射方案受益,比如带有历史表的版本控制示例,该示例根据映射类的创建生成额外的映射和表。
参考:#9220 - [orm] [用例]
很少使用的Mapper.iterate_properties
属性和Mapper.get_property()
方法,主要用于内部,不再隐式调用registry.configure()
过程。对这些方法的公开访问非常罕见,而拥有registry.configure()
的唯一好处是允许这些集合中存在“backref”属性。为了支持新的MapperEvents.after_mapper_constructed()
事件,现在可以迭代和访问内部的MapperProperty
对象,而不会触发映射器本身的隐式配置。
更公开的迭代所有映射属性的方式,Mapper.attrs
集合等,仍会隐式调用registry.configure()
步骤,从而使得反向引用属性可用。
在所有情况下,registry.configure()
始终可供直接调用。
参考:#9220 - [ORM] [错误] [回归]
修复了由#8705引起的晦涩的 ORM 继承问题,其中一些从本地表和继承表一起指示列组的映射器的情况在column_property()
下仍然会警告,即使隐式地组合了同名属性。
参考:#9232 - [ORM] [错误] [回归]
修复了在使用具有常规 Python 端递增列的Mapper.version_id_col
功能时,对于不支持“rowcount”和“RETURNING”的 SQLite 和其他数据库,将“RETURNING”用于这些列,即使实际上并非如此。
参考:#9228 - [ORM] [错误] [回归]
修复了在 ORM 上下文中使用Select.from_statement()
时的回归,其中仅基于名称匹配列到 SQL 标签的 ORM 语句被禁用,这将阻止具有列名标签的任意 SQL 表达式与要加载的实体匹配,以前在 1.4 和之前的系列中可以工作,因此已恢复了先前的行为。
参考:#9217
ORM 声明式
- [错误] [ORM 声明式]
修复了由于修复#9171引起的回归,该问题本身修复了涉及从DeclarativeBase
继承的类的__init__()
机制的回归。更改使得如果类上没有直接的__init__()
方法,则__init__()
将应用于用户定义的基类。现在已经调整为只有在用户定义的基类的层次结构中没有其他类具有__init__()
方法时才应用__init__()
。这再次允许基于DeclarativeBase
的用户定义的基类包含包含自定义__init__()
方法的混入。
参考:#9249 - [错误] [ORM 声明式]
修复了与 2.0.1 中新增的对混合类支持相关的 ORM 声明式数据类映射中的问题,该问题通过#9179解决,其中在某些情况下使用混合类加上 ORM 继承会导致字段错误分类,导致字段级数据类参数(如init=False
)丢失。
参考:#9226 - [错误] [ORM 声明式]
修复了 ORM 声明式映射,允许在使用mapped_column()
时在__mapper_args__
中指定Mapper.primary_key
参数。尽管这种用法直接在 2.0 文档中,但Mapper
在这种情况下不接受mapped_column()
构造。这个功能已经适用于Mapper.version_id_col
和Mapper.polymorphic_on
参数。
作为这一变化的一部分,可以在非映射混合类上指定__mapper_args__
属性,而无需使用declared_attr()
,包括引用本地存在于混合类上的Column
或mapped_column()
对象的"primary_key"
条目;声明式还将这些列转换为特定映射类的正确列。这在Mapper.version_id_col
和Mapper.polymorphic_on
参数中已经起���用。此外,"primary_key"
中的元素可以指示为现有映射属性的字符串名称。
参考:#9240 - [错误] [ORM 声明式]
如果映射尝试在同一类层次结构中混合使用MappedAsDataclass
和registry.mapped_as_dataclass()
,则会引发明确的错误,因为这会导致数据类函数在错误的时间应用于映射类,从而在映射过程中导致错误。
参考:#9211
例子
- [examples] [bug]
重新设计了带有历史表的版本控制,以适用于版本 2.0,同时改进了此示例的整体工作,以使用更新的 API,包括新添加的钩子MapperEvents.after_mapper_constructed()
。
参考:#9220
SQL
- [sql] [usecase]
添加了一套全新的 SQL 位运算符,用于在适当的数据值(如整数、位字符串等)上执行数据库端的位运算表达式。 拉取请求由 Yegor Statkevich 提供。
另请参阅
位运算符
参考:#8780
asyncio
- [asyncio] [bug]
修复了由于修复#8419而引起的回归,这导致了 asyncpg 连接被重置(即事务rollback()
被调用),并且在连接未被显式返回到连接池并且被 Python 垃圾收集拦截时,正常返回到池中,如果垃圾收集操作在 asyncio 事件循环外被调用,则会失败,导致大量堆栈跟踪活动被转储到日志和标准输出中。
恢复了正确的行为,即所有由于未被显式返回到连接池而被垃圾收集的 asyncio 连接都会从池中分离并且被丢弃,同时伴随着一条警告,而不是被返回到池中,因为它们无法可靠地重置。在 asyncpg 连接的情况下,将使用 asyncpg 特定的terminate()
方法来更优雅地结束该连接,而不仅仅是将其丢弃。
此更改包括了一个小的行为变更,希望对调试 asyncio 应用程序有用,其中在 asyncio 连接意外被垃圾收集时发出的警告已经通过将其移出try/except
块并移到finally:
块中而变得稍微更加激进,无论分离/终止操作是否成功,它都会无条件地发出。这也将使得将 Python 警告提升为异常的应用程序或测试套件会将此视为完整的异常抛出,而以前这个警告是不可能作为异常传播的。在此期间需要容忍此警告的应用程序和测试套件应该调整 Python 警告过滤器,以允许这些警告不会被提升为异常。
传统同步连接的行为保持不变,即垃圾收集的连接继续正常返回到池中,而不会发出警告。在未来的主要发布版本中,这可能会发生变化,至少会像为 asyncio 驱动程序发出的类似警告一样发出警告,因为对于池化连接被垃圾收集拦截而未被正确返回到池中是一种使用错误。
参考:#9237
mysql
- [mysql] [bug] [回归]
修复了由问题#9058引起的回归,调整了 MySQL 方言的has_table()
,再次使用“DESCRIBE”,当 MySQL 版本 8 在使用不存在的模式名称时引发的特定错误代码是意外的,并且无法解释为布尔结果。
参考:#9251 - [mysql] [bug]
添加了对 MySQL 8 的新AS ON DUPLICATE KEY
语法的支持,当使用Insert.on_duplicate_key_update()
时,这对于 MySQL 8 的较新版本是必需的,因为先前使用VALUES()
的语法现在在这些版本中会发出弃用警告。服务器版本检测被用来确定是否应该使用传统的 MariaDB / MySQL < 8VALUES()
语法,还是新的 MySQL 8 所需的语法。感谢 Caspar Wylie 的拉取请求。
参考:#8626
sqlite
- [sqlite] [bug]
修复了 SQLite 方言的has_table()
函数,以便对于包含不存在的模式的非 None 模式名称的查询,正确地报告 False;以前,会引发数据库错误。
参考:#9251
SqlAlchemy 2.0 中文文档(五十八)(3)https://developer.aliyun.com/article/1563135