1.4 更新日志
本文详细介绍了 1.4 版本中进行的单个问题级别的更改。有关 1.4 中的新内容的叙述性概述,请参阅 SQLAlchemy 1.4 有什么新功能?。
1.4.53
无发布日期
1.4.52
发布日期:2024 年 3 月 4 日
orm
- [orm] [bug]
修复了 ORM 中with_loader_criteria()
不会应用到Select.join()
的 bug,其中 ON 子句被给定为普通的 SQL 比较,而不是作为关系目标或类似的东西。
这是在 2.0 版本中修复的同一问题的回溯,针对 2.0.22。
参考:#10365
1.4.51
发布日期:2024 年 1 月 2 日
orm
- [orm] [bug]
改进了首次在版本 0.9.8 中实施的修复项,该修复项最初在 #3208 中发布,其中声明性内部使用的类的注册表可能在个别映射类在同时进行垃圾回收而新的映射类正在构造时出现竞态条件的情况下,发生某些测试套件配置或动态类创建环境中可能发生的情况。除了已经添加的弱引用检查外,还首先复制正在迭代的项目列表,以避免“在迭代时更改列表”错误。拉取请求由 Yilei Yang 提供。
参考:#10782
asyncio
- [asyncio] [bug]
修复了异步连接池的关键问题,其中调用AsyncEngine.dispose()
会产生一个新的连接池,但没有完全重新建立使用 asyncio 兼容互斥锁的情况,导致在使用并发功能如asyncio.gather()
时,在 asyncio 上下文中使用普通的threading.Lock()
导致死锁。
参考:#10813
mysql
1.4.50
发布日期:2023 年 10 月 29 日
orm
- [orm] [bug]
修复了某些形式的 ORM “注解” 无法对使用Select.join()
进行关系目标的子查询进行的问题。这些注解在特殊情况下使用子查询时使用,例如在PropComparator.and_()
和其他 ORM 特定情况下。
参考资料:#10223
sql
- [sql] [错误]
修复了在某些情况下,使用literal_execute=True
时多次使用相同的绑定参数会由于迭代问题导致渲染错误值的问题。
参考资料:#10142 - [sql] [错误]
修复了对Column
或其他ColumnElement
的反序列化失败无法恢复正确的“比较器”对象的基本问题,该对象用于生成特定于类型对象的 SQL 表达式。
参考资料:#10213
模式
- [模式] [错误]
修改了仅对 Oracle 后端有效的Identity.order
参数的渲染,该参数是Sequence
和Identity
的一部分,不再对诸如 PostgreSQL 等其他后端有效。未来的版本将重新命名Identity.order
、Sequence.order
和Identity.on_null
参数,使用 Oracle 特定的名称,废弃旧名称,这些参数仅适用于 Oracle。
参考资料:#10207
mysql
- [mysql] [用例]
更新了 aiomysql 方言,因为该方言似乎又得到了维护。将其重新添加到使用版本 0.2.0 进行 ci 测试。 - [mysql] [错误]
修复了 MySQL“预先 ping”例程中的新不兼容性,其中传递给connection.ping()
的False
参数,旨在禁用不需要的“自动重新连接”功能,在 MySQL 驱动程序和后端中已弃用,并且正在为某些版本的 MySQL 原生客户端驱动程序生成警告。对于 mysqlclient,它已被删除,而对于 PyMySQL 和基于 PyMySQL 的驱动程序,该参数将在某个时候被弃用和删除,因此 API 内省用于未来防范这些不同的删除阶段。
参考:#10492
mssql
- [mssql] [bug] [reflection]
修复了对具有大型身份起始值(超过 18 位数)的 bigint 列的身份列反射将失败的问题。
参考:#10504
1.4.49
发布日期:2023 年 7 月 5 日
platform
- [platform] [usecase]
改进兼容性以完全与 Python 3.12 兼容
sql
- [sql] [bug]
修复了使用“flags”时ColumnOperators.regexp_match()
无法生成“稳定”缓存密钥的问题,即缓存密钥每次都会更改,导致缓存污染。对于带有标志和实际替换表达式的ColumnOperators.regexp_replace()
也存在相同的问题。现在,标志被表示为固定的修改器字符串,呈现为安全字符串,而不是绑定参数,并且替换表达式在“二进制”元素的主要部分内建立,以便生成适当的缓存密钥。
请注意,作为此更改的一部分,ColumnOperators.regexp_match.flags
和ColumnOperators.regexp_replace.flags
已修改为仅呈现为文字字符串,而以前它们呈现为完整的 SQL 表达式,通常是绑定参数。这些参数应始终作为纯 Python 字符串传递,而不是作为 SQL 表达式构造;不应该预期在实践中使用 SQL 表达式构造用于此参数,因此这是一个不兼容的更改。
此更改还修改了生成的表达式的内部结构,用于带有或不带有标志的ColumnOperators.regexp_replace()
以及带有标志的ColumnOperators.regexp_match()
。第三方方言可能已经实现了自己的正则表达式实现(在搜索中找不到这样的方言,所以预计影响较小),它们需要调整结构的遍历以适应。
参考:#10042 - [sql] [bug]
修复了一个在主要是内部使用的CacheKey
结构中的问题,其中__ne__()
运算符没有被正确实现,导致比较CacheKey
实例时得到荒谬的结果。
extensions
- [extensions] [bug]
修复了与 mypy 1.4 一起使用的 mypy 插件中的问题。
1.4.48
发布日期:2023 年 4 月 30 日
orm
- [orm] [bug]
修复了一个关键的缓存问题,其中aliased()
和hybrid_property()
表达式组合的组合将导致缓存键不匹配,从而导致缓存键保留了实际的aliased()
对象,同时又不匹配等价构造的缓存键,填满了缓存。
参考:#9728 - [orm] [bug]
修复了一个 bug,在各种 ORM 特定的 getter 函数(比如ORMExecuteState.is_column_load
、ORMExecuteState.is_relationship_load
、ORMExecuteState.loader_strategy_path
等)中,如果 SQL 语句本身是“复合选择”(如 UNION),则会抛出AttributeError
。
参考:#9634 - [orm] [bug]
修复了当使用“关联到别名类”的功能并且在加载器中指定了一个递归的急加载器,比如lazy="selectinload"
,与另一个急加载器在相反的一侧结合使用时可能出现的无限循环。循环检查已修复以包括别名类关系。
引用:#9590
1.4.47
发布日期:2023 年 3 月 18 日
sql
- [sql] [bug]
修复了使用Update.values()
方法中与列相同名称的bindparam()
的错误/回归,以及Insert.values()
方法中与列相同名称的bindparam()
的错误/回归,仅在 2.0 版本中会在某些情况下静默地失败,不会遵守呈现参数的 SQL 表达式,而是用同名的新参数替换表达式并丢弃 SQL 表达式的任何其他元素,比如 SQL 函数等。具体情况是针对 ORM 实体而不是普通的Table
实例构建的语句,但如果语句在使用时被调用了一个Session
或一个Connection
,则会发生。Update
的一部分问题既出现在 2.0 版本中又出现在 1.4 版本中,并且被回溯到 1.4 版本。
引用:#9075 - [sql] [bug]
修复了CreateSchema
和DropSchema
DDL 构造的字符串化,当没有方言时会导致AttributeError
。
引用:#7664 - [sql] [bug]
修复了临界的 SQL 缓存问题,其中使用Operators.op()
自定义运算符函数不会生成适当的缓存键,导致 SQL 缓存的效果降低。
引用:#9506
mypy
- [mypy] [bug]
调整了 mypy 插件,以适应在使用 SQLAlchemy 1.4 时可能进行的一些针对问题#236 sqlalchemy2-stubs 的更改。这些更改在 SQLAlchemy 2.0 内保持同步。这些更改还与旧版本的 sqlalchemy2-stubs 兼容。 - [mypy] [bug]
修复了 mypy 插件中的崩溃,该崩溃可能发生在 1.4 和 2.0 版本上,如果使用一个装饰器来引用一个表达式中的装饰器(例如@Backend.mapper_registry.mapped
),该表达式具有两个以上的组件,则会发生崩溃。现在会忽略这种情况;使用插件时,装饰器表达式需要是两个组件(即@reg.mapped
)。
参考文献:#9102
postgresql
- [postgresql] [bug]
添加了对 asyncpg 方言的支持,以在可用时返回cursor.rowcount
值以用于 SELECT 语句。虽然这不是cursor.rowcount
的典型用法,但是其他 PostgreSQL 方言通常提供此值。拉取请求由 Michael Gorven 提供。
参考文献:#9048
mysql
- [mysql] [usecase]
添加了对 MySQL 索引反射的支持,以正确反映以前被忽略的mysql_length
字典。
参考文献:#9047
mssql
- [mssql] [bug]
修复了一个 bug,在此 bug 中,使用方括号给出的模式名称,但名称内没有点,例如Table.schema
的参数,将不会在 SQL Server 方言的上下文中解释为解释为标记定界符的文档化行为,首次在#2626 中添加,当在反射操作中引用模式名称时。有关#2626 行为的最初假设是,只有在存在点时,方括号的特殊解释才是重要的,但是在实践中,由于这些不是常规或定界标识符中的有效字符,因此在所有 SQL 渲染操作中都不包括方括号作为标识符名称的一部分。拉取请求由 Shan 提供。
参考文献:#9133
oracle
- [oracle] [bug]
将ROWID
添加到反射类型中,因为此类型可能在“CREATE TABLE”语句中使用。
参考文献:#5047
1.4.46
发布日期:2023 年 1 月 3 日
一般
- [general] [change]
现在,当SQLALCHEMY_WARN_20
环境变量未设置时,首次发出任何 SQLAlchemy 2.0 弃用警告时,将发出新的弃用“超级警告”。警告至多发出一次,然后设置一个布尔值以防止其再次发出。
此弃用警告旨在通知未在其要求文件中设置适当约束的用户,阻止对意外 SQLAlchemy 2.0 升级的惊喜,并提醒 SQLAlchemy 2.0 升级流程已经可用,因为预计很快将发布第一个完整的 2.0 版本。可以通过设置环境变量SQLALCHEMY_SILENCE_UBER_WARNING
为"1"
来关闭弃用警告。
另请参阅
SQLAlchemy 2.0 - 主要迁移指南
参考:#8983 - [general] [bug]
修复了基本兼容模块调用platform.architecture()
来检测某些系统属性的问题,这导致针对一些情况下不可用的系统级file
调用发生了过度广泛的系统调用,包括在某些安全环境配置中。
参考:#8995
orm
- [orm] [bug]
修复了用于 DML 语句(如Update
和Delete
)的内部 SQL 遍历中的问题,该问题可能会导致与 ORM 更新/删除功能一起使用 lambda 语句时出现特定问题,以及其他潜在问题。
参考:#9033
engine
- [engine] [bug]
修复了连接池中长期存在的竞态条件,该条件可能在使用 eventlet/gevent 的猴子补丁方案以及使用 eventlet/geventTimeout
条件时发生,并且连接池检出由于超时而中断时未能清理失败状态,导致底层连接记录以及有时数据库连接本身“泄漏”,使得连接池处于无效状态,其中某些条目无法访问。该问题首次在 SQLAlchemy 1.2 中被识别并修复,针对 #4225,然而,在该修复中检测到的故障模式未能适应于BaseException
,而不是Exception
,这导致无法捕获 eventlet/geventTimeout
。此外,还发现并加固了初始连接池连接中的一个块,使用了BaseException
-> “清理失败连接” 块,以适应此位置中的相同条件。非常感谢 Github 用户 @niklaus 在识别和描述此复杂问题方面的坚持努力。
参考:#8974
sql
- [sql] [bug]
添加了参数FunctionElement.column_valued.joins_implicitly
, 这在使用表值或列值函数时防止“笛卡尔积”警告时非常有用。此参数已经为FunctionElement.table_valued()
在 #7845 中引入,但未能为FunctionElement.column_valued()
添加。
参考:#9009 - [sql] [错误]
修复了 SQL 编译失败的 bug(2.0 中的断言失败,1.4 中的 NoneType 错误),当使用的表达式的类型包括TypeEngine.bind_expression()
,在与literal_binds
编译器参数一起使用时处于“扩展”(即“IN”)参数的上下文中时。
参考:#8989 - [sql] [错误]
修复了 lambda SQL 功能中的问题,其中文字值的计算类型不会考虑“比较类型”的类型强制转换规则,导致 SQL 表达式(例如与JSON
元素的比较等)缺乏类型信息。
参考:#9029
postgresql
- [postgresql] [用例]
添加了 PostgreSQL 类型MACADDR8
。Pull 请求由 Asim Farooq 提供。
参考:#8393 - [postgresql] [错误]
修复了 PostgreSQLInsert.on_conflict_do_update.constraint
参数接受Index
对象的 bug,然而,它不会将此索引展开为其各个索引表达式,而是将其名称渲染到 ON CONFLICT ON CONSTRAINT 子句中,这不被 PostgreSQL 接受;“约束名”形式只接受唯一或排除约束名。该参数仍然接受索引,但现在将其展开为其组成表达式以进行渲染。
参考:#9023
sqlite
- [sqlite] [错误]
修复了 1.4.45 中对 SQLite 部分索引的反射支持引起的回归问题,该问题是由于早期版本的 SQLite(可能是 3.8.9 之前的版本)中的index_list
pragma 命令未返回当前预期的列数,导致在反射表和索引时引发异常。
参考:#8969
测试
- [测试] [错误]
修复了 tox.ini 文件中的问题,其中 tox 4.0 系列对“passenv”的格式进行了更改,导致 tox 无法正确运行,特别是在 tox 4.0.6 中引发错误。 - [测试] [错误]
为第三方方言添加了新的排除规则,称为unusual_column_name_characters
,可以关闭不支持带有点、斜杠或百分号等特殊字符的列名的第三方方言,即使名称已经正确引用。
参考:#9002
1.4.45
发布日期:2022 年 12 月 10 日
orm
- [orm] [错误]
修复了Session.merge()
无法保留使用relationship.viewonly
参数指示的关系属性的当前加载内容的错误,从而破坏了使用Session.merge()
从缓存和其他类似技术中拉取完全加载的对象的策略。在相关变更中,修复了一个问题,即包含已加载的关系但在映射上仍配置为lazy='raise'
的对象在传递给Session.merge()
时会失败;在合并过程中暂停了对“raise”的检查,假定Session.merge.load
参数保持其默认值True
。
总的来说,这是对 1.4 系列中引入的一项变更的行为调整,截至#4994,该变更将“merge”从默认应用于“viewonly”关系的级联集中移除。由于“viewonly”关系在任何情况下都不会持久化,允许它们的内容在“merge”期间传输不会影响目标对象的持久化行为。这使得Session.merge()
能够正确地满足其中一个用例,即向Session
中添加在其他地方加载的对象,通常是为了从缓存中恢复。
参考:#8862 - [orm] [错误]
修复了with_expression()
中的问题,在这种情况下,由从封闭 SELECT 引用的列组成的表达式在某些情境下不会正确渲染 SQL,即使表达式具有与使用query_expression()
的属性匹配的标签名称,即使query_expression()
没有默认表达式。目前,如果query_expression()
确实有默认表达式,那个标签名称仍然用于该默认表达式,并且具有相同名称的额外标签将继续被忽略。总的来说,这种情况相当棘手,可能需要进一步调整。
参考:#8881
engine
- [engine] [错误]
修复了Result.freeze()
方法无法用于使用text()
或Connection.exec_driver_sql()
的文本 SQL 的问题。
参考:#8963
sql
- [sql] [用例]
现在,在任何“文字绑定参数”渲染操作失败的情况下,会抛出一个信息性的重新引发,指示值本身和正在使用的数据类型,以帮助调试在语句中渲染文字参数时出现的��题。
参考:#8800 - [sql] [错误]
修复了关于渲染绑定参数位置和有时身份的一系列问题,例如用于 SQLite、asyncpg、MySQL、Oracle 等的参数。一些编译形式无法正确维护参数的顺序,例如 PostgreSQL 的regexp_replace()
函数,首次引入于#4123的CTE
构造的“嵌套”功能,以及使用 Oracle 的FunctionElement.column_valued()
方法形成的可选择表。
参考:#8827
asyncio
- [asyncio] [错误]
从AsyncResult
中删除了无效的merge()
方法。此方法从未起作用,并且错误地包含在AsyncResult
中。
参考:#8952
postgresql
- [postgresql] [bug]
调整了 PostgreSQL 方言在从表中反射列时考虑列类型的方式,以适应可能从 PGformat_type()
函数返回 NULL 的替代后端。
参考:#8748
sqlite
- [sqlite] [usecase]
添加了对 SQLite 后端反映“DEFERRABLE”和“INITIALLY”关键字的支持,这些关键字可能存在于外键构造中。感谢 Michael Gorven 的贡献。
参考:#8903 - [sqlite] [usecase]
添加了对 SQLite 方言中包含在索引中的基于表达式的 WHERE 条件的反射支持,类似于 PostgreSQL 方言的方式。感谢 Tobias Pfeiffer 的贡献。
参考:#8804 - [sqlite] [bug]
回溯了一个关于 SQLite 反射附加模式中唯一约束的修复,作为 #4379 的一小部分在 2.0 中发布。以前,附加模式中的唯一约束会被 SQLite 反射忽略。感谢 Michael Gorven 的贡献。
参考:#8866
oracle
- [oracle] [bug]
继续修复 Oracle 修复 #8708,在 1.4.43 中发布,其中以下划线开头的绑定参数名称(Oracle 不允许)仍未在所有情况下正确转义。
参考:#8708 - [oracle] [bug]
修复了 Oracle 编译器中FunctionElement.column_valued()
语法不正确的问题,未正确限定源表,导致名称COLUMN_VALUE
不正确。
参考:#8945
1.4.44
发布日期:2022 年 11 月 12 日
sql
- [sql] [bug]
修复了缓存键生成中识别到的关键内存问题,对于使用大量带有子查询的 ORM 别名的非常大且复杂的 ORM 语句,缓存键生成可能会产生比语句本身大几个数量级的过大键。非常感谢 Rollo Konig Brock 在最终识别此问题方面的非常耐心和长期帮助。
参考:#8790
postgresql
- [postgresql] [bug] [mssql]
仅针对 PostgreSQL 和 SQL Server 方言,调整了编译器,以便在渲染 RETURNING 子句中的列表达式时,对于生成标签的 SQL 表达式元素建议使用“非匿名”标签,主要示例是 SQL 函数,可能作为列的类型的一部分发出,其中标签名称应默认与列的名称匹配。这恢复了在版本 1.4.21 中由于#6718,#6710引起的一个未明确定义的行为变更。Oracle 方言具有不同的 RETURNING 实现,并不受此问题影响。版本 2.0 对其他后端的广泛扩展的 RETURNING 支持进行了全面更改。
参考:#8770
oracle
- [oracle] [bug]
修复了 Oracle 方言中的问题,其中针对完整的Table
对象一次性使用insert(some_table).values(...).returning(some_table)
的 INSERT 语句会失败执行,引发异常。
测试
- [tests] [bug]
修复了测试套件中使用--disable-asyncio
参数时的问题,该参数实际上未能运行 greenlet 测试,并且也未能阻止套件在整个运行过程中使用“包装” greenlet。设置此参数后,确保整个运行过程中不会发生任何 greenlet 或 asyncio 使用。
参考:#8793 - [tests] [bug]
调整了测试套件,测试 Mypy 插件,以适应 Mypy 0.990 中如何处理消息输出的更改,这影响了确定是否应为特定文件打印注释和错误时 sys.path 的解释。该更改使测试套件中的文件在使用 mypy API 运行时不再产生消息,从而破坏了测试套件。
1.4.43
发布日期:2022 年 11 月 4 日
orm
- [orm] [bug]
修复了连接的急切加载中的问题,在其中,当急切加载跨越三个映射器时,具有特定外部/内部连接的急切加载组合时,会发生断言失败。
参考:#8738 - [orm] [bug]
修复了涉及Select
构造的错误,其中Select.select_from()
与Select.join()
的组合,以及使用Select.join_from()
时,如果查询的列子句未明确包括 JOIN 的左侧实体,则会导致with_loader_criteria()
功能以及单表继承查询所需的 IN 条件不会呈现。现在正确的实体被传递给内部生成的Join
对象,以便正确添加与左侧实体的条件。
引用:#8721 - [orm] [bug]
当在特定“加载器路径”中添加到加载器选项时引发了一个信息性异常,例如在Load.options()
中使用它时,现在会引发一个信息性异常。此使用不受支持,因为with_loader_criteria()
仅用作顶级加载器选项。以前,会生成内部错误。
引用:#8711 - [orm] [bug]
为Session.get()
改进了“字典模式”,以便于在命名字典中指示指向主键属性名称的同义词名。
引用:#8753 - [orm] [bug]
修复了继承映射器中“selectin_polymorphic”加载的问题,如果Mapper.polymorphic_on
参数引用的 SQL 表达式不直接映射到类上,则此问题将无法正确工作。
引用:#8704 - [orm] [bug]
修复了在使用Query
对象作为迭代器时,如果在迭代过程中引发了用户定义的异常情况,则底层的 DBAPI 游标不会被关闭的问题,从而导致迭代器被 Python 解释器关闭。当使用Query.yield_per()
创建服务器端游标时,这将导致通常与服务器端游标不同步相关的 MySQL 问题,并且由于无法直接访问Result
对象,最终用户代码无法访问游标以关闭它。
为了解决这个问题,在迭代器方法中应用了对GeneratorExit
的捕获,当迭代器被中断时,将关闭结果对象,并且根据定义将被 Python 解释器关闭。
作为 1.4 系列实施的这一变更的一部分,确保了所有Result
实现都提供了.close()
方法,包括ScalarResult
、MappingResult
。2.0 版本的这一变更还包括了用于与Result
类一起使用的新上下文管理器模式。
参考:#8710
引擎
- [engine] [bug] [regression]
修复了当Connection
关闭并正在将其 DBAPI 连接返回到连接池时,在某些情况下不会调用PoolEvents.reset()
事件钩子的问题。
情况是当Connection
在将连接返回到池的过程中已经发出了.rollback()
时,然后会指示连接池放弃执行自己的“重置”以节省额外的方法调用。然而,这阻止了在此钩子中使用自定义池重置方案,因为这样的钩子定义上做的不仅仅是调用.rollback()
,并且需要在所有情况下被调用。这是在 1.4 版本中出现的一个退化。
对于版本 1.4,PoolEvents.checkin()
仍然可以作为用于自定义“重置”实现的替代事件钩子。版本 2.0 将提供一个改进版本的PoolEvents.reset()
,它被用于其他情况,例如终止 asyncio 连接,并且还传递了有关重置的上下文信息,以允许“自定义连接重置”方案以不同的方式响应不同的重置情况。
参考:#8717 - [engine] [bug]
确保所有Result
对象都包括Result.close()
方法以及Result.closed
属性,包括ScalarResult
和MappingResult
。
参考:#8710
sql
- [sql] [bug]
修复了一个问题,该问题阻止了literal_column()
构造在Select
构造上正常工作,以及在其他潜在的可能生成“匿名标签”的地方,如果字面表达式包含可能干扰格式字符串的字符,例如括号,由于“匿名标签”结构的实现细节。
参考:#8724
mssql
- [mssql] [bug]
修复了使用Inspector.has_table()
针对带有 SQL Server 方言的临时表时会在某些 Azure 变体上失败的问题,因为不支持在这些服务器版本上的不必要的信息模式查询。来自 Mike Barry 的拉取请求。
参考:#8714 - [mssql] [bug] [reflection]
修复了针对带有 SQL Server 方言的视图使用时的Inspector.has_table()
的问题,由于 1.4 系列中去除了对 SQL Server 的此支持而导致错误返回False
。此问题在使用不同反射架构的 2.0 系列中不存在。添加了测试支持以确保has_table()
保持符合视图的规范。
引用:#8700
oracle
- [oracle] [bug]
修复了一个问题,即包含通常需要在 Oracle 中用引号引用的字符的绑定参数名称,包括从同名数据库列自动派生的参数名称,在使用 Oracle 方言的“expanding parameters”时不会被转义,从而导致执行错误。 Oracle 方言使用的绑定参数的通常“引用”不适用于“expanding parameters”架构,因此现在使用一系列特定于 Oracle 的字符/转义来转义。
引用:#8708 - [oracle] [bug]
修复了一个问题,即在第一次连接时查询nls_session_parameters
视图以获取默认的小数点字符可能不可用,具体取决于 Oracle 连接模式,因此可能会引发错误。检测小数字符的方法已经简化为直接测试一个小数值,而不是读取系统视图,这在任何后端/驱动程序上都有效。
引用:#8744
1.4.42
发布日期:2022 年 10 月 16 日
orm
- [orm] [bug]
当传递给Session.execute()
等方法时,Session.execute.bind_arguments
字典不再发生变化;相反,它会被复制到内部字典以进行状态更改。在其他方面,这修复了一个问题,即传递给Session.get_bind()
方法的“clause”将错误地引用了用于“fetch”同步策略的Select
构造,而实际发出的查询是Delete
或Update
。这会干扰“路由会话”的处理方法。
引用:#8614 - [orm] [bug]
在 ORM 配置中当将映射类的本地列应用于任何不包含相同表列的引用类时,会发出警告,这时应用了显式的remote()
注解。理想情况下,这在某个时候会引发错误,因为从映射的角度来看这是不正确的。
参考文献:#7094 - [orm] [bug]
当尝试配置一个在继承层次结构中的映射类时,其中映射器没有给定任何多态标识时会发出警告,但是却分配了一个多态鉴别器列。这样的类如果从不打算直接加载,则应该是抽象的。
参考文献:#7545 - [orm] [bug] [regression]
在contains_eager()
中修复了 1.4 版本的回归问题,在其中joinedload()
的“包装成子查询”逻辑会意外地触发使用contains_eager()
函数的类似语句(例如使用distinct()
、limit()
或offset()
的语句),然后会导致使用一些 SQL 标签名称和别名的查询的次要问题。这种“包装”对于contains_eager()
并不合适,因为它一直遵循的合同是用户定义的 SQL 语句未经修改,只是添加了适当的列以被提取。
参考文献:#8569 - [orm] [bug] [regression]
修复了使用同步会话=’fetch’的 ORM update() 会因为在刷新对象时使用评估器来确定 SET 子句中的表达式的 Python 值而失败的回归问题;如果评估器针对非数值值(例如 PostgreSQL JSONB)使用数学运算符,那么评估不可用的条件将无法正确检测。评估器现在只对数值类型限制了数学突变运算符的使用,异常是“+”继续对字符串起作用。SQLAlchemy 2.0 可能会通过完全获取 SET 值而不是使用评估来进一步更改此设置。
参考文献:#8507
engine
- [engine] [bug]
修复了在select()
构造的列子句中混合使用“*”和额外显式命名列表达式会导致结果列定位有时将标签名称或其他非重复名称视为模糊目标的问题。
参考文献:#8536
asyncio
- [asyncio] [bug]
改进了asyncio.shield()
在上下文管理器中的实现,如在 #8145 中所添加的,使得“关闭”操作被封装在一个asyncio.Task
中,然后在操作进行时被强引用。这符合 Python 文档中指出的任务否则不会被强引用的情况。
参考文献:#8516
postgresql
- [postgresql] [usecase]
aggregate_order_by
现在支持缓存生成。
参考文献:#8574
mysql
- [mysql] [bug]
调整了在测试视图时用于匹配“CREATE VIEW”的正则表达式,以更灵活地工作,不再需要中间的特殊关键字“ALGORITHM”,这原本是可选的,但却不能正确工作。此更改允许视图反射在诸如 StarRocks 这样的兼容 MySQL 的变体上更完整地工作。拉取请求由 John Bodley 提供。
参考文献:#8588
mssql
- [mssql] [bug] [regression]
修复了 SQL Server 隔离级别获取中的另一个回归问题(见 #8231, #8475),这次是关于“Microsoft Dynamics CRM 数据库通过 Azure Active Directory”,显然完全缺少system_views
视图。错误捕获已扩展,保证这种方法绝对不会失败,只要有数据库连接存在。
参考文献:#8525
1.4.41
发布日期:2022 年 9 月 6 日
orm
- [orm] [bug] [events]
修复了一个事件监听问题,即当事件监听器添加到一个超类时,如果创建了一个子类,那么子类自己的监听器就会丢失。一个实际的例子是在为Session
类关联事件之后创建的sessionmaker
类。
参考文献:#8467 - [orm] [bug]
加强了aliased()
和with_polymorphic()
构造的缓存键策略。虽然很难(如果有的话)演示涉及实际语句被缓存的问题,但是这两个构造在其缓存键中未包含足够使它们在缓存时独特的内容,以使仅对别名构造进行缓存是准确的。
参考:#8401 - [orm] [bug] [regression]
修复了在 1.4 系列中出现的回归问题,其中作为子查询放置的继承查询在该实体的封闭查询中会失败以正确渲染 JOIN。这个问题在 1.4.18 版本之前和之后的两种不同情况下表现出来(相关问题 #6595),在一种情况下会渲染两次 JOIN,而在另一种情况下会完全丢失 JOIN。为了解决这个问题,已经缩减了应用“多态加载”的条件,不再为简单的继承查询调用它。
参考:#8456 - [orm] [bug]
修复了sqlalchemy.ext.mutable
扩展中的问题,如果对象在通过Session.merge()
合并时同时传递Session.merge.load
为 False,则会丢失到父对象的集合链接。
参考:#8446 - [orm] [bug]
修复了涉及with_loader_criteria()
的问题,其中在 lambda 内使用的闭包变量作为绑定参数值在语句被缓存后不会正确传递到额外的关系加载器(如selectinload()
和lazyload()
),而是使用过时的原始缓存值。
参考:#8399
sql
- [sql] [bug]
修复了使用table()
构造时,将字符串传递给table.schema
参数时,未考虑“schema”字符串在生成缓存键时,导致如果使用了具有不同模式的多个同名table()
构造,可能会导致缓存冲突的问题。
参考:#8441
asyncio
- [asyncio] [bug]
集成了对 asyncpg 的terminate()
方法调用的支持,用于在连接池回收可能超时的连接、在垃圾回收未正常关闭连接时以及连接已失效时。这允许 asyncpg 放弃连接而无需等待可能导致长时间超时的响应。
参考:#8419
mssql
- [mssql] [bug] [regression]
修复了在 1.4.40 中发布的 #8231 修复���起的回归,当用户没有权限查询dm_exec_sessions
或dm_pdw_nodes_exec_sessions
系统视图以确定当前事务隔离级别时,连接会失败。
参考:#8475
1.4.40
发布日期:2022 年 8 月 8 日
orm
- [orm] [bug]
修复了在多次引用 CTE 与多态 SELECT 结合时可能导致构建多个相同 CTE 的“克隆体”,然后触发这两个 CTE 作为重复项的问题。为了解决这个问题,在发生这种情况时,这两个 CTE 会进行深度比较以确保它们是等价的,然后被视为等价。
参考:#8357 - [orm] [bug]
通过传递唯一的SELECT *
参数(通过字符串、text()
或literal_column()
)给select()
构造,将被解释为核心级别的 SQL 语句,而不是 ORM 级别的语句。这样,当*
扩展以匹配任意数量的列时,将返回结果中的所有列。ORM 级别的select()
的解释需要提前知道所有 ORM 列的名称和类型,而当使用'*'
时无法实现。
如果在 ORM 语句中同时使用'*
和其他表达式,会引发错误,因为 ORM 无法正确解释这种情况。
参考:#8235
orm 声明式
- [orm] [declarative] [bug]
修复了一个问题,即将一系列设置为抽象或混合声明类的类层次结构上的独立列声明在超类上,然后正确复制到declared_attr
可调用的类上,该类希望在后代类上使用它们。
参考:#8190
引擎
- [engine] [usecase]
在核心中为Connection
实现了新的Connection.execution_options.yield_per
执行选项,以模仿 ORM 中相同的 yield_per 选项。该选项同时设置Connection.execution_options.stream_results
选项,并调用Result.yield_per()
,以提供最常见的流式结果配置,也与 ORM 使用情况中的使用模式相一致。
另请参阅
使用服务器端游标(即流式结果) - 修订文档 - [engine] [bug]
修复了Result
中的错误,当使用缓冲结果策略时,如果使用的方言不支持显式的“服务器端游标”设置,则不会使用Connection.execution_options.stream_results
。这是一个错误,因为像 SQLite 和 Oracle 这样的 DBAPI 已经使用了非缓冲结果获取方案,仍然受益于部分结果获取的使用。在设置Connection.execution_options.stream_results
的所有情况下现在都使用“缓冲”策略。 - [engine] [bug]
添加了FilterResult.yield_per()
,以便结果实现(如MappingResult
、ScalarResult
和AsyncResult
)可以访问此方法。
参考:#8199
sql
- [sql] [bug]
调整了字符串包含函数.contains()
、.startswith()
、.endswith()
的 SQL 编译,强制使用字符串连接运算符,而不是依赖于加法运算符的重载,以便非标准的用法,例如字节字符串仍然生成字符串连接运算符。
参考:#8253
mypy
- [mypy] [bug]
修复了使用 lambda 作为 Column 默认值时 mypy 插件崩溃的问题。感谢 tchapi 提交的拉取请求。
参考:#8196
asyncio
- [asyncio] [bug]
在使用AsyncConnection
或AsyncSession
作为上下文管理器释放对象时,特别是在__aexit__()
上下文管理器退出时,将asyncio.shield()
添加到连接和会话释放过程中。 当上下文管理器完成时,这似乎有助于使用其他并发库(如anyio
、uvloop
)时取消任务时正确释放连接池中的连接。
参考:#8145
postgresql
- [postgresql] [bug]
修复了 psycopg2 方言中的问题,在实现了 #4392 的“多主机”功能时,可以将多个host:port
对作为查询字符串传递,例如?host=host1:port1&host=host2:port2&host=host3:port3
,但没有正确实现,因为它没有适当地传播“port”参数。 没有使用不同“port”的连接可能正常工作,而具有某些条目的“port”可能会不正确地传递该主机名。 现在已更正格式以正确传递主机/端口。
作为这一变化的一部分,保持了另一种意外有效的多主机样式的支持,即以逗号分隔的?host=h1,h2,h3&port=p1,p2,p3
。这种格式更符合 libpq 的查询字符串格式,而以前的格式受到 libpq URI 格式的不同方面的启发,但并不完全相同。
如果两种样式混合在一起,会引发错误,因为这是模棱两可的。
参考:#4392
mssql
- [mssql] [bug]
修复了与 SQL Server pyodbc 方言一起使用 ORM 对象的新使用模式在 使用 INSERT、UPDATE 和 ON CONFLICT(即 upsert)返回 ORM 对象时无法正确工作的问题。
参考:#8210 - [mssql] [bug]
修复了在 Azure Synapse Analytics 上 SQL Server 方言的当前隔离级别查询失败的问题,这是由于这个数据库在错误发生后处理事务回滚的方式。已修改初始查询,不再依赖于在检测适当的系统视图时捕获错误。此外,为了更好地支持这个数据库的非常特定的“回滚”行为,实现了新参数ignore_no_transaction_on_rollback
,指示回滚应忽略 Azure Synapse 错误‘No corresponding transaction found. (111214)’,如果没有与 Python DBAPI 冲突的事务存在。
初版补丁和宝贵的调试协助由@ww2406 提供。
另见
避免 Azure Synapse Analytics 上的事务相关异常
参考:#8231
杂项
- [bug] [types]
修复了TypeDecorator
在装饰ARRAY
数据类型时,不会正确代理__getitem__()
运算符的问题,没有明确的解决方法。
参考:#7249
1.4.39
发布日期:2022 年 6 月 24 日
orm
- [orm] [bug] [regression]
修复了由#8133引起的回归,其中可变属性的 pickle 格式被更改,而没有回退到识别旧格式,导致 SQLAlchemy 的就地升级无法再读取来自旧版本的 pickled 数据。现在增加了检查以及对旧格式的回退。
参考:#8133
SqlAlchemy 2.0 中文文档(五十九)(2)https://developer.aliyun.com/article/1563148