SqlAlchemy 2.0 中文文档(五十八)(2)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,独享型 2核4GB
简介: SqlAlchemy 2.0 中文文档(五十八)

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]
    对 ORM Session “状态更改”系统进行了额外的加固和文档,该系统检测到同时使用 SessionAsyncSession 对象的并发使用;在获取来自底层引擎的连接的过程中添加了额外的检查,这是关于内部连接管理的关键部分。
    参考:#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]
    当将 ORM relationship() 和其他 MapperProperty 对象同时分配给两个不同的类属性时,会发出警告;只有其中一个属性会被映射。对于此条件,已经为 Columnmapped_column 对象设置了警告。
    参考:#3532

扩展

  • [extensions] [bug]
    修复了与 mypy 1.4 结合使用的 mypy 插件中的问题。
    这个更改也被 回溯 到:1.4.49

typing

  • [typing] [bug]
    修复了类型问题,该问题导致无法完全在 ORM 查询中使用 WriteOnlyMappedDynamicMapped 属性。
    引用:#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 参数,以便将 EngineConnection 作为“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 10 NULLS NOT DISTINCT 唯一索引和唯一约束功能的支持,使用方言选项 postgresql_nulls_not_distinct。更新反射逻辑以正确考虑此选项。贡献者 Pavel Siarchenia。
    参考:#8240
  • [postgresql] [错误]
    在 PostgreSQL 特定运算符上使用适当的优先级,如@>。以前优先级错误,导致针对ANYALL结构呈现时括号错误。
    参考:#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-593AnnotatedForeignKey(或其他列级约束)放在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]
    修复了特定方言浮点/双精度类型的基类;Oracle BINARY_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]
    修复了关于TableColumn对象的注释反射问题,其中注释包含控制字符,如换行符。对于这些字符以及扩展的 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 中的回归问题,其中在使用 ORM Session 执行 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 提供。
  • 引用:#9678#9680
  • [engine] [bug] [regression]
    修复了阻止 URL.normalized_query 属性正常运行的回归问题。
    引用:#9682

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_loadORMExecuteState.is_relationship_loadORMExecuteState.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() 的数据类参数 initdefaultdefault_factorykw_only 现已弃用;这些字段不适用于在 Declarative 数据类配置中使用的 column_property(),因为该构造将是只读的。还为 query_expression() 添加了一个特定于读取的参数 query_expression.comparequery_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-435 Enum 类型自动选择的。
    参考:#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 数据类引发的诸如 TypeErrorValueError 等异常现在将在一个 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]
    修复了字符串数据类型(如CHARVARCHARTEXT),以及二进制BLOB无法使用零长度明确生成的问题,这在 MySQL 中具有特殊含义。感谢 J. Nick Koston 提出的拉取请求。
    参考:#9544

杂项

  • [bug] [util]
    在 OrderedSet 类中实现了缺失的copypop方法。
    参考:#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]
    向内置映射集合类型添加构造函数参数,包括 KeyFuncDictattribute_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]
    确定了sqlitemssql+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]
    验证当提供给MetaDataMetaData.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]
    修复了在 PostgreSQL ExcludeConstraint 中的问题,其中文字值被编译为绑定参数而不是直接的内联值,这是 DDL 所必需的。
    参考:#9349
  • [postgresql] [bug]
    修复了 PostgreSQL ExcludeConstraint 构造中的问题,如果约束包含文本表达式元素,则在 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,允许使用替代的可调用对象来生成 Python dataclasses.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_colMapper.polymorphic_on参数。
    作为这一变化的一部分,可以在非映射混合类上指定__mapper_args__属性,而无需使用declared_attr(),包括引用本地存在于混合类上的Columnmapped_column()对象的"primary_key"条目;声明式还将这些列转换为特定映射类的正确列。这在Mapper.version_id_colMapper.polymorphic_on参数中已经起���用。此外,"primary_key"中的元素可以指示为现有映射属性的字符串名称。
    参考:#9240
  • [错误] [ORM 声明式]
    如果映射尝试在同一类层次结构中混合使用MappedAsDataclassregistry.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 < 8 VALUES()语法,还是新的 MySQL 8 所需的语法。感谢 Caspar Wylie 的拉取请求。
    参考:#8626

sqlite

  • [sqlite] [bug]
    修复了 SQLite 方言的has_table()函数,以便对于包含不存在的模式的非 None 模式名称的查询,正确地报告 False;以前,会引发数据库错误。
    参考:#9251


SqlAlchemy 2.0 中文文档(五十八)(3)https://developer.aliyun.com/article/1563135

相关文章
|
1月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(7)
SqlAlchemy 2.0 中文文档(五十八)
22 0
|
1月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(5)
SqlAlchemy 2.0 中文文档(五十八)
22 0
|
1月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(3)
SqlAlchemy 2.0 中文文档(五十八)
14 0
|
1月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(6)
SqlAlchemy 2.0 中文文档(五十八)
20 0
|
1月前
|
SQL Oracle 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(4)
SqlAlchemy 2.0 中文文档(五十八)
13 0
|
1月前
|
SQL 缓存 关系型数据库
SqlAlchemy 2.0 中文文档(五十八)(1)
SqlAlchemy 2.0 中文文档(五十八)
25 0
|
1月前
|
SQL 数据库连接 Linux
SqlAlchemy 2.0 中文文档(五十二)(7)
SqlAlchemy 2.0 中文文档(五十二)
27 0
|
1月前
|
SQL NoSQL 数据库
SqlAlchemy 2.0 中文文档(五十二)(5)
SqlAlchemy 2.0 中文文档(五十二)
16 0
|
1月前
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(五十二)(3)
SqlAlchemy 2.0 中文文档(五十二)
19 0
|
1月前
|
SQL 测试技术 数据库
SqlAlchemy 2.0 中文文档(五十二)(1)
SqlAlchemy 2.0 中文文档(五十二)
12 0