1.4 更新日志

本文档详细介绍了 1.4 版本发布过程中的各个问题级别的更改。 有关 1.4 版本新特性的叙述性概述,请参阅 SQLAlchemy 1.4 的新特性?

1.4.55

无发布日期

1.4.54

发布日期:2024年9月5日

通用

  • [通用] [变更]

    已移除 pyproject.tomlsetuptools<69.3 的 pin 限制。 此 pin 限制是为了防止 setuptools 突然更改为使用 PEP 625,这将更改 SQLAlchemy 源代码发行版在 pypi 上的文件名,使其成为全小写名称,这可能会给各种期望先前命名风格的构建环境带来问题。 但是,此 pin 限制阻碍了其他想要使用更新版本 setuptools 的环境,因此我们决定推进此更改,并假设构建环境现在已在很大程度上适应了 setuptools 的更改。

    此更改最初在 2.0.33 版本中发布,但已向后移植到 1.4.54 以支持正在进行的版本发布。

    参考: #11818

  • [通用] [变更]

    setuptools “test” 命令已从 1.4 系列中移除,因为现代版本的 setuptools 积极拒绝接受此扩展的存在。 此更改已包含在 2.0 系列中。 要运行测试套件,请使用 tox 命令。

ORM

  • [ORM] [错误] [回归]

    修复了 1.3 版本中的回归错误,其中用于混合属性的列键可能会填充其返回的底层列的列键,对于直接返回 ORM 映射列的属性,而不是混合属性本身使用的键。

    参考: #11728

PostgreSQL

  • [PostgreSQL] [错误]

    修复了 asyncpg 驱动程序中的严重问题,其中专门针对 MissingGreenlet 条件或任何其他非 asyncpg 本身引发的错误而失败的回滚或提交,在任何情况下都会丢弃 asyncpg 事务,即使该事务仍然处于空闲状态,从而导致服务器端出现空闲事务的情况,然后该事务会返回到连接池。 现在,对于 asyncpg 本身之外引发的错误,不会重置“事务已关闭”的标志。 当 asyncpg 本身针对 .commit().rollback() 引发错误时,asyncpg 确实会丢弃此事务。

    参考: #11819

1.4.53

发布日期:2024年7月29日

通用

  • [通用] [错误]

    设置了完整的 Python 3.13 支持(在当前可能的范围内),修复了内部语言帮助程序以及序列化程序扩展模块中的问题。

    对于 1.4 版本,这也使 setup.cfg 中的“extras”名称现代化,对双字名称使用破折号而不是下划线。 下划线名称仍然存在,以适应潜在的兼容性问题。

    参考: #11417

ORM

  • [ORM] [错误] [回归]

    修复了追溯到 1.4 版本的回归错误,其中在瞬态对象上使用“动态”策略访问集合并尝试查询时,会引发内部错误,而不是在 1.3 版本中出现的预期 NoResultFound 错误。

    参考: #11562

引擎

  • [引擎] [用例]

    修改了用于将 asyncio 调用适配到 greenlet 的内部表示,以允许与直接实现 SQLAlchemy 的“greenlet-to-asyncio”模式的第三方库进行鸭子类型兼容。 在具有属性 __sqlalchemy_greenlet_provider__ = True 的 greenlet 中运行代码将允许直接调用 sqlalchemy.util.await_only()

  • [引擎] [错误]

    对 C 扩展进行了调整,这些扩展特定于 SQLAlchemy 1.x 系列,以在 Python 3.13 下工作。 Pull 请求由 Ben Beasley 提供。

    参考: #11499

SQL

mypy

  • [mypy] [错误]

    已弃用的 mypy 插件不再与最新的 mypy 1.11.0 系列完全兼容,因为 mypy 解释器中的更改不再与插件使用的方法兼容。 如果代码依赖于带有 sqlalchemy2-stubs 的 mypy 插件,建议将 mypy pin 限制为低于 1.11.0 系列。 寻求升级到 SQLAlchemy 2.0 系列并迁移到现代类型注释。

SQLite

  • [SQLite] [错误] [反射]

    修复了 SQLite 中计算列的反射,以正确处理复杂表达式。

    参考: #11582

MSSQL

  • [MSSQL] [错误]

    修复了 SQL Server 驱动程序在呈现窗口函数的“帧规范”(例如“ROWS BETWEEN”等)时不支持绑定参数的问题。

    参考: #11514

1.4.52

发布日期:2024年3月4日

ORM

  • [ORM] [错误]

    修复了 ORM with_loader_criteria() 不会将自身应用于 Select.join() 的错误,其中 ON 子句以纯 SQL 比较而不是关系目标或类似形式给出。

    这是为 2.0.22 版本在 2.0 版本中修复的同一问题的向后移植。

    更新 - 发现这也修复了单继承条件无法正确应用于仅出现在 select_from() 列表中的子类实体的问题,请参阅 #11412

    参考: #10365, #11412

1.4.51

发布日期:2024年1月2日

ORM

  • [ORM] [错误]

    改进了最初为 #3208 修复的错误,该修复在 0.9.8 版本中发布,其中声明式内部使用的类注册表可能会受到竞争条件的影响,在这种情况下,当新的映射类正在构造时,个别映射类同时被垃圾回收,这可能发生在某些测试套件配置或动态类创建环境中。 除了已添加的 weakref 检查外,还首先复制正在迭代的项目列表,以避免“列表在迭代时已更改”错误。 Pull 请求由 Yilei Yang 提供。

    参考: #10782

asyncio

  • [asyncio] [错误]

    修复了 asyncio 版本连接池中的严重问题,其中调用 AsyncEngine.dispose() 会生成一个新的连接池,该连接池未完全重新建立 asyncio 兼容互斥锁的使用,从而导致使用普通的 threading.Lock(),然后在 asyncio 上下文中使用并发功能(如 asyncio.gather())时会导致死锁。

    参考: #10813

MySQL

  • [MySQL] [错误]

    修复了在 ticket #10492 的修复中引入的回归错误,当将池预先 ping 与低于 1.0 版本的 PyMySQL 一起使用时。

    参考: #10650

1.4.50

发布日期:2023年10月29日

ORM

  • [ORM] [错误]

    修复了阻止某些形式的 ORM “注释”对使用 Select.join() 对关系目标进行子查询的基本问题。 每当在特殊情况下使用子查询时,例如在 PropComparator.and_() 和其他 ORM 特定场景中使用子查询时,都会使用这些注释。

    参考: #10223

SQL

  • [SQL] [错误]

    修复了在某些与其他文字渲染参数组合的情况下,多次使用相同的绑定参数和 literal_execute=True 会由于迭代问题导致渲染错误值的问题。

    参考: #10142

  • [SQL] [错误]

    修复了反序列化 Column 或其他 ColumnElement 会无法恢复正确的“比较器”对象的问题,该对象用于生成特定于类型对象的 SQL 表达式。

    参考: #10213

Schema

  • [Schema] [错误]

    修改了仅 Oracle 的 Identity.order 参数的呈现方式,该参数是 SequenceIdentity 的一部分,使其仅对 Oracle 后端生效,而不对其他后端(如 PostgreSQL)生效。 未来的版本将把 Identity.orderSequence.orderIdentity.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] [错误] [反射]

    修复了对于具有大型标识起始值(超过 18 位数字)的 bigint 列,标识列反射会失败的问题。

    参考: #10504

1.4.49

发布日期:2023年7月5日

平台

  • [平台] [用例]

    与 Python 3.12 完全兼容的兼容性改进

SQL

  • [SQL] [错误]

    修复了使用“flags”时,ColumnOperators.regexp_match() 不会生成“稳定”缓存键的问题,也就是说,缓存键每次都会更改,从而导致缓存污染。 ColumnOperators.regexp_replace() 在使用 flags 和实际替换表达式时也存在相同的问题。 现在,flags 表示为固定修饰符字符串,呈现为 safestrings 而不是绑定参数,并且替换表达式在“binary”元素的主要部分中建立,以便它生成适当的缓存键。

    请注意,作为此更改的一部分,ColumnOperators.regexp_match.flagsColumnOperators.regexp_replace.flags 已被修改为仅呈现为文字字符串,而以前它们被呈现为完整的 SQL 表达式,通常是绑定参数。 这些参数应始终作为纯 Python 字符串而不是 SQL 表达式构造传递; 预计在实践中不会将 SQL 表达式构造用于此参数,因此这是一个向后不兼容的更改。

    此更改还修改了生成的表达式的内部结构,对于 ColumnOperators.regexp_replace()(无论是否带有 flags)和 ColumnOperators.regexp_match()(带有 flags)。 可能已实现自己的 regexp 实现的第三方方言(在搜索中找不到此类方言,因此预计影响很小)将需要调整结构的遍历以适应。

    参考: #10042

  • [SQL] [错误]

    修复了主要在内部使用的 CacheKey 构造中的问题,其中 __ne__() 运算符未正确实现,导致在比较 CacheKey 实例时产生无意义的结果。

扩展

  • [扩展] [错误]

    修复了 mypy 插件与 mypy 1.4 一起使用的问题。

1.4.48

发布日期:2023年4月30日

ORM

  • [ORM] [错误]

    修复了关键的缓存问题,其中 aliased()hybrid_property() 表达式组合会导致缓存键不匹配,从而导致缓存键持有实际的 aliased() 对象,同时也不匹配等效的构造,从而填满缓存。

    参考: #9728

  • [ORM] [错误]

    修复了各种 ORM 特定的 getter(如 ORMExecuteState.is_column_loadORMExecuteState.is_relationship_loadORMExecuteState.loader_strategy_path 等)在 SQL 语句本身是“复合选择”(如 UNION)时会抛出 AttributeError 的错误。

    参考: #9634

  • [ORM] [错误]

    修复了在使用“与别名类的关系”功能时可能发生的无限循环,并且还在加载程序中指示递归急切加载程序(如 lazy="selectinload"),并结合另一侧的另一个急切加载程序。 循环检查已修复为包括别名类关系。

    参考: #9590

1.4.47

发布日期:2023年3月18日

SQL

  • [SQL] [错误]

    修复了错误/回归,其中在 Update.values() 方法的 Update 以及 Insert.values() 方法的 Insert(仅限 2.0 版本)中,使用与列同名的 bindparam(),在某些情况下会静默地未能遵守参数所在的 SQL 表达式,而是用同名的新参数替换该表达式,并丢弃 SQL 表达式的任何其他元素(如 SQL 函数等)。 具体情况是针对 ORM 实体而不是普通 Table 实例构建的语句,但如果使用 SessionConnection 调用该语句,则会发生这种情况。

    Update 部分的问题同时存在于 2.0 和 1.4 版本中,并且已向后移植到 1.4 版本。

    参考: #9075

  • [SQL] [错误]

    修复了 CreateSchemaDropSchema DDL 构造的字符串化问题,当在没有方言的情况下进行字符串化时,会失败并出现 AttributeError

    参考: #7664

  • [SQL] [错误]

    修复了关键的 SQL 缓存问题,其中使用 Operators.op() 自定义运算符函数不会生成适当的缓存键,从而降低 SQL 缓存的有效性。

    参考: #9506

mypy

  • [mypy] [错误]

    对 mypy 插件进行了调整,以适应使用 SQLAlchemy 1.4 时为问题 #236 sqlalchemy2-stubs 所做的一些潜在更改。 这些更改在 SQLAlchemy 2.0 中保持同步。 这些更改也向后兼容旧版本的 sqlalchemy2-stubs。

  • [mypy] [错误]

    修复了 mypy 插件中的崩溃问题,如果使用了 mapped() 装饰器的装饰器,该装饰器在具有两个以上组件的表达式中引用(例如 @Backend.mapper_registry.mapped),则可能会在 1.4 和 2.0 版本中发生崩溃。 现在忽略这种情况; 使用插件时,装饰器表达式需要是两个组件(即 @reg.mapped)。

    参考: #9102

PostgreSQL

  • [PostgreSQL] [错误]

    为 asyncpg 方言添加了支持,以便在可用时返回 SELECT 语句的 cursor.rowcount 值。 虽然这不是 cursor.rowcount 的典型用法,但其他 PostgreSQL 方言通常会提供此值。 Pull 请求由 Michael Gorven 提供。

    参考: #9048

MySQL

  • [MySQL] [用例]

    为 MySQL 索引反射添加了支持,以正确反射以前被忽略的 mysql_length 字典。

    参考: #9047

MSSQL

  • [MSSQL] [错误]

    修复了当模式名称使用方括号括起来,但名称内部没有点号时,对于诸如 Table.schema 等参数,在 SQL Server 方言的文档化行为(将显式方括号解释为标记分隔符,首次在 1.2 版本中为 #2626 添加)的上下文中无法被解释的问题,尤其是在反射操作中引用模式名称时。最初对 #2626 行为的假设是,只有当存在点号时,方括号的特殊解释才重要,但实际上,方括号不包含在所有 SQL 渲染操作的标识符名称中,因为这些不是常规或分隔标识符中的有效字符。感谢 Shan 提交的 Pull request。

    参考链接: #9133

oracle

  • [oracle] [bug]

    添加了 ROWID 到反射类型中,因为此类型可能在 “CREATE TABLE” 语句中使用。

    参考链接: #5047

1.4.46

发布日期:2023 年 1 月 3 日

general

  • [general] [change]

    现在,在首次发出任何 SQLAlchemy 2.0 弃用警告时,运行时会发出新的“超级警告”,但前提是未设置 SQLALCHEMY_WARN_20 环境变量。该警告最多只发出一次,然后设置一个布尔值以防止其第二次发出。

    此弃用警告旨在通知可能未在其 requirements 文件中设置适当约束以阻止意外升级到 SQLAlchemy 2.0 的用户,并提醒 SQLAlchemy 2.0 升级过程可用,因为首个完整的 2.0 版本预计很快发布。可以通过将环境变量 SQLALCHEMY_SILENCE_UBER_WARNING 设置为 "1" 来静默此弃用警告。

    参考链接: #8983

  • [general] [bug]

    修复了基础兼容模块调用 platform.architecture() 以检测某些系统属性的回归问题,这会导致对系统级 file 调用的过度宽泛的系统调用,在某些情况下(包括在某些安全环境配置中)该调用不可用。

    参考链接: #8995

orm

  • [orm] [bug]

    修复了 DML 语句(如 UpdateDelete)的内部 SQL 遍历中的问题,该问题会导致其他潜在问题,特别是将 lambda 语句与 ORM 更新/删除功能一起使用时会出现特定问题。

    参考链接: #9033

engine

  • [engine] [bug]

    修复了连接池中的一个长期存在的竞争条件,该条件可能在 eventlet/gevent monkeypatching 方案中与 eventlet/gevent Timeout 条件结合使用时发生。在这种情况下,由于超时而中断的连接池检出将无法清理失败状态,从而导致底层连接记录,有时甚至是数据库连接本身“泄漏”,使连接池处于无效状态,其中包含无法访问的条目。此问题最初在 SQLAlchemy 1.2 中为 #4225 识别和修复,但是该修复中检测到的故障模式未能容纳 BaseException,而不是 Exception,这阻止了 eventlet/gevent Timeout 被捕获。此外,初始池连接中的一个块也被识别出来,并通过 BaseException -> “清理失败连接”块进行了强化,以适应此位置的相同条件。非常感谢 Github 用户 @niklaus 在识别和描述这个复杂问题上做出的不懈努力。

    参考链接: #8974

sql

  • [sql] [bug]

    添加了参数 FunctionElement.column_valued.joins_implicitly,这在防止使用表值或列值函数时出现“笛卡尔积”警告时非常有用。此参数已在 #7845 中为 FunctionElement.table_valued() 引入,但是未能为 FunctionElement.column_valued() 添加。

    参考链接: #9009

  • [sql] [bug]

    修复了当表达式的类型包含 TypeEngine.bind_expression() 时,在与 literal_binds 编译器参数结合使用的“扩展”(即“IN”)参数的上下文中,SQL 编译会失败(2.0 中断言失败,1.4 中 NoneType 错误)的错误。

    参考链接: #8989

  • [sql] [bug]

    修复了 lambda SQL 功能中的一个问题,即字面值的计算类型不会考虑“比较类型”的类型强制规则,从而导致 SQL 表达式(例如与 JSON 元素等的比较)缺少类型信息。

    参考链接: #9029

postgresql

  • [postgresql] [usecase]

    添加了 PostgreSQL 类型 MACADDR8。感谢 Asim Farooq 提交的 Pull request。

    参考链接: #8393

  • [postgresql] [bug]

    修复了 PostgreSQL Insert.on_conflict_do_update.constraint 参数会接受 Index 对象,但不会将其展开为单独的索引表达式,而是在 ON CONFLICT ON CONSTRAINT 子句中呈现其名称,这不被 PostgreSQL 接受的错误;“约束名称”形式仅接受唯一约束或排除约束名称。该参数继续接受索引,但现在将其展开为组件表达式进行呈现。

    参考链接: #9023

sqlite

  • [sqlite] [bug]

    修复了 1.4.45 版本中为 #8804 添加的对 SQLite 部分索引反射的新支持导致的回归问题,其中非常旧版本的 SQLite(可能早于 3.8.9)中的 index_list pragma 命令不会返回当前预期的列数,从而在反射表和索引时引发异常。

    参考链接: #8969

tests

  • [tests] [bug]

    修复了 tox.ini 文件中的问题,其中 tox 4.0 系列中对 “passenv” 格式的更改导致 tox 无法正常工作,特别是在 tox 4.0.6 及更高版本中引发错误。

  • [tests] [bug]

    为第三方方言添加了新的排除规则 unusual_column_name_characters,对于不支持列名中包含不寻常字符(如点、斜杠或百分号),即使名称被正确引用的第三方方言,可以“关闭”此规则。

    参考链接: #9002

1.4.45

发布日期:2022 年 12 月 10 日

orm

  • [orm] [bug]

    修复了 Session.merge() 无法保留使用 relationship.viewonly 参数指示的关系属性的当前已加载内容的问题,从而破坏了使用 Session.merge() 从缓存和其他类似技术中提取完全加载的对象策略。在相关的更改中,修复了包含已加载关系的对象(即使在映射上配置为 lazy='raise')在传递给 Session.merge() 时会失败的问题;假设 Session.merge.load 参数保持默认值 True,则在合并过程中会暂停对 “raise” 的检查。

    总的来说,这是对 1.4 系列中自 #4994 以来引入的更改的行为调整,该更改将 “merge” 从默认应用于 “viewonly” 关系的级联集中移除。由于 “viewonly” 关系在任何情况下都不会持久化,因此允许它们的内容在 “merge” 期间传输不会影响目标对象的持久化行为。这使得 Session.merge() 能够正确地适用于其用例之一,即将从其他地方加载的对象添加到 Session 中,通常是为了从缓存中恢复。

    参考链接: #8862

  • [orm] [bug]

    修复了 with_expression() 中的问题,其中由从封闭 SELECT 引用的列组成的表达式在某些上下文中无法呈现正确的 SQL,在表达式的标签名称与使用 query_expression() 的属性匹配的情况下,即使 query_expression() 没有默认表达式。目前,如果 query_expression() 确实有默认表达式,则该标签名称仍用于该默认表达式,并且具有相同名称的附加标签将继续被忽略。总的来说,这种情况非常棘手,因此可能需要进一步调整。

    参考链接: #8881

engine

sql

  • [sql] [usecase]

    现在,在任何“字面绑定参数”呈现操作失败的情况下,都会抛出一个信息丰富的重新引发异常,指示值本身和正在使用的数据类型,以帮助调试语句中呈现字面参数的情况。

    参考链接: #8800

  • [sql] [bug]

    修复了一系列关于呈现的绑定参数的位置,有时甚至是身份的问题,例如用于 SQLite、asyncpg、MySQL、Oracle 和其他数据库的参数。某些编译形式无法正确维护参数的顺序,例如 PostgreSQL regexp_replace() 函数,#4123 中首次引入的 CTE 构造的“嵌套”功能,以及通过使用 FunctionElement.column_valued() 方法与 Oracle 一起形成的 selectable 表。

    参考链接: #8827

asyncio

  • [asyncio] [bug]

    AsyncResult 中移除了非功能性的 merge() 方法。此方法从未工作过,并且错误地包含在 AsyncResult 中。

    参考链接: #8952

postgresql

  • [postgresql] [bug]

    调整了 PostgreSQL 方言在从表中反射列时考虑列类型的方式,以适应可能从 PG format_type() 函数返回 NULL 的备用后端。

    参考链接: #8748

sqlite

  • [sqlite] [usecase]

    添加了对 SQLite 后端反射外键构造上可能存在的 “DEFERRABLE” 和 “INITIALLY” 关键字的支持。感谢 Michael Gorven 提交的 Pull request。

    参考链接: #8903

  • [sqlite] [usecase]

    添加了对 SQLite 方言上索引中包含的面向表达式的 WHERE 条件进行反射的支持,方式类似于 PostgreSQL 方言。感谢 Tobias Pfeiffer 提交的 Pull request。

    参考链接: #8804

  • [sqlite] [bug]

    为附加模式中的唯一约束的 SQLite 反射向后移植了一个修复程序,该修复程序在 2.0 中作为 #4379 的一小部分发布。以前,附加模式中的唯一约束会被 SQLite 反射忽略。感谢 Michael Gorven 提交的 Pull request。

    参考链接: #8866

oracle

  • [oracle] [bug]

    继续修复 1.4.43 版本中发布的 Oracle 修复 #8708,其中以下划线开头的绑定参数名称(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 表达式元素建议在 SELECT 语句中使用的 “non anon” 标签;主要示例是 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

  • [tests] [bug]

    修复了测试套件的 --disable-asyncio 参数无法实际运行 greenlet 测试,并且也无法阻止套件为整个套件使用 “wrapping” 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() 时,会导致 with_loader_criteria() 功能以及单表继承查询所需的 IN 条件无法呈现,在查询的 columns 子句未显式包含 JOIN 的左侧实体的情况下。现在,正确的实体已传输到内部生成的 Join 对象,以便正确添加针对左侧实体的条件。

    参考链接: #8721

  • [orm] [bug]

    with_loader_criteria() 选项用作添加到特定 “loader path” 的加载器选项时(例如在 Load.options() 中使用时),现在会引发信息性异常。此用法不受支持,因为 with_loader_criteria() 仅旨在用作顶级加载器选项。以前,会生成内部错误。

    参考链接: #8711

  • [orm] [bug]

    改进了 Session.get() 的 “字典模式”,以便可以在命名字典中指示引用主键属性名称的同义词名称。

    参考链接: #8753

  • [orm] [bug]

    修复了当 Mapper.polymorphic_on 参数引用未直接映射到类上的 SQL 表达式时,继承映射器的 “selectin_polymorphic” 加载无法正常工作的问题。

    参考链接: #8704

  • [orm] [bug]

    修复了在使用 Query 对象作为迭代器时,如果在迭代过程中引发用户定义的异常情况,从而导致迭代器被 Python 解释器关闭,则不会关闭底层 DBAPI 游标的问题。当使用 Query.yield_per() 创建服务器端游标时,这将导致与服务器端游标不同步的常见 MySQL 相关问题,并且在无法直接访问 Result 对象的情况下,最终用户代码无法访问游标以将其关闭。

    为了解决此问题,在迭代器方法中应用了 GeneratorExit 的捕获,这将在迭代器被中断且按定义将由 Python 解释器关闭的情况下关闭结果对象。

    作为针对 1.4 系列实施的此项更改的一部分,确保了 .close() 方法在所有 Result 实现中均可用,包括 ScalarResult, MappingResult。此项更改的 2.0 版本还包括用于 Result 类的新上下文管理器模式。

    参考链接:#8710

引擎

  • [engine] [bug] [回归]

    修复了当 PoolEvents.reset() 事件钩子在 Connection 关闭并正在将其 DBAPI 连接返回连接池的过程中,并非在所有情况下都会被调用的问题。

    该场景是当 Connection 在将连接返回池的过程中,已经对其 DBAPI 连接发出了 .rollback() 时,它会指示连接池放弃执行其自身的“重置”,以节省额外的调用方法。然而,这阻止了在此钩子中使用自定义的池重置方案,因为此类钩子的定义就是执行的操作不仅仅是调用 .rollback(),并且需要在所有情况下都被调用。这是 1.4 版本中出现的一个回归问题。

    对于 1.4 版本,PoolEvents.checkin() 仍然可用作替代事件钩子,用于自定义“重置”实现。2.0 版本将推出改进版本的 PoolEvents.reset(),它将在更多场景下被调用,例如终止 asyncio 连接,并且还会传递关于重置的上下文信息,以允许“自定义连接重置”方案以不同的方式响应不同的重置场景。

    参考链接:#8717

  • [engine] [bug]

    确保所有 Result 对象都包含 Result.close() 方法以及 Result.closed 属性,包括 ScalarResultMappingResult

    参考链接:#8710

sql

  • [sql] [bug]

    修复了阻止 literal_column() 构造在 Select 构造以及其他可能生成“匿名标签”的地方正常工作的问题,如果字面表达式包含可能干扰格式字符串的字符,例如开括号,这是由于“匿名标签”结构的实现细节造成的。

    参考链接:#8724

mssql

  • [mssql] [bug]

    修复了 Inspector.has_table() 的问题,当针对 SQL Server 方言的临时表使用时,由于在这些服务器版本上不支持的不必要的信息模式查询,会在某些 Azure 变体上失败。Pull request 由 Mike Barry 提供。

    参考链接:#8714

  • [mssql] [bug] [反射]

    修复了 Inspector.has_table() 的问题,当针对 SQL Server 方言的视图使用时,由于 1.4 系列中的回归问题,移除了对 SQL Server 上此功能的支持,会错误地返回 False。2.0 系列中不存在此问题,它使用了不同的反射架构。添加了测试支持以确保 has_table() 按照规范对视图保持工作状态。

    参考链接:#8700

oracle

  • [oracle] [bug]

    修复了绑定参数名称的问题,包括那些自动从类似命名的数据库列派生的名称,其中包含通常需要使用 Oracle 引号引起来的字符,在使用 Oracle 方言的“扩展参数”时不会被转义,从而导致执行错误。Oracle 方言用于绑定参数的常用“引号”不适用于“扩展参数”架构,因此使用了针对大量字符的转义,现在使用的是特定于 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 构造,而实际发出的查询是 DeleteUpdate。 这会干扰 “路由会话” 的方案。

    参考链接:#8614

  • [orm] [bug]

    当显式的 remote() 注解应用于本地于直接映射类的列,而引用的类不包含任何相同的表列时,ORM 配置中会发出警告。理想情况下,这应该在某个时候引发错误,因为它从映射的角度来看是不正确的。

    参考链接:#7094

  • [orm] [bug]

    当尝试在继承层次结构中配置映射类,而映射器未被赋予任何多态标识,但分配了多态鉴别器列时,会发出警告。如果这些类永远不打算直接加载,则应为抽象类。

    参考链接:#7545

  • [orm] [bug] [回归]

    修复了 1.4 版本中 contains_eager() 的回归问题,其中 joinedload() 的 “wrap in subquery” 逻辑会错误地触发用于 contains_eager() 函数和类似语句(例如,使用 distinct(), limit()offset() 的语句)的情况,这会导致在使用某些 SQL 标签名称和别名组合的查询中出现次要问题。这种 “包装” 不适用于 contains_eager(),它一直以来的约定是用户定义的 SQL 语句不会被修改,除了添加要获取的适当列。

    参考链接:#8569

  • [orm] [bug] [回归]

    修复了使用 ORM update() 和 synchronize_session='fetch' 会失败的回归问题,这是由于现在使用评估器来确定刷新对象时 SET 子句中表达式的 Python 值;如果评估器对非数值类型(如 PostgreSQL JSONB)使用数学运算符,则无法正确检测到不可评估的条件。评估器现在将数学突变运算符的使用限制为仅数值类型,但 “+” 除外,它继续适用于字符串。SQLAlchemy 2.0 可能会通过完全获取 SET 值而不是使用评估来进一步更改此行为。

    参考链接:#8507

engine

  • [engine] [bug]

    修复了在 select() 构造的列子句中混合使用 “*” 和其他显式命名的列表达式,有时会导致结果列目标将标签名称或其他非重复名称视为歧义目标的问题。

    参考链接:#8536

asyncio

  • [asyncio] [bug]

    改进了在 #8145 中添加的上下文管理器中使用的 asyncio.shield() 的实现,使得 “close” 操作被包含在 asyncio.Task 中,然后在操作进行时被强引用。这符合 Python 文档的指示,即否则任务不会被强引用。

    参考链接:#8516

postgresql

mysql

  • [mysql] [bug]

    调整了用于匹配 “CREATE VIEW” 的正则表达式,以在测试视图时更灵活地工作,不再要求中间有特殊的关键字 “ALGORITHM”,该关键字旨在是可选的,但没有正确工作。 此更改允许视图反射在 MySQL 兼容的变体(如 StarRocks)上更完整地工作。 Pull request 由 John Bodley 提供。

    参考链接:#8588

mssql

  • [mssql] [bug] [回归]

    修复了 SQL Server 隔离级别获取中的又一个回归问题(参见 #8231, #8475),这次是针对 “Microsoft Dynamics CRM Database via Azure Active Directory”,它显然完全缺少 system_views 视图。 错误捕获已扩展,在任何情况下,只要数据库连接存在,此方法都不会失败。

    参考链接:#8525

1.4.41

发布日期:2022 年 9 月 6 日

orm

  • [orm] [bug] [事件]

    修复了事件监听问题,如果创建了子类,然后子类关联了自己的监听器,则添加到超类的事件监听器会丢失。实际示例是在事件与 Session 类关联后创建的 sessionmaker 类。

    参考链接:#8467

  • [orm] [bug]

    强化了 aliased()with_polymorphic() 构造的缓存键策略。虽然没有实际语句被缓存的问题可以轻松地证明(如果存在),但这两种构造在它们的缓存键中没有包含足够的使其唯一性的因素,以至于仅对别名构造进行缓存是准确的。

    参考链接:#8401

  • [orm] [bug] [回归]

    修复了 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” 字符串考虑在内的问题,因此如果使用了多个具有不同 schema 的同名 table() 构造,则会导致缓存冲突。

    参考链接:#8441

asyncio

  • [asyncio] [bug]

    集成了对 asyncpg 的 terminate() 方法调用的支持,用于连接池回收可能超时的连接、正在垃圾回收的未优雅关闭的连接以及连接已失效的情况。 这允许 asyncpg 放弃连接,而无需等待可能导致长时间超时的响应。

    参考链接:#8419

mssql

  • [mssql] [bug] [回归]

    修复了 1.4.40 中发布的 #8231 的修复程序导致的回归问题,如果用户没有查询 dm_exec_sessionsdm_pdw_nodes_exec_sessions 系统视图的权限,则在尝试确定当前事务隔离级别时,连接会失败。

    参考链接:#8475

1.4.40

发布日期:2022 年 8 月 8 日

orm

  • [orm] [bug]

    修复了在多态 SELECT 中多次引用 CTE 可能导致构造同一 CTE 的多个 “克隆” 的问题,这将触发这两个 CTE 作为重复项。 为了解决这个问题,当这种情况发生时,会对这两个 CTE 进行深度比较,以确保它们是等效的,然后将它们视为等效的。

    参考链接:#8357

  • [orm] [bug]

    传递了唯一的 ‘*’ 参数作为 SELECT *select() 构造,无论是通过字符串、text() 还是 literal_column(),都将被解释为核心级别的 SQL 语句,而不是 ORM 级别的语句。 这是为了使 * 在扩展以匹配任意数量的列时,将导致结果中返回所有列。select() 的 ORM 级别解释需要预先知道所有 ORM 列的名称和类型,当使用 '*' 时无法实现这一点。

    如果 '*' 与其他表达式同时用于 ORM 语句,则会引发错误,因为 ORM 无法正确解释它。

    参考链接:#8235

orm declarative

  • [orm] [declarative] [bug]

    修复了设置为抽象类或 mixin 声明类的类层次结构无法在超类上声明独立列的问题,这些列随后会被正确地复制到希望在后代类上使用它们的 declared_attr 可调用对象。

    参考链接:#8190

engine

sql

  • [sql] [错误]

    调整了字符串包含函数 .contains().startswith().endswith() 的 SQL 编译,以强制使用字符串连接运算符,而不是依赖加法运算符的重载,以便将这些运算符与字节字符串等非标准用法结合使用时,仍然生成字符串连接运算符。

    参考链接: #8253

mypy

  • [mypy] [错误]

    修复了当使用 lambda 作为 Column 默认值时 mypy 插件崩溃的问题。此拉取请求由 tchapi 提供。

    参考链接: #8196

asyncio

  • [asyncio] [错误]

    在使用 AsyncConnectionAsyncSession 作为上下文管理器,并在上下文管理器完成时释放对象的情况下,在 __aexit__() 上下文管理器退出时,特别是在连接和会话释放过程中添加了 asyncio.shield()。这似乎有助于在使用其他并发库(如 anyiouvloop)进行任务取消时,连接池无法在任务取消期间正确释放连接的问题。

    参考链接: #8145

postgresql

  • [postgresql] [错误]

    修复了 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] [错误]

    修复了阻止在 使用 INSERT、UPDATE 和 ON CONFLICT(即 upsert)返回 ORM 对象 中介绍的将 DML 与 ORM 对象一起使用的新用法模式在 SQL Server pyodbc 方言中正确工作的问题。

    参考链接: #8210

  • [mssql] [错误]

    修复了 SQL Server 方言查询当前隔离级别在 Azure Synapse Analytics 上失败的问题,原因是该数据库处理错误发生后事务回滚的方式。初始查询已修改为不再依赖于捕获错误来尝试检测适当的系统视图。此外,为了更好地支持此数据库非常特定的“回滚”行为,实现了新参数 ignore_no_transaction_on_rollback,指示回滚应忽略 Azure Synapse 错误“未找到相应的事务。(111214)”,如果在 Python DBAPI 冲突中不存在事务,则会引发此错误。

    初始补丁和宝贵的调试协助由 @ww2406 提供。

    参考链接: #8231

misc

  • [错误] [types]

    修复了 TypeDecorator 在装饰 ARRAY 数据类型时,不会正确代理 __getitem__() 运算符的问题,而无需显式解决方法。

    参考链接: #7249

1.4.39

发布日期:2022 年 6 月 24 日

orm

  • [orm] [错误] [回归]

    修复了由 #8133 引起的回归问题,其中可变属性的 pickle 格式已更改,但没有回退来识别旧格式,导致 SQLAlchemy 的就地升级无法再读取先前版本的 pickle 数据。现在已添加对旧格式的检查和回退。

    参考链接: #8133

1.4.38

发布日期:2022 年 6 月 23 日

orm

  • [orm] [错误] [回归]

    修复了由 #8064 引起的回归问题,其中对列对应关系的特定检查过于宽松,导致某些 ORM 子查询(例如那些使用 PropComparator.has()PropComparator.any())与也使用旧别名功能的连接继承查询一起使用时,呈现不正确。

    参考链接: #8162

  • [orm] [错误] [sql]

    修复了当使用 ORM 执行语句时,GenerativeSelect.fetch() 不会被应用的问题。

    参考链接: #8091

  • [orm] [错误]

    修复了 with_loader_criteria() 选项无法被 pickle 的问题,当它与缓存方案结合使用,并传播到延迟加载器时,这是必要的。目前,唯一支持 pickle 的形式是将“where criteria”作为固定的模块级可调用函数传递,该函数生成 SQL 表达式。临时的“lambda”无法被 pickle,而 SQL 表达式对象通常不能直接完全 pickle。

    参考链接: #8109

engine

  • [engine] [错误]

    修复了一个弃用警告类装饰器,该装饰器阻止了 Connection 等关键对象具有正确的 __weakref__ 属性,导致 Python 标准库 inspect.getmembers() 等操作失败。

    参考链接: #8115

sql

  • [sql] [错误]

    修复了与 lambda_stmt() 相关的多个观察到的竞争条件,包括当多个并发线程最初分析新的 Python 代码对象时出现的初始“惊群”问题,这既造成了性能问题,也造成了一些内部状态损坏。此外,修复了观察到的竞争条件,该条件可能在“克隆”表达式构造时发生,该构造也由于 memoized 属性在迭代时更改 __dict__ 而在不同的线程中进行编译或以其他方式访问,特别是对于 3.10 之前的 Python 版本;特别是 lambda SQL 构造对此很敏感,因为它持久地保持对单个语句对象的引用。迭代已改进为使用 dict.copy(),无论是否使用额外的迭代。

    参考链接: #8098

  • [sql] [错误]

    增强了 Cast 和其他“包装”列构造的机制,以更充分地保留包装的 Label 构造,包括标签名称将保留在 Subquery.c 集合中。标签已经能够在 SQL 中正确呈现,在其包装的构造外部。

    参考链接: #8084

  • [sql] [错误]

    调整了为 #8056 所做的修复,该修复调整了对带有特殊字符的绑定参数名称的转义,以便在 SQL 编译步骤之后转换转义的名称,这破坏了 FAQ 上发布的演示如何将参数名称合并到编译后的 SQL 字符串的字符串输出中的配方。此更改恢复了来自 compiled.params 的转义名称,并向 SQLCompiler.construct_params() 添加了一个名为 escape_names 的条件参数,该参数默认为 True,默认情况下恢复旧的行为。

    参考链接: #8113

schema

  • [schema] [错误]

    修复了涉及 Table.include_columnsTable.resolve_fks 参数在 Table 上的错误;这些很少使用的参数显然不适用于引用外键约束的列。

    在第一种情况下,引用外键的未包含列仍然会尝试创建 ForeignKey 对象,在反射中尝试解析外键约束的列时产生错误;引用跳过列的外键约束现在从表反射过程中省略,方式与 IndexUniqueConstraint 对象在相同条件下发生的情况相同。但是,不会产生警告,因为我们可能希望在 2.0 中删除所有约束的 include_columns 警告。

    在后一种情况下,尽管存在 resolve_fks=False,但在找不到 FK 相关表的情况下,表别名或子查询的生成将失败;逻辑已修复,以便在找不到相关表时,ForeignKey 对象仍然代理到别名表或子查询(这些 ForeignKey 对象通常用于生成连接条件),但它会发送一个标志,表明它不可解析。然后,别名表/子查询将正常工作,但例外情况是它不能用于自动生成连接条件,因为外键信息丢失。这已经是使用非反射方法(例如,连接来自不同 MetaData 集合的 Table 对象)生成的此类外键约束的行为。

    参考链接: #8100, #8101

  • [schema] [错误] [mssql]

    修复了使用 Numeric 数据类型的 IDENTITY 列的 Table 对象在尝试协调“自动递增”列时会产生错误的问题,从而阻止了使用 Column.autoincrement 参数构造 Column,以及在尝试调用 Insert 构造时发出错误。

    参考链接: #8111

extensions

  • [extensions] [错误]

    修复了 Mutable 中的错误,其中 ORM 映射实例的 pickle 和 unpickle 操作不会正确地为包含多个启用 Mutable 的属性的映射恢复状态。

    参考链接: #8133

1.4.37

发布日期:2022 年 5 月 31 日

orm

  • [orm] [错误]

    修复了使用包含针对已映射列属性的子查询的 column_property() 构造不会将 ORM 编译行为正确应用于子查询的问题,包括为单表继承表达式添加的“IN”表达式将无法包含在内。

    参考链接: #8064

  • [orm] [错误]

    修复了在要选择的列集发生更改的情况下,例如当使用 Select.with_only_columns() 时,ORM 结果会将不正确的键名称应用于返回的 Row 对象的问题。

    参考链接: #8001

  • [orm] [错误] [oracle] [postgresql]

    修复了一个 bug,可能是 1.3 版本的回归,其中使用需要绑定参数转义的列名,更具体地说,当使用 Oracle 时,列名需要引号,例如那些以下划线开头的列名,或者在不太常见的情况下,某些 PostgreSQL 驱动程序在使用包含百分号的列名时,如果版本控制列本身具有这样的名称,则会导致 ORM 版本控制功能无法正常工作,因为 ORM 假定某些绑定参数命名约定被引号干扰。此问题与 #8053 相关,本质上是修改了修复此问题的方法,修改了创建通用绑定参数名称引号的初始实现的原始问题 #5653

    参考链接: #8056

engine

  • [engine] [错误] [tests]

    修复了在 #7612 中实现的对日志“stacklevel”的支持需要调整才能与最近发布的 Python 3.11.0b1 一起工作的问题,同时也修复了测试此功能的单元测试。

    参考链接: #8019

sql

  • [sql] [错误] [postgresql] [sqlite]

    修复了 PostgreSQL Insert.on_conflict_do_update() 方法和 SQLite Insert.on_conflict_do_update() 方法都无法正确容纳具有单独“.key”的列的问题,当在传递给 Insert.on_conflict_do_update.set_ 的字典中使用其键名指定列时,以及如果 Insert.excluded 集合直接用作字典时。

    参考链接: #8014

  • [sql] [错误]

    对于 Insert.from_select() 正在传递“复合选择”对象(如 UNION),但 INSERT 语句需要附加额外的列以支持来自表元数据的 Python 端或显式 SQL 默认值的情况,会引发信息性错误。在这种情况下,应传递复合对象的子查询。

    参考链接: #8073

  • [sql] [错误]

    修复了在表达式中使用 bindparam(),但未给出显式数据或类型的情况下,当在诸如使用 Comparator.any()Comparator.all() 的表达式中使用时,可能会被强制转换为不正确类型的问题。

    参考链接: #7979

  • [sql] [错误]

    如果两个单独的 BindParameter 对象共享相同的名称,但一个在“扩展”上下文(通常是 IN 表达式)中使用,而另一个不是,则会引发信息性错误;不支持在两种不同用法样式中混合使用相同的名称,通常应在要接收 IN 表达式外部的列表值的参数上设置 expanding=True 参数(其中默认设置 expanding)。

    参考链接: #8018

mysql

  • [mysql] [错误]

    进一步调整 MySQL PyODBC 方言以实现完全连接,尽管 #7871 中进行了修复,但之前仍然无法工作。

    参考链接: #7966

  • [mysql] [错误]

    为 MySQL 错误 4031 添加了断开连接代码,该错误在 MySQL >= 8.0.24 中引入,表示连接空闲超时已过。特别是,这修复了预 ping 无法在超时连接上重新连接的问题。拉取请求由 valievkarim 提供。

    参考链接: #8036

mssql

  • [mssql] [错误]

    修复了密码以“{”开头会导致登录失败的问题。

    参考链接: #8062

  • [mssql] [错误] [reflection]

    在使用 MSSQL 反射表列时,显式指定排序规则以防止“排序规则冲突”错误。

    参考链接: #8035

oracle

  • [oracle] [usecase]

    为 Oracle 断开连接处理添加了两个新的错误代码,以支持 Oracle 发布的新“python-oracledb”驱动程序的早期测试。

    参考链接: #8066

  • [oracle] [错误]

    修复了 SQL 编译器问题,其中绑定参数的“绑定处理”函数不会正确应用于绑定值,如果绑定参数的名称是“转义的”。具体而言,这适用于 Oracle,当 Column 的名称本身需要引号时,这样需要引号的名称然后用于 DML 语句中生成的绑定参数,并且正在使用的数据类型需要绑定处理,例如 Enum 数据类型。

    参考链接: #8053

1.4.36

发布日期:2022 年 4 月 26 日

orm

  • [orm] [错误] [回归]

    修复了回归问题,其中在 1.4.33 版本中发布的 #7861 所做的更改,将 Insert 构造部分识别为启用 ORM 的语句,但没有将正确的 mapper/映射表状态正确传输到 Session,导致 Session.get_bind() 方法对于使用 Session.binds 参数绑定到引擎和/或连接的 Session 失败。

    参考链接: #7936

orm declarative

  • [orm] [declarative] [错误]

    修改了 DeclarativeMeta 元类,以将 cls.__dict__ 传递到声明式扫描过程中以查找属性,而不是传递给类型 __init__() 方法的单独字典。这允许用户定义的基类在 __init_subclass__() 中添加属性时按预期工作,因为 __init_subclass__() 只能影响 cls.__dict__ 本身,而不能影响其他字典。从技术上讲,这是 1.3 版本的回归,其中正在使用 __dict__

    参考链接: #7900

engine

  • [engine] [错误]

    修复了 C 扩展中的内存泄漏问题,当在 Python 3 下调用 Row 的命名成员时可能会发生该问题,当成员不存在时;特别是,这可能在 NumPy 转换期间发生,当它尝试调用诸如 .__array__ 之类的成员时,但问题围绕着 Row 对象抛出的任何 AttributeError。此问题不适用于已过渡到 Cython 的 2.0 版本。非常感谢 Sebastian Berg 识别出问题。

    参考: #7875

  • [engine] [bug]

    添加了一个关于 Result.columns() 方法中存在 bug 的警告,当为索引传递 0 时,结合将返回单个 ORM 实体的 Result,这表明 Result.columns() 的当前行为在此情况下是错误的,因为 Result 对象将产生标量值而不是 Row 对象。此问题将在 2.0 版本中修复,对于依赖当前错误行为的代码来说,这将是一个向后不兼容的更改。希望接收标量值集合的代码应使用 Result.scalars() 方法,该方法将返回一个新的 ScalarResult 对象,该对象产生非行标量对象。

    参考: #7953

schema

  • [schema] [bug]

    修复了当外键约束设置为 ForeignKey 对象而不是显式的 ForeignKeyConstraint 对象时,使用 referred_column_0 命名约定键的 ForeignKeyConstraint 命名约定不起作用的 bug。由于此更改利用了 2.0 版本中的一些修复程序的向后移植,因此还修复了一个鲜为人知的功能,该功能可能已经损坏多年,即 ForeignKey 对象可以通过仅使用表的名称来引用被引用表,而无需使用列名,如果被引用列的名称与引用列的名称相同。

    referred_column_0 命名约定键以前仅使用 ForeignKeyConstraint 对象进行测试,而没有使用 ForeignKey 对象进行测试,并且此 bug 揭示了除非所有外键约束都使用 ForeignKeyConstraint ,否则该功能从未正确工作。此 bug 可以追溯到为 #3989 引入的功能的最初引入。

    参考: #7958

asyncio

  • [asyncio] [bug]

    修复了异步适配的事件处理程序内部 contextvar.ContextVar 对象的处理。以前,应用于 ContextVar 的值在非 awaitable 代码内部调用 awaitables 的特定情况下不会传播。

    参考: #7937

postgresql

  • [postgresql] [bug]

    修复了 PostgreSQL 上 ARRAY 数据类型与 Enum 结合使用的 bug,其中使用 .any().all() 方法渲染 SQL ANY() 或 ALL(),给定 Python 枚举的成员作为参数,将在所有驱动程序上产生类型适配失败。

    参考: #6515

  • [postgresql] [bug]

    为 PostgreSQL UUID 类型对象实现了 UUID.python_type 属性。该属性将根据 UUID.as_uuid 参数设置返回 struuid.UUID。以前,此属性未实现。拉取请求由 Alex Grönholm 提供。

    参考: #7943

  • [postgresql] [bug]

    修复了 psycopg2 方言中使用 create_engine.pool_pre_ping 参数时的一个问题,该问题会导致用户配置的 AUTOCOMMIT 隔离级别被 “ping” 处理程序意外重置。

    参考: #7930

mysql

  • [mysql] [bug] [regression]

    修复了 1.4.32 版本中 #7518 的修复程序导致的未经测试的 MySQL PyODBC 方言中的回归,其中在首次连接时错误地传播了一个参数,导致 TypeError

    参考: #7871

tests

  • [tests] [bug]

    对于第三方方言,修复了 SimpleUpdateDeleteTest 套件测试中缺少的 requirement,该 requirement 未检查目标方言上是否有一个工作的 “rowcount” 函数。

    参考: #7919

1.4.35

发布日期:2022 年 4 月 6 日

sql

1.4.34

发布日期:2022 年 3 月 31 日

orm

postgresql

  • [postgresql] [bug]

    缩减了为 #6581 所做的修复,其中 psycopg2 的 “executemany values” 模式对于所有 “ON CONFLICT” 样式的 INSERT 均被禁用,使其不适用于 “ON CONFLICT DO NOTHING” 子句,该子句不包含任何参数,并且对于 “executemany values” 模式是安全的。“ON CONFLICT DO UPDATE” 仍然被阻止使用 “executemany values”,因为 DO UPDATE 子句中可能存在其他无法批处理的参数(这是 #6581 修复的原始问题)。

    参考: #7880

1.4.33

发布日期:2022 年 3 月 31 日

orm

  • [orm] [usecase]

    with_polymorphic() 函数添加了 with_polymorphic.adapt_on_names,它允许针对备用 selectable 声明多态加载(通常使用具体映射),该 selectable 将仅根据列名适应原始映射的 selectable。

    参考: #7805

  • [orm] [usecase]

    添加了新的属性 UpdateBase.returning_column_descriptionsUpdateBase.entity_description,以允许检查作为 Insert, UpdateDelete 构造的一部分安装的 ORM 属性和实体。 Select.column_descriptions 访问器现在也已为仅 Core 的 selectables 实现。

    参考: #7861

  • [orm] [bug] [regression]

    修复了 “dynamic” 加载器策略中的回归,其中在关系查询中存在 “secondary” 表,并且映射针对诸如 “with polymorphic” 之类的复杂内容时,Query.filter_by() 方法不会被赋予适当的实体进行过滤。

    参考: #7868

  • [orm] [bug]

    修复了 composite() 属性无法与连接表继承的 selectin_polymorphic() 加载器策略结合使用的 bug。

    参考: #7801

  • [orm] [bug] [performance]

    ORM 内存使用方面的改进,移除了在创建表达式对象的副本时通常存储的一组重要的中间表达式对象。这些克隆已大大减少,从而将 ORM 映射存储在内存中的表达式对象总数减少了约 30%。

    参考: #7823

  • [orm] [bug]

    修复了 selectin_polymorphic() 加载器选项不适用于没有固定 “polymorphic_on” 列的连接继承映射器的 issue。此外,还为此构造添加了更广泛的使用模式的测试支持。

    参考: #7799

  • [orm] [bug]

    修复了 with_loader_criteria() 函数中的 bug,其中加载器条件不会应用于在父对象的刷新操作范围内调用的连接急切加载。

    参考: #7862

  • [orm] [bug]

    修复了在映射到 UNION 的情况下,Mapper 会过度简化用户定义的 Mapper.primary_key 参数的问题,其中对于某些 SELECT 条目,两列本质上是等效的,但在另一个条目中,它们不是等效的,例如在递归 CTE 中。此处的逻辑已更改为接受给定的用户定义的 PK,其中列将与映射的 selectable 相关,但不再 “简化”,因为这种启发式方法无法适应所有情况。

    参考: #7842

engine

  • [engine] [usecase]

    添加了新参数 Engine.dispose.close,默认为 True。当为 False 时,引擎处置完全不触及旧池中的连接,而只是删除池并替换它。此用例是为了当原始池从父进程传输时,父进程可以继续使用这些连接。

    参考: #7815, #7877

  • [engine] [bug]

    进一步阐明了连接级别的日志记录,以指示当使用 AUTOCOMMIT 隔离级别时,BEGIN、ROLLBACK 和 COMMIT 日志消息实际上并不指示真实事务;消息传递已扩展到包括 BEGIN 消息本身,并且消息传递也已修复,以适应直接使用 Engine 级别的 create_engine.isolation_level 参数的情况。

    参考: #7853

sql

  • [sql] [usecase]

    FunctionElement.table_valued() 构造添加了新参数 FunctionElement.table_valued.joins_implicitly。此参数指示提供的表值函数将自动执行与引用表的隐式连接。这有效地禁用了 “from linting” 功能,例如 “笛卡尔积” 警告,避免由于此参数的存在而触发。可用于诸如 func.json_each() 之类的函数。

    参考: #7845

  • [sql] [bug]

    bindparam.literal_execute 参数现在参与 bindparam() 的缓存生成,因为它更改了编译器生成的 sql 字符串。以前使用了正确的绑定值,但在后续执行同一查询时会忽略 literal_execute

    参考: #7876

  • [sql] [bug] [regression]

    修复了由 #7760 引起的回归,其中 TextualSelect 的新功能未在编译器中完全正确实现,从而导致在 CTE 和文本语句结合使用时,组合的 INSERT 构造(例如 “INSERT FROM SELECT” 和 “INSERT…ON CONFLICT”)出现问题。

    参考: #7798

schema

sqlite

  • [sqlite] [bug] [reflection]

    修复了如果使用引号创建 SQLite 下的 CHECK 约束名称(当名称使用混合大小写或特殊字符时就是这种情况),则无法反映该名称的 bug。

    参考: #5463

mssql

  • [mssql] [bug] [regression]

    修复了由 #7160 引起的回归,其中外键反射与低兼容性级别设置(兼容性级别 80:SQL Server 2000)结合使用会导致 “Ambiguous column name” 错误。补丁由 @Lin-Your 提供。

    参考: #7812

misc

  • [bug] [ext]

    改进了在 association_proxy() 构造尝试在类级别访问目标属性且此访问失败的情况下引发的错误消息。此处的特定用例是代理到不包含工作类级别实现的混合属性时。

    参考: #7827

1.4.32

发布日期:2022 年 3 月 6 日

orm

  • [orm] [bug] [regression]

    修复了回归,其中当 INSERT 静默失败而未实际插入行(例如来自触发器)时要引发的 ORM 异常将无法到达,原因是由于缺少主键值而提前引发了运行时异常,因此引发了信息量不足的异常,而不是正确的异常。对于 1.4 及更高版本,为此情况添加了一个新的 FlushError,该异常比 1.3 版本的先前 “null identity” 异常更早引发,因为实际 INSERT 的行数与预期不符的情况在 1.4 中更为关键,因为它会阻止批量处理多个对象正常工作。这与新获取的主键被获取为 NULL 的情况不同,后者继续引发现有的 “null identity” 异常。

    参考: #7594

  • [orm] [bug]

    修复了在 relationship() 中为类名使用完全限定路径,但路径标记的名称不正确(非第一个标记)时,将无法引发信息性错误,而是在稍后的步骤中随机失败的问题。

    参考: #7697

engine

  • [engine] [bug]

    调整了关键 SQLAlchemy 组件(包括 Engine, Connection)的日志记录,以建立适当的堆栈级别参数,以便在自定义日志格式化程序中使用 Python 日志记录标记 funcNamelineno 时,将报告正确的信息,这在过滤日志输出时可能很有用;在 Python 3.8 及更高版本上受支持。拉取请求由 Markus Gerstel 提供。

    参考: #7612

sql

  • [sql] [bug]

    修复了与类型相关的错误消息,这些消息对于元组值会失败,原因是字符串格式化语法,包括不支持的文字值和无效的布尔值的编译。

    参考: #7721

  • [sql] [bug] [mysql]

    修复了 MySQL SET 数据类型以及通用 Enum 数据类型中的问题,其中 __repr__() 方法不会在字符串输出中渲染所有可选参数,从而影响这些类型在 Alembic autogenerate 中的使用。MySQL 的拉取请求由 Yuki Nishimine 提供。

    参考: #7598, #7720, #7789

  • [sql] [bug]

    现在,如果指定了 Enum.length 参数,但未同时将 Enum.native_enum 指定为 False,Enum 数据类型将发出警告,因为在这种情况下该参数会被静默忽略,尽管 Enum 数据类型仍然会在没有原生 ENUM 数据类型(例如 SQLite)的后端上渲染 VARCHAR DDL。此行为可能会在未来版本中更改,以便 “length” 对于所有非原生 “enum” 类型都有效,而与 “native_enum” 设置无关。

  • [sql] [bug]

    修复了在 TextualSelect 实例上调用 HasCTE.add_cte() 方法时,SQL 编译器无法识别的问题。此修复还向 TextualSelect 添加了更多类似 “SELECT” 的编译器行为,包括可以容纳 DML CTE(例如 UPDATE 和 INSERT)。

    参考文献: #7760

asyncio

  • [asyncio] [bug]

    修复了在某些使用异步引擎进行事件监听的类中,没有引发描述性错误消息的问题,而这些类应该使用同步引擎实例。

  • [asyncio] [bug]

    修复了当使用 Connection.execution_options.stream_results 执行选项时,AsyncSession.execute() 方法未能引发信息性异常的问题,这与使用 asyncio 调用样式时的同步样式 Result 对象不兼容,因为获取更多行的操作需要等待。现在,在这种情况下会引发异常,就像在使用 AsyncConnection.execute() 方法时使用 Connection.execution_options.stream_results 选项时已经引发异常一样。

    此外,为了提高对状态敏感的数据库驱动程序(如 asyncmy)的稳定性,现在在此错误条件下会关闭游标;以前,使用 asyncmy 方言时,连接会进入无效状态,并保留未使用的服务器端结果。

    参考文献: #7667

postgresql

mysql

  • [mysql] [bug] [regression]

    修复了由 #7518 引起的回归问题,其中将语法 “SHOW VARIABLES” 更改为 “SELECT @@” 破坏了与 MySQL 5.6 之前版本(包括早期的 5.0 版本)的兼容性。虽然这些是非常旧的 MySQL 版本,但兼容性更改并非计划之内,因此已恢复版本特定的逻辑,以便回退到 MySQL 服务器版本 < 5.6 的 “SHOW VARIABLES”。

    参考文献: #7518

mariadb

  • [mariadb] [bug] [regression]

    修复了 mariadbconnector 方言自 mariadb connector 1.0.10 以来的回归问题,其中 DBAPI 不再预缓冲 cursor.lastrowid,导致使用 ORM 插入对象时出错,并导致 CursorResult.inserted_primary_key 属性不可用。现在,该方言会主动获取此值,以适用于它的情况。

    参考文献: #7738

sqlite

  • [sqlite] [usecase]

    添加了对反射 SQLite 内联唯一约束的支持,其中列名使用 SQLite “转义引号” []` 格式化,数据库在生成列名时会丢弃这些引号。

    参考文献: #7736

  • [sqlite] [bug]

    修复了 SQLite 唯一约束反射无法检测到列内联 UNIQUE 约束的问题,其中列名包含下划线。

    参考文献: #7736

oracle

  • [oracle] [bug]

    修复了 Oracle 方言中的问题,其中当作为绑定参数写入时需要引号的列名(例如 "_id")无法正确跟踪 Python 生成的默认值,因为绑定参数重写缺少此值,从而导致引发 Oracle 错误。

    参考文献: #7676

  • [oracle] [bug] [regression]

    添加了对解析来自 cx_Oracle 异常对象(如 DPI-1080DPI-1010)的 “DPI” 错误代码的支持,自 cx_Oracle 8.3 起,这两个错误代码都表示断开连接的情况。

    参考文献: #7748

tests

  • [tests] [bug]

    改进了测试套件与 pytest 的集成,使得 “warnings” 插件(如果手动启用)不会干扰测试套件,以便第三方可以启用 warnings 插件或使用 -W 参数,而 SQLAlchemy 的测试套件将继续通过。此外,现代化了 “pytest-xdist” 插件的检测,以便可以使用 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 全局禁用插件,而不会在 xdist 仍然安装的情况下破坏测试套件。将弃用警告升级为错误的警告过滤器现在已本地化为 SQLAlchemy 特定的警告,或 SQLAlchemy 特定来源中的通用 Python 弃用警告,以便来自 pytest 插件的非 SQLAlchemy 弃用警告也不应影响测试套件。

    参考文献: #7599

  • [tests] [bug]

    修正了关于如何配置测试发现的默认 pytest 配置,以修复在 SQLAlchemy 检出位于名为 “test” 的超目录的绝对路径中的特定情况下,测试套件无法正确配置警告并尝试将示例套件加载为测试的问题。

    参考文献: #7045

1.4.31

发布日期:2022 年 1 月 20 日

orm

  • [orm] [bug]

    修复了 Session.bulk_save_objects() 中的问题,其中当 preserve_order 参数设置为 False 时发生的排序会部分地在 Mapper 对象上进行排序,这在 Python 3.11 中被拒绝。

    参考文献: #7591

postgresql

  • [postgresql] [bug] [regression]

    修复了回归问题,其中 #7148 中修复 PostgreSQL 中 ENUM 处理的更改破坏了 ENUM 空数组的用例,阻止了在获取结果时正确处理包含空数组的行。

    参考文献: #7590

mysql

  • [mysql] [bug] [regression]

    修复了 asyncmy 方言中由 #7567 引起的回归问题,其中由于 CI 测试中未正确包含 asyncmy 方言,因此删除 PyMySQL 依赖项破坏了二进制列。

    参考文献: #7593

mssql

  • [mssql]

    添加了在使用 MSSQL 中的 VARBINARY(max) 时对 FILESTREAM 的支持。

    另请参阅

    VARBINARY.filestream

    参考文献: #7243

1.4.30

发布日期:2022 年 1 月 19 日

orm

  • [orm] [bug]

    修复了在深度多级继承中,连接继承加载附加属性功能的问题,其中不包含任何列的中间表不会包含在连接的表中,而是将这些表链接到其主键标识符。虽然这可以正常工作,但在 1.4 中仍然开始产生笛卡尔积编译器警告。逻辑已更改,以便无论如何都包含这些中间表。虽然这确实在查询中包含了一些技术上不必要的附加表,但这仅发生在具有没有非主键列的中间表的深度 3 级以上继承的非常不寻常的情况下,因此预期的性能影响可以忽略不计。

    参考文献: #7507

  • [orm] [bug]

    修复了对于同一类多次调用 registry.map_imperatively() 会产生意外错误,而不是信息性错误(目标类已映射)的问题。此行为与 mapper() 函数的行为不同,后者已经报告了信息性消息。

    参考文献: #7579

  • [orm] [bug] [asyncio]

    AsyncSession 类添加了缺少的 AsyncSession.invalidate() 方法。

    参考文献: #7524

  • [orm] [bug] [regression]

    修复了 1.4.23 中出现的回归问题,该问题可能导致加载程序选项在某些情况下被错误处理,尤其是在将连接表继承与 polymorphic_load="selectin" 选项以及关系延迟加载结合使用时,从而导致 TypeError

    参考文献: #7557

  • [orm] [bug] [regression]

    修复了 ORM 回归问题,其中如果现有构造是针对固定表,则对现有 aliased() 构造调用 aliased() 函数将无法生成正确的 SQL。此修复允许忽略原始 aliased() 构造,如果它仅针对现在要替换的表。当针对子查询的 aliased() 构造无选择参数地构造 aliased() 时,它也允许正确的行为,以创建该子查询的别名(即更改其名称)。

    aliased() 的嵌套行为对于外部 aliased() 对象针对子查询的情况仍然有效,该子查询又引用内部 aliased() 对象。这是一个相对较新的 1.4 功能,有助于适应以前由已弃用的 Query.from_self() 方法提供的用例。

    参考文献: #7576

  • [orm] [bug]

    修复了当传递 None 值或不传递任何参数时,Select.correlate_except() 方法在使用 ORM 上下文(即,将 ORM 实体作为 FROM 子句传递)时不会关联任何元素的问题,而不是像使用仅核心构造时那样导致所有 FROM 元素都被视为“关联”。

    参考文献: #7514

  • [orm] [bug] [regression]

    修复了 1.3 中的回归问题,其中如果 “subqueryload” 加载程序策略用于针对使用 Query.from_statement()Select.from_statement() 的查询,则 “subqueryload” 加载程序策略将失败并出现堆栈跟踪。由于 subqueryload 需要修改原始语句,因此它与 “from_statement” 用例不兼容,尤其是对于针对 text() 构造的语句。现在的行为与 1.3 和以前的版本相同,即加载程序策略会静默降级为不用于此类语句,通常会回退到使用 lazyload 策略。

    参考文献: #7505

sql

  • [sql] [bug] [postgresql]

    为系统添加了额外的规则,该规则确定来自 Python 字面量的 TypeEngine 实现,以对类型应用二级调整,以便带有或不带有 tzinfo 的 Python datetime 可以设置返回的 DateTime 对象以及 Time 上的 timezone=True 参数。这有助于在类型敏感的 PostgreSQL 方言(如 asyncpg、psycopg3(仅限 2.0))上的一些往返场景。

    参考文献: #7537

  • [sql] [bug]

    当将方法对象传递给 SQL 构造时,添加了一条信息性错误消息。以前,当传递此类可调用对象时,就像处理方法链接的 SQL 构造时常见的排版错误一样,它们被解释为要在编译时调用的 “lambda SQL” 目标,这将导致静默失败。由于此功能并非旨在与方法一起使用,因此现在拒绝方法对象。

    参考文献: #7032

mypy

  • [mypy] [bug]

    修复了在 id 守护程序模式下运行时由内部 mypy Var 实例上缺少属性引起的 Mypy 崩溃。

    参考文献: #7321

asyncio

  • [asyncio] [usecase]

    为 asyncio 驱动程序使用的 DBAPI 连接接口添加了新方法 AdaptedConnection.run_async(),该方法允许在无法使用 await 关键字的同步样式函数(例如 SQLAlchemy 事件处理函数)中直接对底层 “驱动程序” 连接调用方法。该方法类似于 AsyncConnection.run_sync() 方法,后者将异步样式调用转换为同步样式。此方法对于需要在首次创建驱动程序连接时在驱动程序连接上调用可等待方法(例如连接池 on-connect 处理程序)的情况非常有用。

    参考文献: #7580

postgresql

  • [postgresql] [usecase]

    UUID 数据类型添加了字符串渲染,以便对使用此类型的 “literal_binds” 进行字符串化处理的语句将为 PostgreSQL 后端渲染适当的字符串值。感谢 José Duarte 的 pull request。

    参考文献: #7561

  • [postgresql] [bug] [asyncpg]

    改进了对 asyncpg 处理 TIME WITH TIMEZONE 的支持,该支持尚未完全实现。

    参考文献: #7537

  • [postgresql] [bug] [mssql] [reflection]

    修复了覆盖索引的反射,以将 include_columns 报告为反射索引字典中 dialect_options 条目的一部分,从而使从 reflection->create 的往返完整。为了向后兼容性,包含的列仍然存在于 include_columns 键下。

    参考文献: #7382

  • [postgresql] [bug]

    修复了需要转义字符的枚举值数组的处理。

    参考文献: #7418

mysql

  • [mysql] [change]

    在 MySQL 和 MariaDB 方言初始化中,将 SHOW VARIABLES LIKE 语句替换为等效的 SELECT @@variable。这应避免由 SHOW VARIABLES 引起的互斥锁争用,从而提高初始化性能。

    参考文献: #7518

  • [mysql] [bug]

    从 asyncmy 方言中删除了对 PyMySQL 的不必要依赖。感谢 long2ice 的 pull request。

    参考文献: #7567

1.4.29

发布日期:2021 年 12 月 22 日

orm

  • [orm] [usecase]

    添加了 Session.get.execution_options 参数,该参数以前在 Session.get() 方法中缺失。

    参考文献: #7410

  • [orm] [bug]

    修复了新的 “加载程序条件” 方法 PropComparator.and_() 中的问题,其中对子查询对象的 .c. 集合成员的列使用加载程序策略(如 selectinload()),其中子查询将动态添加到语句的 FROM 子句中,这会导致 SQL 语句缓存中子查询内的参数值陈旧,因为加载程序策略用于在执行时替换参数的过程将无法容纳以这种形式接收的子查询。

    参考文献: #7489

  • [orm] [bug]

    修复了在使用 with_loader_criteria() 功能或加载程序策略中的 PropComparator.and_() 方法时,结合引用正被条件选项更改或由加载程序策略加载的同一实体的子查询,ORM 语句编译中可能发生的递归溢出。已添加对以递归方式遇到相同加载程序条件选项的检查,以适应这种情况。

    参考文献: #7491

  • [orm] [bug] [mypy]

    修复了由 as_declarative() 生成的声明性基类的 __class_getitem__() 方法会导致无法访问类属性(例如 __table__)的问题,对于类层次结构中使用 Generic[T] 样式类型声明的情况。这是对 #7368__class_getitem__() 的基本添加的延续。感谢 Kai Mueller 的 pull request。

    参考文献: #7368, #7462

  • [orm] [bug] [regression]

    修复了与缓存相关的问题,其中使用 lazyload(aliased(A).bs).joinedload(B.cs) 形式的加载程序选项将无法导致为查询缓存后的运行调用 joinedload,原因是应用于为使用 aliased() 的引导实体查询加载的对象的选项/对象路径不匹配。

    参考文献: #7447

engine

  • [engine] [bug]

    更正了在尝试写入 Row 类(它是不可变的)上的属性时引发的 AttributeError 的错误消息。之前的消息声称列不存在,这是误导性的。

    参考文献: #7432

  • [engine] [bug] [regression]

    修复了用于解析 URL 字符串的 make_url() 函数中的回归问题,其中如果使用 Python 2 u'' 字符串,则查询字符串解析将进入递归溢出。

    参考文献: #7446

mypy

  • [mypy] [bug]

    修复了 mypy 回归问题,其中 mypy 0.930 版本的发布为 “命名类型” 的格式添加了额外的内部检查,要求它们是完全限定且可定位的。这破坏了 SQLAlchemy 的 mypy 插件,引发了断言错误,因为使用了诸如 __builtins__ 和其他不可定位或不合格名称之类的符号,这些符号以前没有引发任何断言。

    参考文献: #7496

asyncio

  • [asyncio] [usecase]

    添加了 async_engine_config() 函数以从配置字典创建异步引擎。这在其他方面与 engine_from_config() 的行为相同。

    参考文献: #7301

mariadb

  • [mariadb] [bug]

    更正了为 mariadbconnector 方言的 “is_disconnect” 检查检查的错误类,该方言在由于常见的 MySQL/MariaDB 错误代码(例如 2006)而发生的断开连接时失败;DBAPI 似乎当前使用 mariadb.InterfaceError 异常类来处理断开连接错误(例如错误代码 2006),该异常类已添加到检查的类列表中。

    参考文献: #7457

tests

  • [测试] [缺陷] [回归]

    修复了测试套件中的一个回归问题,其中名为 CompareAndCopyTest::test_all_present 的测试在某些平台上会由于检测到额外的测试工件而失败。此拉取请求由 Nils Philippsen 提供。

    参考: #7450

1.4.28

发布日期:2021 年 12 月 9 日

平台

  • [平台] [缺陷]

    Python 3.10 已弃用 “distutils”,转而明确使用 “setuptools”,详见 PEP 632;SQLAlchemy 的 setup.py 已相应地替换了导入。然而,由于 setuptools 本身直到 2021 年 11 月的版本 59.0.1 才添加了 pep-632 中提到的替换符号,setup.py 仍然具有对 distutils 的回退导入,因为 SQLAlchemy 1.4 目前没有硬性的 setuptools 版本要求。SQLAlchemy 2.0 预计将使用完整的 PEP 517 安装布局,这将预先指示合适的 setuptools 版本。

    参考: #7311

ORM

  • [ORM] [缺陷] [扩展]

    修复了在相关类也使用 ORM 多态加载的情况下,PropComparator.any() 方法在 relationship() 上使用的内部克隆问题,如果在 any() 操作的条件中使用了相关多态类上的混合属性,则会失败。

    参考: #7425

  • [ORM] [缺陷] [mypy]

    修复了 as_declarative() 装饰器和用于生成声明式基类的类似函数不会从给定的超类复制 __class_getitem__() 方法的问题,这阻止了 pep-484 泛型与 Base 类的结合使用。此拉取请求由 Kai Mueller 提供。

    参考: #7368

  • [ORM] [缺陷] [回归]

    修复了 ORM 回归问题,其中在 #1763 中添加的 “在未过期时运行急切加载器” 的新行为会导致加载器选项错误被不适当地引发,对于使用单个 QuerySelect 加载多种实体类型的情况,以及仅适用于其中一种实体类型的加载器选项(如 joinedload()),并且稍后对象将从过期状态刷新,其中加载器选项将尝试应用于不匹配的对象类型,然后引发异常。现在,对于这种情况,此不匹配检查将绕过引发错误。

    参考: #7318

  • [ORM] [缺陷]

    用户定义的 ORM 选项(例如 dogpile.caching 示例中所示的子类化 UserDefinedOption 的选项),根据定义,在每次语句执行时都会处理,并且不需要被视为语句缓存键的一部分。基类 ExecutableOption 的缓存已修改,使其不再是 HasCacheKey 子类,因此用户定义的选项对象的存在不会产生禁用语句缓存的不良副作用。现在,只有 ORM 特定的加载器和条件选项(均为 SQLAlchemy 内部选项)参与缓存系统。

    参考: #7394

  • [ORM] [缺陷]

    修复了使用 synonym() 和可能其他类型的 “代理” 属性的映射在所有情况下都无法成功为其 SQL 语句生成缓存键的问题,从而导致这些语句的性能下降。

    参考: #7394

  • [ORM] [缺陷]

    修复了使用 relationship() 映射的列表如果在原地添加到自身(即使用 += 运算符)以及如果 .extend() 被赋予相同的列表,则会进入无限循环的问题。

    参考: #7389

  • [ORM] [缺陷]

    修复了在使用 Session.begin() 的上下文管理器时,如果在 Session.commit() 方法中 Session 要关闭连接时发生异常,则会尝试回滚,但由于 Session 处于事务已提交和连接即将返回池之间的状态,因此回滚是不可能的,从而引发异常 “this sessiontransaction is in the committed state”。此异常主要发生在 asyncio 上下文中,其中可能会引发 CancelledError。

    参考: #7388

  • [ORM] [已弃用]

    已弃用未记录的加载器选项语法 ".*",该语法似乎与传递单个星号没有区别,如果使用,将发出弃用警告。此语法可能旨在用于某些目的,但目前没有必要使用它。

    参考: #4390

引擎

  • [引擎] [用例]

    URL 类添加了对 copy()deepcopy() 的支持。此拉取请求由 Tom Ritchford 提供。

    参考: #7400

SQL

  • [SQL] [用例]

    “复合选择” 方法,如 Select.union()Select.intersect_all() 等,现在接受 *other 作为参数,而不是 other,以允许将多个额外的 SELECT 与父语句一次性复合。特别是,应用于 CTE.union()CTE.union_all() 的更改现在允许使用 CTE 构造创建所谓的 “非线性 CTE”,而以前在 UNION 中同时拥有两个以上的 CTE 子元素,同时仍然正确地以递归方式调用 CTE 是不可能的。此拉取请求由 Eric Masseran 提供。

    参考: #7259

  • [SQL] [用例]

    Exists.where() 方法中支持多个子句元素,将 API 与普通的 select() 构造提供的 API 统一起来。

    参考: #7386

  • [SQL] [缺陷] [回归]

    扩展了 TypeDecorator.cache_ok 属性以及相应的警告消息(如果未定义此标志),这是为 TypeDecorator 建立的行为,作为 #6436 的一部分,也适用于 UserDefinedType,通过将标志和相关的缓存逻辑推广到这两种类型的新公共基类 ExternalType,以创建 UserDefinedType.cache_ok

    此更改意味着,对于使用数据类型的语句,任何当前的 UserDefinedType 现在都将导致 SQL 语句缓存不再发生,同时还会发出警告,除非该类将 UserDefinedType.cache_ok 标志定义为 True。如果数据类型无法从其参数形成确定性的、可哈希的缓存键,则可以将该属性设置为 False,这将继续禁用缓存,但会抑制警告。特别是,当前在 SQLAlchemy-utils 等包中使用的自定义数据类型将需要实现此标志。该问题是在 SQLAlchemy-utils 数据类型中观察到的,该数据类型目前不可缓存。

    另请参阅

    ExternalType.cache_ok

    参考: #7319

  • [SQL] [缺陷]

    自定义 SQL 元素、第三方方言、自定义或第三方数据类型在它们没有明确选择加入或退出 SQL 语句缓存时,都将生成一致的警告,这可以通过在每种类型的类上设置适当的属性来实现。该警告链接到文档部分,其中指示了每种对象类型的适当方法,以便启用缓存。

    参考: #7394

  • [SQL] [缺陷]

    修复了 SQL Core 中一些较少使用的类缺少缓存指令的问题,这些问题会导致为使用这些元素的元素记录 [no key]

    参考: #7394

mypy

  • [mypy] [缺陷]

    修复了当使用 Mypy 插件针对使用 declared_attr 方法处理未映射名称(如 __mapper_args____table_args__ 或其他双下划线名称)的代码时,会发生的 Mypy 崩溃,因为该插件会尝试将这些解释为映射属性,然后在稍后被错误处理。作为此更改的一部分,装饰函数仍然被插件转换为泛型赋值语句(例如 __mapper_args__: Any),以便可以像为任何其他 @classmethod 一样继续注释参数签名,而 Mypy 不会抱怨非显式 @classmethod 的方法的错误参数类型。

    参考文献: #7321

postgresql

  • [postgresql] [缺陷]

    修复了 hstorearray 构造缺少缓存指令的问题,这些问题会导致为这些元素记录 [no key]

    参考: #7394

测试

  • [测试] [缺陷]

    实现了对在 Pytest 7 下正确运行测试套件的支持。以前,Python 3 仅支持 Pytest 6.x,但是该版本在 tox.ini 中未固定上限。Pytest 在 tox.ini 中未固定为低于版本 8,以便使用当前代码库发布的 SQLAlchemy 版本能够在 tox 下进行测试,而无需更改环境。非常感谢 Pytest 开发人员对此问题的帮助。

1.4.27

发布日期:2021 年 11 月 11 日

ORM

  • [ORM] [缺陷]

    修复了在 Relationship to Aliased Class 中引入的 “与别名类的关系” 功能中的错误,其中无法创建以目标属性为目标的加载器策略选项,在第二个加载器选项中直接使用 aliased() 构造,例如 selectinload(A.aliased_bs).joinedload(aliased_b.cs),而无需在前一个路径元素上显式使用 PropComparator.of_type() 进行限定。此外,直接定位非别名类将被接受(不恰当),但会静默失败,例如 selectinload(A.aliased_bs).joinedload(B.cs);现在,这将引发错误,指示类型不匹配。

    参考: #7224

  • [ORM] [缺陷]

    所有 Result 对象现在将在硬关闭后(包括在调用 “single row or value” 方法(如 Result.first()Result.scalar() 之后发生的 “硬关闭”)使用时,一致地引发 ResourceClosedError。这已经是为 Core 语句执行返回的最常见结果对象类(即基于 CursorResult 的对象)的行为,因此此行为不是新的。但是,此更改已扩展到正确适应在使用 2.0 样式 ORM 查询时返回的 ORM “过滤” 结果对象,这些对象以前会以返回空结果的 “软关闭” 样式运行,或者根本不会 “软关闭”,并且会继续从底层游标生成结果。

    作为此更改的一部分,还向基本 Result 类添加了 Result.close(),并为 ORM 使用的过滤结果实现实现了它,以便在使用 yield_per 执行选项时,可以在从服务器端游标关闭之前获取剩余的 ORM 结果,从而在底层 CursorResult 上调用 CursorResult.close() 方法。这再次已经可用于 Core 结果集,但此更改也使其可用于 2.0 样式 ORM 结果。

    参考: #7274

  • [ORM] [缺陷] [回归]

    修复了 1.4 回归问题,其中 Query.filter_by() 在由 Query.union()Query.from_self() 或类似方法生成的 Query 上无法正常工作。

    参考: #7239

  • [ORM] [缺陷]

    修复了如果使用 load_only() 选项最初排除该属性(在 load_only 从关系加载器选项降下来的情况下),则从连接表继承子类延迟多态加载属性将无法正确填充该属性的问题。此修复允许其他有效选项(如 defer(..., raiseload=True) 等)仍然按预期工作。

    参考: #7304

  • [ORM] [缺陷] [回归]

    修复了 1.4 回归问题,其中当 Query.join() 连接到使用 PropComparator.of_type() 指定目标实体的别名版本的实体时,Query.filter_by() 无法正常工作。此问题也适用于使用 select() 构建的未来样式 ORM 查询。

    参考: #7244

引擎

  • [引擎] [缺陷]

    修复了未来 Connection 对象中的问题,其中 Connection.execute() 方法不接受非字典映射对象,例如 SQLAlchemy 自己的 RowMapping 或其他 abc.collections.Mapping 对象作为参数字典。

    参考: #7291

  • [引擎] [缺陷] [回归]

    修复了回归问题,其中当结果完全耗尽时,CursorResult.fetchmany() 方法无法自动关闭服务器端游标(即,当 stream_resultsyield_per 正在使用时,无论是 Core 还是 ORM 导向的结果)。

    参考: #7274

  • [引擎] [缺陷]

    修复了未来 Engine 中的问题,其中调用 Engine.begin() 并进入上下文管理器如果实际的 BEGIN 操作由于某些原因(例如事件处理程序引发异常)而失败,则不会关闭连接;此用例未能针对引擎的未来版本进行测试。请注意,处理 Core 和 ORM 中 begin() 块的 “未来” 上下文管理器实际上不会运行 “BEGIN” 操作,直到实际进入上下文管理器为止。这与预先运行 “BEGIN” 操作的旧版本不同。

    参考: #7272

SQL

  • [SQL] [用例]

    TupleType 添加到顶级 sqlalchemy 导入命名空间。

  • [SQL] [缺陷] [回归]

    修复了回归问题,其中为 ORM 查询返回的行对象(现在是普通的 Row 对象)不会被 ColumnOperators.in_() 运算符解释为要分解为单独绑定参数的元组值,而是将它们作为单个值传递给驱动程序,从而导致失败。“扩展 IN” 系统的更改现在适应了表达式已经为 TupleType 类型的情况,并相应地处理值。在不常见的使用 “tuple-in” 且未类型化的语句(例如没有类型信息的文本语句)的情况下,会为实现 collections.abc.Sequence 但不是 strbytes 的值检测到元组值,就像在测试 Sequence 时始终一样。

    参考: #7292

  • [SQL] [缺陷]

    修复了在 Ordering or Grouping by a Label 中描述的为排序或分组使用字符串标签的功能在 CTE 构造上使用时无法正常工作的问题,当 CTE 嵌入在封闭的 Select 语句(该语句本身设置为标量子查询)内部时。

    参考: #7269

  • [SQL] [缺陷] [回归]

    修复了回归问题,其中 text() 构造不再被接受为 case() 构造中 “whens” 列表中的目标案例。此回归似乎与试图防止某些形式的文字值(当在此处传递时被认为是模棱两可的)有关;但是,没有理由不应该像其他任何地方一样将目标案例解释为开放式 SQL 表达式,并且文字字符串或元组将转换为绑定参数,就像在其他地方一样。

    参考: #7287

schema

postgresql

  • [postgresql] [用例] [asyncpg]

    添加了可覆盖的方法 PGDialect_asyncpg.setup_asyncpg_json_codecPGDialect_asyncpg.setup_asyncpg_jsonb_codec 编解码器,这些方法处理了在使用 asyncpg 时为这些数据类型注册 JSON/JSONB 编解码器的必要任务。更改是将方法分解为单独的、可覆盖的方法,以支持需要更改或禁用如何设置这些特定编解码器的第三方方言。

    参考: #7284

  • [postgresql] [缺陷] [asyncpg]

    更改了 asyncpg 方言,将 Float 类型绑定到 “float” PostgreSQL 类型,而不是 “numeric”,以便可以容纳值 float(inf)。添加了测试套件支持以持久化 “inf” 值。

    参考:#7283

  • [postgresql] [pg8000]

    改进了在使用 pg8000 方言的 PostgreSQL 中处理数组的方式。

    参考:#7167

mysql

  • [mysql] [bug] [mariadb]

    将保留字列表重组为两个单独的列表,一个用于 MySQL,一个用于 MariaDB,以便更准确地管理这些不同的词集;调整了 MySQL/MariaDB 方言,以便根据显式配置或服务器版本检测到的 “MySQL” 或 “MariaDB” 后端在这些列表之间切换。添加了截至 MySQL 8 和当前 MariaDB 版本的所有当前保留字,包括最近添加的关键字,如 “lead”。拉取请求由 Kevin Kirsche 提供。

    参考:#7167

  • [mysql] [bug]

    修复了 MySQL Insert.on_duplicate_key_update() 中的问题,该问题在 VALUES 表达式中使用表达式时会呈现错误的列名。拉取请求由 Cristian Sabaila 提供。

    参考:#7281

mssql

  • [mssql] [bug]

    调整了编译器生成的 “post compile” 符号,包括用于 “expanding IN” 以及 “schema translate map” 的符号,使其不再直接基于带有下划线的普通括号字符串,因为这与 SQL Server 的引用格式(也使用括号)直接冲突,当编译器替换 “post compile” 和 “schema translate” 符号时,会产生错误匹配。此问题创建了易于重现的示例,包括在结合 Connection.execution_options.schema_translate_map 功能使用 Inspector.get_schema_names() 方法时,以及在不太可能的情况下,如果内部名称 “POSTCOMPILE” 的符号与 “expanding in” 等功能一起使用。

    参考:#7300

1.4.26

发布日期:2021 年 10 月 19 日

orm

  • [orm] [bug]

    改进了在配置具有连接表继承的映射时生成的异常消息,其中两个表要么没有设置外键关系,要么设置了多个外键关系。该消息现在是 ORM 特定的,并包含 Mapper.inherit_condition 参数可能需要的上下文,尤其是在外键不明确的情况下。

  • [orm] [bug]

    修复了 with_loader_criteria() 功能的问题,其中 ON 条件不会添加到 select(A).join(B) 形式的查询的 JOIN 中,即在利用隐式 ON 子句时声明目标。

    参考:#7189

  • [orm] [bug]

    修复了错误,其中 ORM “插件”(对于 with_loader_criteria() 等功能正常工作是必需的)不会应用于从 ORM 列表达式查询的 select(),如果它使用了 ColumnElement.label() 修饰符。

    参考:#7205

  • [orm] [bug]

    #6991 中添加的缺失方法添加到 scoped_sessionasync_scoped_session()

    参考:#7103

  • [orm] [bug]

    Query.join() 和 ORM 版本的 Select.join() 的功能添加了一个额外的警告消息层,其中一些继续发生 “自动别名” 的地方现在将被指出是应避免的模式,主要特定于连接表继承的区域,其中共享公共基表的类在没有使用显式别名的情况下连接在一起。一种情况为不推荐的模式发出旧版警告,另一种情况已完全弃用。

    ORM join() 中针对重叠映射表发生的自动别名与所有 API(如 contains_eager())不一致地工作,并且与其继续尝试使这些用例在任何地方都起作用,不如用更用户显式的模式替换,这样更清晰,更不容易出错,并进一步简化了 SQLAlchemy 的内部结构。

    警告包括指向 errors.rst 页面的链接,其中演示了每种模式以及推荐的修复模式。

    参考:#6972, #6974

  • [orm] [bug]

    修复了在 Session 关闭后迭代来自 SessionResult 会将对象部分附加到该会话中,使其处于基本上无效的状态的错误。如果从已关闭或以其他方式调用了 Session.expunge_all() 方法的 Session 中迭代了未缓冲的结果,则现在会引发异常,并链接到新的文档。 prebuffer_rows 执行选项(异步 asyncio 扩展自动用于客户端结果集)可用于生成 Result,其中 ORM 对象已预缓冲,在这种情况下,迭代结果将产生一系列分离的对象。

    参考:#7128

  • [orm] [bug]

    #7153 相关,修复了结果列查找对于为 “constant” 值表达式(最常见的是 NULL 表达式)选择的 “adapted” SELECT 语句会失败的问题,这种情况最常发生在连接的预先加载与 limit/offset 结合使用时。这总体上是由于问题 #6259 导致的回归,该问题删除了 SQL 语句中重写表达式时对 NULL、“true” 和 “false” 等常量的所有 “adaption”,但这破坏了用于将常量解析为标记表达式以用于结果集定位的相同 adaption 逻辑的情况。

    参考:#7154

  • [orm] [bug] [regression]

    修复了回归,其中在某些组合中使用利用 "*" 的加载器选项的情况下,ORM 加载的对象无法被 pickle 序列化,例如将 joinedload() 加载器策略与子元素的 raiseload('*') 结合使用。

    参考:#7134

  • [orm] [bug] [regression]

    修复了回归,其中将 hybrid_property 属性或映射的 composite() 属性作为键传递给 ORM 启用的 Update 语句的 Update.values() 方法,以及通过旧版 Query.update() 方法使用它时,将在 UPDATE 语句的编译阶段处理传入的 ORM/hybrid/composite 值,这意味着在发生缓存的情况下,后续对同一语句的调用将不再接收正确的值。这不仅包括使用 hybrid_property.update_expression() 方法的 hybrid 属性,还包括任何 plain hybrid 属性的使用。对于 composite 属性,该问题反而导致生成不可重复的缓存键,这将破坏缓存,并可能用重复的语句填满语句缓存。

    Update 构造现在在首次生成构造时,在生成缓存键之前,预先处理传递给 Update.values()Update.ordered_values() 的键/值对,以便每次都处理键/值对,并且缓存键是针对最终将在语句中使用的各个列/值对生成的。

    参考:#7209

  • [orm]

    Query 对象传递给 Session.execute() 不是此对象的预期用法,现在将引发弃用警告。

    参考:#6284

examples

engine

  • [engine] [bug]

    修复了当传递七个参数的完整位置参数列表时,URL 构造函数的弃用警告(指示应使用 URL.create() 方法)不会发出的问题;此外,如果以这种方式调用构造函数,现在将发生 URL 参数的验证,这在以前被跳过了。

    参考:#7130

  • [engine] [bug] [postgresql]

    Inspector.reflect_table() 方法现在支持反射没有用户定义的列的表。这允许 MetaData.reflect() 在包含此类表的数据库上正确完成反射。目前,只有 PostgreSQL 已知在常见的数据库后端中支持这种构造。

    参考:#3247

  • [engine] [bug]

    为所有 SQLAlchemy 异常对象实现了正确的 __reduce__() 方法,以确保它们在 pickle 序列化时都支持干净的往返,因为异常对象通常为了各种调试工具的目的而序列化。

    参考:#7077

sql

  • [sql] [bug]

    修复了使用 FunctionElement.within_group() 构造的 SQL 查询无法被 pickle 序列化的问题,通常在使用 sqlalchemy.ext.serializer 扩展时,但也用于一般的通用 pickle 序列化。

    参考:#6520

  • [sql] [bug]

    修复了在 #4123 中引入的新 HasCTE.cte.nesting 参数中的问题,其中使用 HasCTE.cte.recursive 并通常与 UNION 结合使用的递归 CTE 无法正确编译。此外,进行了一些调整,以便 CTE 构造创建正确的缓存键。拉取请求由 Eric Masseran 提供。

    参考:#4123

  • [sql] [bug]

    考虑传递给 table() 构造的 table.schema 参数,以便在访问 TableClause.fullname 属性时将其考虑在内。

    参考:#7061

  • [sql] [bug]

    修复了 ColumnOperators.any_() / ColumnOperators.all_() 函数/方法中的不一致性,其中这些函数具有的 “翻转” 表达式的特殊行为(使得 “ANY” / “ALL” 表达式始终位于右侧)在与 None 值进行比较时将不起作用,即 “column.any_() == None” 应生成与 “null() == column.any_()” 相同的 SQL 表达式。还添加了更多文档来澄清这一点,并提及 any_() / all_() 通常取代 ARRAY 版本 “any()” / “all()”。

    参考:#7140

  • [sql] [bug] [regression]

    修复了 “expanding IN” 在使用 TypeEngine.bind_expression() 方法的数据类型时无法正常工作的问题,其中该方法需要应用于 IN 表达式的每个元素,而不是整个 IN 表达式本身。

    参考:#7177

  • [sql] [bug]

    调整了 1.4 中新增的 “列消除歧义” 逻辑,其中重复的相同表达式会获得一个 “额外的匿名” 标签,以便当重复元素每次都是相同的 Python 表达式对象时(例如在使用 null() 等 “单例” 值时),该逻辑会更积极地去重这些标签。这是基于以下观察:至少某些数据库(例如 MySQL,但不是 SQLite)如果子查询中重复相同的标签,则会引发错误。

    参考:#7153

mypy

  • [mypy] [bug]

    修复了 mypy 插件中的问题,以改进检测包含自定义 Python 枚举类的 Enum() SQL 类型的一些问题。拉取请求由 Hiroshi Ogawa 提供。

    参考:#6435

postgresql

  • [postgresql] [bug]

    为 psycopg2 报告的 “SSL SYSCALL error: Bad address” 错误消息添加了 “disconnect” 条件。拉取请求由 Zeke Brechtel 提供。

    参考:#5387

  • [postgresql] [bug] [regression]

    修复了针对一系列数组元素的 IN 表达式(可以使用 PostgreSQL 完成)由于 SQLAlchemy Core 的 “expanding IN” 功能(在 1.4 版本中标准化)中的多个问题而无法正常工作的问题。 psycopg2 方言现在使用 TypeEngine.bind_expression() 方法与 ARRAY 一起可移植地将正确的强制转换应用于元素。 asyncpg 方言不受此问题的影响,因为它在驱动程序级别而不是编译器级别应用绑定级别强制转换。

    参考:#7177

mysql

  • [mysql] [bug] [mariadb]

    修复以适应 MariaDB 10.6 系列,包括 mariadb-connector Python 驱动程序(仅在 SQLAlchemy 1.4 上受支持)和 mysqlclient DBAPI 自动使用的本机 10.6 客户端库中的向后不兼容更改(适用于 1.3 和 1.4)。当编码声明为 “utf8” 时,“utf8mb3” 编码符号现在由这些客户端库报告,导致 MySQL 方言中出现查找和编码错误,该方言不期望此符号。更新了 MySQL 基础库以适应报告的 utf8mb3 符号以及测试套件。感谢 Georg Richter 的支持。

    此更改也反向移植到:1.3.25

    参考:#7115, #7136

  • [mysql] [bug]

    修复了 MySQL match() 构造中的问题,其中为 “against” 参数传递子句表达式(如 bindparam() 或其他 SQL 表达式)将失败。拉取请求由 Anton Kovalevich 提供。

    参考:#7144

  • [mysql] [bug]

    修复了安装问题,其中如果未安装 “greenlet”,则 sqlalchemy.dialects.mysql 模块将无法导入。

    参考:#7204

mssql

  • [mssql] [usecase]

    添加了对 SQL Server 外键选项的反射支持,包括 “ON UPDATE” 和 “ON DELETE” 的 “CASCADE” 和 “SET NULL” 值。

  • [mssql] [bug]

    修复了 Inspector.get_foreign_keys() 的问题,其中如果外键是针对唯一索引而不是唯一约束建立的,则会省略外键。

    参考:#7160

  • [mssql] [bug]

    修复了 Inspector.has_table() 的问题,如果在查询 tempdb 时恰好首先返回来自不同会话的同名本地临时表,则它将返回 False。这是 #6910 的延续,后者解释了临时表仅存在于备用会话而不是当前会话中的情况。

    参考:#7168

  • [mssql] [bug] [regression]

    修复了 SQL Server DATETIMEOFFSET 数据类型中的错误,其中 ODBC 实现不会为使用 dialect.type_descriptor() 方法转换类型的情况生成正确的 DDL,dialect.type_descriptor() 方法的用法在 TypeDecorator 的一些文档示例中进行了说明,尽管对于大多数数据类型来说不是必需的。回归是由 #6366 引入的。作为此更改的一部分,SQL Server 日期类型的完整列表已修改为返回 “dialect impl”,该 “dialect impl” 生成与超类型相同的 DDL 名称。

    参考:#7129

1.4.25

发布日期:2021 年 9 月 22 日

platform

  • [platform] [bug] [regression]

    修复了由于 #7024 导致的回归,其中 greenlet 依赖项使用的 “platform machine” 名称的重组错误地拼写了 “aarch64”,并且还遗漏了 Windows 机器所需的uppercase “AMD64”。拉取请求由 James Dow 提供。

    参考:#7024

1.4.24

发布日期:2021 年 9 月 22 日

platform

  • [platform] [bug]

    进一步调整了 setup.cfg 中的 “greenlet” 包说明符,以使用 “or” 表达式的长链,以便 platform_machine 与特定标识符的比较仅匹配完整的字符串。

    参考:#7024

orm

  • [orm] [usecase]

    通过新的 Session.merge.options 参数,为 Session.merge()AsyncSession.merge() 添加了加载器选项,这将给定的加载器选项应用于 merge 内部使用的 get(),允许在 merge 进程加载新对象时应用关系的预先加载等。拉取请求由 Daniel Stone 提供。

    参考: #6955

  • [ORM] [bug] [regression]

    修复了 ORM 问题,当传递列表达式到 query() 或启用 ORM 的 select() 时,会根据对象的标识进行去重。例如,类似 select(A.id, null(), null()) 的短语只会生成一个 “NULL” 表达式,这与 1.3 版本之前的行为不同。然而,此更改也允许 ORM 表达式按原样渲染,例如 select(A.data, A.data) 将生成一个包含两列的结果行。

    参考: #6979

  • [ORM] [bug] [regression]

    修复了最近修复的 Query.with_entities() 方法中的问题,该问题导致用于确定传统 ORM Query 对象自动去重的标志在 with_entities() 调用将 Query 设置为仅返回列的行(这些行不去重)的情况下被不恰当地设置为 True

    参考: #6924

engine

  • [engine] [usecase] [asyncio]

    改进了适配驱动程序(如 asyncio 驱动程序)访问驱动程序返回的实际连接对象的接口。

    _ConnectionFairy 对象有两个新属性

    • _ConnectionFairy.dbapi_connection 始终表示 DBAPI 兼容对象。对于 pep-249 驱动程序,这是 DBAPI 连接,与之前一直以来的 .connection 属性访问的方式相同。对于 SQLAlchemy 适配为 pep-249 接口的 asyncio 驱动程序,返回的对象通常是名为 AdaptedConnection 的 SQLAlchemy 适配对象。

    • _ConnectionFairy.driver_connection 始终表示第三方 pep-249 DBAPI 或正在使用的异步驱动程序维护的实际连接对象。对于标准 pep-249 DBAPI,这始终与 dbapi_connection 的对象相同。对于 asyncio 驱动程序,这将是底层的仅 asyncio 连接对象。

    .connection 属性仍然可用,现在是 .dbapi_connection 的旧别名。

    参考: #6832

  • [engine] [usecase] [orm]

    添加了新方法 Session.scalars(), Connection.scalars(), AsyncSession.scalars()AsyncSession.stream_scalars(),这些方法为接收面向行的 Result 对象并将其转换为 ScalarResult 对象(通过 Result.scalars() 方法)的使用场景提供了快捷方式,以返回值的列表而不是行的列表。新方法类似于长期存在的 Session.scalar()Connection.scalar() 方法,这些方法用于仅从第一行返回单个值。感谢 Miguel Grinberg 提供的拉取请求。

    参考: #6990

  • [engine] [bug] [regression]

    修复了 ConnectionEvents.before_execute() 方法修改传递的 SQL 语句对象的能力被意外移除的问题,该方法应返回要调用的新对象。此行为已恢复。

    参考: #6913

  • [engine] [bug]

    确保在 URL.create.password 参数上调用 str(),允许使用实现 __str__() 方法的对象作为密码属性。此外,澄清了不适合使用此类对象来动态更改每个数据库连接的密码;应使用 生成动态身份验证令牌 中的方法。

    参考: #6958

  • [engine] [bug]

    修复了 URL 中的问题,其中 “drivername” 的验证无法适当地响应期望字符串的 None 值。

    参考: #6983

  • [engine] [bug] [postgresql]

    修复了当 create_engine.implicit_returning 设置为 False 的引擎在 PostgreSQL 的 “fast insertmany” 功能与 Sequence 结合使用时,以及任何类型的 “executemany” 与 “return_defaults()” 与 Sequence 结合使用时,都无法正常工作的问题。请注意,PostgreSQL “fast insertmany” 在 SQL 语句传递给驱动程序时,根据定义使用 “RETURNING”;总的来说,create_engine.implicit_returning 标志是遗留的,在现代 SQLAlchemy 中没有实际用途,将在单独的更改中弃用。

    参考: #6963

sql

  • [sql] [usecase]

    HasCTE.cte() 方法和 CTE 构造函数添加了新参数 HasCTE.cte.nesting,该参数将 CTE 标记为应保留在封闭 CTE 内嵌套,而不是移动到最外层 SELECT 的顶层。虽然在绝大多数情况下 SQL 功能没有区别,但用户已经确定了各种边缘情况,在这些情况下,CTE 构造的真实嵌套是可取的。非常感谢 Eric Masseran 为这个复杂的功能付出的辛勤工作。

    参考:#4123

  • [sql] [bug]

    FunctionElement 中实现了缺失的方法,虽然未使用,但会导致 pylint 将它们报告为未实现的抽象方法。

    参考: #7052

  • [sql] [bug]

    修复了当 select()join() 的组合被适配以形成元素副本时,不会完全复制与子查询关联的所有列对象的状态的两个问题。由此引起的一个关键问题是,使用 ClauseElement.params() 方法(可能应该将其移动到遗留类别中,因为它效率低下且容易出错)会留下旧的 BindParameter 对象的副本,从而导致在执行时正确设置参数时出现问题。

    参考: #7055

  • [sql] [bug]

    修复了与新 HasCTE.add_cte() 功能相关的问题,其中同时配对两个 “INSERT..FROM SELECT” 语句会丢失对两个独立 SELECT 语句的跟踪,从而导致错误的 SQL。

    参考: #7036

  • [sql] [bug]

    修复了在传递给 Insert.values() 的字典列表中的键中使用 ORM 列表达式,用于 “多值插入” 时,不会正确处理为正确的列表达式的问题。

    参考: #7060

mypy

  • [mypy] [bug]

    修复了 mypy 插件在解释 query_expression() 构造时崩溃的问题。

    参考: #6950

  • [mypy] [bug]

    修复了 mypy 插件中的问题,如果映射类依赖于来自超类的 __tablename__ 例程,则 mixin 上的列将无法正确解释。

    参考: #6937

asyncio

  • [asyncio] [feature] [mysql]

    为 MySQL 和 MariaDB 添加了对 asyncmy asyncio 数据库驱动程序的初始支持。这个驱动程序非常新,但似乎是 aiomysql 驱动程序的唯一当前替代方案,aiomysql 驱动程序目前似乎无人维护,并且无法与当前的 Python 版本一起工作。非常感谢 long2ice 为这个方言提供的拉取请求。

    另请参阅

    asyncmy

    参考: #6993

  • [asyncio] [usecase]

    AsyncSession 现在支持覆盖它用作代理实例的 Session。可以使用 AsyncSession.sync_session_class 参数或通过子类化 AsyncSession 并指定自定义 AsyncSession.sync_session_class 来传递自定义 Session 类。

    参考: #6746

  • [asyncio] [bug]

    修复了 AsyncSession.execute()AsyncSession.stream() 中的一个错误,该错误要求 execution_options 在定义时必须是 immutabledict 的实例。现在它正确地接受任何映射。

    参考: #6943

  • [asyncio] [bug]

    AsyncSession.connection() 方法添加了缺少的 **kw 参数。

  • [asyncio] [bug]

    弃用 scoped_session 与 asyncio 驱动程序的用法。当使用 Asyncio 时,应使用 async_scoped_session

    参考: #6746

postgresql

  • [postgresql] [bug]

    限定 version() 调用,以避免用户配置不同搜索路径时出现阴影问题。

    参考: #6912

  • [postgresql] [bug]

    ENUM 数据类型是 PostgreSQL 原生的,因此不应与 native_enum=False 标志一起使用。如果传递给 ENUM 数据类型,则现在忽略此标志并发出警告;以前,该标志会导致类型对象无法正常工作。

    参考: #6106

sqlite

  • [sqlite] [bug]

    修复了 pysqlite 驱动程序上 SQLite 无效隔离级别的错误消息未能指示 “AUTOCOMMIT” 是有效隔离级别之一的错误。

mssql

  • [mssql] [bug] [reflection]

    修复了 sqlalchemy.engine.reflection.has_table() 对于实际上属于不同 SQL Server 会话(连接)的本地临时表返回 True 的问题。现在执行额外的检查以确保检测到的临时表实际上属于当前会话。

    参考: #6910

oracle

  • [oracle] [bug] [performance]

    在反射查询(针对 Oracle 系统视图,例如 ALL_TABLES、ALL_TAB_CONSTRAINTS 等)中使用的 “表名”、“所有者” 和其他 DDL 名称参数中添加了 CAST(VARCHAR2(128)),以更好地启用针对这些列的索引,因为由于 Python 对字符串使用 Unicode,它们以前会被隐式地处理为 NVARCHAR2;所有 Oracle 版本中的文档都将这些列记录为 VARCHAR2,长度根据服务器版本从 30 到 128 个字符不等。此外,已启用针对 Oracle 数据库的 Unicode 命名 DDL 结构体的测试支持。

    参考: #4486

1.4.23

发布日期:2021 年 8 月 18 日

general

  • [general] [bug]

    修改了 setup 要求,使得 greenlet 仅对于那些已知 greenlet 可安装且 pypi 上已存在预构建二进制文件的平台成为默认要求;当前列表为 x86_64 aarch64 ppc64le amd64 win32。对于其他平台,默认情况下不会安装 greenlet,这应该可以在不支持 greenlet 的平台上安装和运行 SQLAlchemy 1.4 的测试套件,但不包括任何 asyncio 功能。为了在上述列表之外的机器架构上安装包含 greenlet 依赖项的版本,可以包含 [asyncio] 额外项,方法是运行 pip install sqlalchemy[asyncio],这将尝试安装 greenlet

    此外,测试套件已修复,以便在未安装 greenlet 时可以完全完成测试,并为 asyncio 相关测试提供适当的跳过。

    参考: #6136

orm

  • [orm] [usecase]

    添加了新属性 Select.columns_clause_froms,它将检索 Select 语句的列子句隐含的 FROM 列表。这与旧的 Select.froms 集合不同,因为它不执行任何 ORM 编译步骤,而 ORM 编译步骤必然会取消注释 FROM 元素并执行诸如计算 joinedloads 等操作,这使得它不适合作为 Select.select_from() 方法的候选对象。此外,添加了一个新参数 Select.with_only_columns.maintain_column_froms,它在替换列集合之前,将此集合传输到 Select.select_from()

    此外,Select.froms 被重命名为 Select.get_final_froms(),以强调此集合不是简单的访问器,而是根据对象的完整状态计算出来的,当在 ORM 上下文中使用时,这可能是一个昂贵的调用。

    此外,修复了涉及 with_only_columns() 函数的回归问题,以支持将条件应用于已替换为 Select.with_only_columns()Query.with_entities() 的列元素,这在 1.4.19 中发布的 #6503 中已损坏。

    参考: #6808

  • [orm] [bug] [sql]

    修复了如果在一个语句中同时使用多个此参数的克隆,则 “克隆” 的绑定参数对象会在编译器中引起名称冲突的问题。这尤其可能发生在 ORM 单表继承查询中,这些查询在一个查询中多次指示相同的 “鉴别器” 值。

    参考: #6824

  • [orm] [bug]

    修复了加载器策略中的问题,其中 Load.options() 方法的使用,尤其是在嵌套多次调用时,会生成过长且更重要的是不确定的缓存键,从而导致非常大的缓存键,这些缓存键既不允许高效的缓存使用(在使用的总内存方面),也不允许高效的缓存使用(在缓存本身中使用的条目数方面)。

    参考: #6869

  • [orm] [bug]

    修改了 ORMExecuteState.user_defined_options 访问器从上下文中接收 UserDefinedOption 和相关选项对象的方式,特别强调加载器策略上的 “selectinload”,之前它无法正常工作;其他策略没有这个问题。现在无条件地传播与当前正在执行的查询(而不是正在缓存的查询)关联的对象。这本质上将它们与 “加载器策略” 选项分离开来,这些选项与查询的编译状态显式关联,并且需要与缓存的查询相关地使用。

    此修复的效果是,用户定义的选项(例如 dogpile.caching 示例使用的选项以及其他配方(例如为水平共享扩展定义 “分片 ID”)使用的选项)将正确传播到预先加载器和延迟加载器,而无论最终是否调用了缓存查询。

    参考: #6887

  • [orm] [bug]

    修复了工作单元在内部使用 2.0 弃用的 SQL 表达式形式的问题,当启用 SQLALCHEMY_WARN_20 时会发出弃用警告。

    参考: #6812

  • [orm] [bug]

    修复了 selectinload() 中的问题,其中在新 PropComparator.and_() 功能在嵌套超过一层的选项中使用时,将无法更新嵌套条件中的绑定参数值,这是 SQL 语句缓存的副作用。

    参考: #6881

  • [orm] [bug]

    调整了 ORM 加载器的内部机制,不再使用 1.4 版本中添加的“lambda 缓存”系统,并修复了一个仍在查询中使用旧的“baked query”系统的位置。lambda 缓存系统仍然是减少构建具有相对固定使用模式的查询开销的有效方法。但在加载器策略的情况下,所使用的查询负责处理大量任意选项和条件,这些选项和条件由最终用户代码生成和有时使用,这使得 lambda 缓存概念的效率并不比不使用它更高,反而增加了复杂性。特别是,#6881#6887 中指出的问题,通过在内部移除此功能而大大简化。

    参考链接:#6079, #6889

  • [orm] [bug]

    修复了 Bundle 构造无法创建正确的缓存键的问题,导致查询缓存的低效使用。这在 “selectinload” 策略中产生了一些影响,并被确定为 #6889 的一部分。

    参考链接:#6889

sql

  • [sql] [bug]

    修复了 CTE 中的问题,其中版本 1.4.21 / #6752 中新增的 HasCTE.add_cte() 方法对于“复合选择”结构(例如 union(), union_all(), except() 等)无法正常工作。感谢 Eric Masseran 提交的 Pull request。

    参考链接:#6752

  • [sql] [bug]

    修复了 dogpile.caching 示例中使用的 CacheKey.to_offline_string() 方法中的一个问题,即尝试从延迟加载器生成的特殊 “lambda” 查询创建正确的缓存键时,会无法包含参数值,从而导致不正确的缓存键。

    参考链接:#6858

  • [sql] [bug]

    调整了 “from linter” 警告功能,以适应超过一级深度的连接链,其中 ON 子句没有显式匹配目标,例如 “ON TRUE” 这样的表达式。这种使用模式旨在通过存在从 “a 到 b” 的 JOIN 这一事实来取消笛卡尔积警告,但这对于连接链包含多个元素的情况不起作用。

    参考链接:#6886

  • [sql] [bug]

    修复了 lambda 缓存系统中的一个问题,即查询中产生无缓存键的元素(例如自定义选项或子句元素)仍然会不恰当地填充 “lambda 缓存” 中的表达式。

schema

  • [schema] [enum]

    统一了 Enum 在原生和非原生实现中的行为,关于具有别名元素的枚举的可接受值。当 Enum.omit_aliasesFalse 时,所有值(包括别名)都被接受为有效值。当 Enum.omit_aliasesTrue 时,只有非别名值被接受为有效值。

    参考链接:#6146

mypy

  • [mypy] [usecase]

    添加了对 SQLAlchemy 类在用户代码中使用 sqlalchemy2-stubs 定义的 “泛型类” 语法(例如 Column[String])的支持,无需在 TYPE_CHECKING 块中限定这些构造,通过实现 Python 特殊方法 __class_getitem__(),允许此语法在运行时无错误地通过。

    参考链接:#6759, #6804

postgresql

  • [postgresql] [bug]

    为 PostgreSQL 的 “overlaps”、“contained_by”、“contains” 运算符添加了 “is_comparison” 标志,以便它们在相关的 ORM 上下文中以及与 “from linter” 功能结合使用时能够正常工作。

    参考链接:#6886

mssql

  • [mssql] [bug] [sql]

    修复了 literal_binds 编译器标志(在外部用于内联呈现绑定参数)在与某些称为 “literal_execute” 的参数类一起使用时会失效的问题,这些参数类涵盖了诸如 LIMIT 和 OFFSET 值之类的在驱动程序不允许绑定参数的方言(例如 SQL Server 的 “TOP” 子句)中使用的情况。该问题似乎仅影响 MSSQL 方言。

    参考链接:#6863

misc

  • [bug] [ext]

    修复了水平分片扩展无法正确处理传递给 Session.execute() 的纯文本 SQL 语句的问题。

    参考链接:#6816

1.4.22

发布日期:2021 年 7 月 21 日

orm

  • [orm] [bug]

    修复了新的 Table.table_valued() 方法中的问题,即生成的 TableValuedColumn 构造无法正确响应别名适配,而别名适配贯穿整个 ORM,例如用于预加载、多态加载等。

    参考链接:#6775

  • [orm] [bug]

    修复了将 Result.unique() 方法与包含具有不可哈希类型的列表达式(例如使用非元组的 JSONARRAY)的 ORM 结果一起使用时,会静默回退到使用 id() 函数而不是引发错误的问题。现在,当在 2.0 风格的 ORM 查询中使用 Result.unique() 方法时,会引发错误。此外,对于未知类型的结果值(例如使用未知返回类型的 SQL 函数时经常发生的情况),假定其可哈希性为 True;如果值确实不可哈希,则 hash() 本身将引发错误。

    对于旧版 ORM 查询,由于旧版 Query 对象在所有情况下都会进行去重,因此旧规则仍然有效,即对于未知类型的结果值使用 id(),因为这种旧版去重主要用于去重 ORM 实体,而不是列值。

    参考链接:#6769

  • [orm] [bug]

    修复了在诸如测试套件拆卸之类的操作期间清除映射器可能会导致垃圾回收期间出现 “dictionary changed size” 警告的问题,这是由于迭代弱引用字典引起的。已应用 list() 以防止并发 GC 影响此操作。

    参考链接:#6771

  • [orm] [bug] [regression]

    修复了关键的缓存问题,即在使用 INSERT..RETURNING 的 ORM 持久化功能中,当混合使用 “批量保存” 和标准 “flush” 形式的 INSERT 时,会缓存不正确的查询。

    参考链接:#6793

engine

  • [engine] [bug]

    在事件系统中添加了一些保护措施,以防止在解释器关闭的同时调用 Engine.dispose() 时出现 KeyError,这会导致堆栈跟踪警告。

    参考链接:#6740

sql

  • [sql] [bug]

    修复了当使用 case.whens 参数以位置参数而不是关键字参数传递字典时,会发出 2.0 版本弃用警告的问题,该警告指的是弃用以位置参数传递列表。仍然支持以位置参数传递的 “whens” 字典格式,但被意外地标记为已弃用。

    参考链接:#6786

  • [sql] [bug]

    修复了在使用带有 Python None 值的 Insert.values() 方法的情况下,不会调用特定类型的绑定参数处理程序的问题;特别是,在使用 JSON 数据类型以及相关的 PostgreSQL 特定类型(例如 JSONB)时,会注意到这一点,因为它们无法将 Python None 值编码为 JSON null,但该问题已推广到与 Insert 的这种特定方法结合使用的任何绑定参数处理程序。

    参考链接:#6770

1.4.21

发布日期:2021 年 7 月 14 日

orm

  • [orm] [usecase]

    修改了用于跟踪非多对一的标量对象关系(即原本为一对多的单对单关系)历史记录的方法。当替换单对单值时,将被替换的 “旧” 值不再立即加载,而是在 flush 过程中处理。这消除了在分配给单对单属性时经常发生的,历史上麻烦的延迟加载,并且在使用 “lazy=’raise’” 以及 asyncio 用例时尤其麻烦。

    此更改确实导致了 AttributeEvents.set() 事件中的行为更改,但这在当前文档中已有所记录,即应用于此类单对单属性的事件,如果 “旧” 参数未加载且未设置 relationship.active_history 标志,则将不再接收 “旧” 参数。正如 AttributeEvents.set() 中记录的那样,如果事件处理程序需要在事件触发时接收 “旧” 值,则必须使用事件侦听器或关系建立 active_history 标志。这已经是其他类型的属性(例如多对一和列值引用)的行为。

    此更改还将推迟更新 “旧” 值上的反向引用,在不太常见的情况下,“旧” 值在会话中本地存在,但在相关关系上未加载,直到下一次 flush 发生。如果这导致问题,则可以再次在关系上将正常的 relationship.active_history 标志设置为 True

    参考链接:#6708

  • [orm] [bug] [regression]

    修复了 1.4.19 版本中由于 #6503Query.with_entities() 引起的回归问题,其中使用的新结构会不恰当地转移到封闭的 Query 中,当使用诸如 Query.union() 之类的集合操作时,导致其中的 JOIN 指令也应用于外部查询。

    参考链接:#6698

  • [orm] [bug] [regression]

    修复了版本 1.4.3 中由于 #6060 出现的回归问题,其中限制派生 selectable 的 ORM 适配的规则干扰了其他基于 ORM 适配的情况,在这种情况下,当对使用 column_property() 的映射应用 with_polymorphic() 时,而 column_property() 又使用了包含映射表的 aliased() 对象的标量选择。

    参考链接:#6762

  • [orm] [regression]

    修复了 ORM 回归问题,其中为混合属性以及其他可能类似的 ORM 启用表达式生成的临时标签名称通常会通过子查询向外传播,即使从子查询中选择,也允许名称保留在结果集的最终键中。现在在这种情况下跟踪了额外的状态,当从 Core select / 子查询中选择混合属性时,状态不会丢失。

    参考链接:#6718

sql

  • [sql] [usecase]

    select(), insert(), update()delete() 构造分别添加了新方法 HasCTE.add_cte()。此方法会将给定的 CTE 添加为语句的 “独立” CTE,这意味着即使 CTE 在主语句中没有被引用,它也会在语句上方的 WITH 子句中无条件呈现。这是 PostgreSQL 数据库上的一个常见用例,其中 CTE 用于针对独立于主语句的数据库行运行的 DML 语句。

    参考链接:#6752

  • [sql] [bug]

    修复了 CTE 构造中的一个问题,即引用具有重复列名的 SELECT 的递归 CTE(通常在 1.4 中使用标签逻辑进行重复数据删除)将无法在 WITH 子句中正确引用重复数据删除后的标签名称。

    参考链接:#6710

  • [sql] [bug] [regression]

    修复了回归问题,其中当给定未嵌入在 SQL 函数中的浮点采样值时,tablesample() 构造将无法执行。

    参考链接:#6735

postgresql

  • [postgresql] [bug]

    修复了 Insert.on_conflict_do_nothing()Insert.on_conflict_do_update() 中的问题,其中作为 constraint 参数传递的唯一约束的名称,如果基于命名约定生成了对于 PostgreSQL 最大标识符长度 63 个字符而言过长的名称,则不会像在 CREATE TABLE 语句中那样被正确截断长度。

    参考链接:#6755

  • [postgresql] [bug]

    修复了当 schema_translate_map 功能也在使用时,嵌入在 ARRAY 数据类型中的 PostgreSQL ENUM 数据类型在 create/drop 中无法正确发出错误的问题。此外,修复了相关的错误,即相同的 schema_translate_map 功能对于与 CAST 结合使用的 ENUM 数据类型不起作用,这也是 ARRAY(ENUM) 组合在 PostgreSQL 方言上的工作方式的内在特性。

    参考链接:#6739

  • [postgresql] [bug]

    修复了 Insert.on_conflict_do_nothing()Insert.on_conflict_do_update() 中的问题,其中作为 constraint 参数传递的唯一约束的名称,如果包含需要引号的字符,则不会被正确地引用。

    参考链接:#6696

mssql

  • [mssql] [bug] [regression]

    修复了回归问题,其中 SQL Server 方言的特殊点分隔模式名称处理,如果在 schema_translate_map 功能中使用点分隔模式名称,则无法正常工作。

    参考链接:#6697

1.4.20

发布日期:2021 年 6 月 28 日

orm

  • [orm] [bug] [regression]

    修复了 ORM 中关于 with_polymorphic() 构造的内部重构步骤中的回归问题,当用户面对的对象在查询处理时被垃圾回收时。重构没有确保处理 “多态” 情况的子实体,从而导致 AttributeError

    参考链接:#6680

  • [orm] [bug] [regression]

    调整了 Query.union() 和类似的集合操作,使其与 #6661(SQLAlchemy 1.4.19 版本)中刚刚添加的新功能正确兼容,以便呈现为 UNION 或其他集合操作元素的 SELECT 语句将包含直接映射为延迟加载的列;这既修复了涉及具有多层嵌套的 union 的回归问题(该问题会导致列不匹配),也允许在 Query 的顶层使用 undefer() 选项,而无需将该选项应用于 UNION 中的每个元素。

    参考链接:#6678

  • [orm] [bug]

    调整了映射器中对用作 @validates 验证器函数或 @reconstructor 重构函数的可调用对象的检查,以更宽松地检查 “可调用”,例如适应基于诸如 __func____call__ 之类基本属性的对象,而不是测试 MethodType / FunctionType,从而允许 cython 函数正常工作。感谢 Miłosz Stypiński 提交的 Pull request。

    参考链接:#6538

engine

  • [engine] [bug]

    修复了 C 扩展中的一个问题,该问题可能导致 Row 类在极少数情况下发生内存泄漏,即当 Row 对象引用了一个 ORM 对象,而该 ORM 对象随后被修改为反向引用 Row 自身时,从而创建了一个循环引用。Python C API 中用于跟踪 GC 循环的部分已被添加到原生的 Row 实现中,以处理这种情况。

    参考链接: #5348

  • [engine] [bug]

    修复了旧版本中存在的一个问题,即针对 “*” 标记执行的 select() 操作,当它只产生一列时,会导致 cursor.description 列名无法正确组织到结果对象的键中。

    参考链接: #6665

sql

  • [sql] [usecase]

    PickleType 构造函数添加了 impl 参数,允许使用任何任意类型来代替 LargeBinary 的默认实现。此拉取请求由 jason3gb 提供。

    参考链接: #6646

  • [sql] [bug] [orm]

    修复了 Sequence 和更通用的 DefaultGenerator 基类的类继承关系,因为它们作为语句是“可执行的”,所以它们的继承关系中需要包含 Executable,而不仅仅是之前任意应用于 SequenceStatementRole。此修复使得 Sequence 可以在所有 .execute() 方法中工作,包括与 Session.execute() 一起使用,而在建立了 SessionEvents.do_orm_execute() 处理程序的情况下,之前是无法工作的。

    参考链接: #6668

schema

  • [schema] [bug]

    修复了当为 Table.prefixes 传递 None 值时,不会存储空列表,而是存储常量 None 的问题,这对于第三方方言来说可能是意外的。Alembic 的最新版本中使用了此功能,并为其传递了 None 值,从而暴露了此问题。此拉取请求由 Kai Mueller 提供。

    参考链接: #6685

mysql

  • [mysql] [usecase]

    对 MySQL 方言的表反射功能进行了一个小的调整,以适应其他面向 MySQL 的数据库,如 TiDB,这些数据库在 “CREATE TABLE” 中的约束指令末尾包含了它们自己的 “comment” 指令,在这种情况下,TiDB 的 “clustered index” 功能的注释后没有额外的空格字符。此拉取请求由 Daniël van Eeden 提供。

    参考链接: #6659

misc

1.4.19

发布日期: 2021年6月22日

orm

  • [orm] [bug] [regression]

    修复了与 #6052 相同区域的进一步回归问题,即当选项/连接所依赖的语句的左侧部分被 Query.with_entities() 方法替换,或者在使用 2.0 风格的查询时使用 Select.with_only_columns() 方法时,加载器选项以及诸如 Query.join() 之类的方法调用将失败。已向对象添加了一组新的状态,用于跟踪选项/连接所针对的“左侧”实体,并在主导实体更改时进行记忆化。

    参考链接: #6253, #6503

  • [orm] [bug]

    改进了 ORM 子查询渲染的行为,使其在延迟列和列属性方面更兼容 1.3 版本,同时还提供了 1.4 版本的新功能。由于 1.4 版本中的子查询不使用加载器选项,包括 undefer(),因此针对具有延迟属性的 ORM 实体的子查询现在将渲染直接引用映射表列的那些延迟属性,因为如果外部 SELECT 使用这些列,则需要在外部 SELECT 中使用它们;但是,通常使用 column_property() 所做的引用组合 SQL 表达式的延迟属性将不包含在子查询中,因为如果需要在子查询中,可以显式选择这些属性。如果正在从该子查询中 SELECT 实体,则列表达式仍然可以在派生的子查询列的“外部”渲染。这产生的行为与使用 1.3 版本时基本相同。但是,在这种情况下,此修复还必须确保启用 ORM 的 select().selected_columns 集合也遵循这些规则,这尤其允许递归 CTE 在这种情况下正确渲染,而之前由于此问题导致渲染失败。

    参考链接: #6661

sql

  • [sql] [bug]

    修复了 CTE 构造中的问题,该问题主要与 ORM 用例相关,其中针对“匿名”标签(例如在 ORM column_property() 映射中看到的标签)的递归 CTE 将在 WITH RECURSIVE xyz(...) 部分中以其原始内部标签而不是干净的匿名名称渲染。

    参考链接: #6663

mypy

  • [mypy] [bug]

    修复了 mypy 插件中的问题,即自定义声明性基类的类信息在缓存的 mypy 传递中无法正确处理,从而导致引发 AssertionError。

    参考链接: #6476

asyncio

  • [asyncio] [usecase]

    实现了 async_scoped_session,以解决 scoped_sessionAsyncSession 之间的一些与 asyncio 相关的不兼容性,其中某些方法(特别是 async_scoped_session.remove() 方法)应与 await 关键字一起使用。

    参考链接: #6583

  • [asyncio] [bug] [postgresql]

    修复了 asyncio 实现中的一个错误,即 greenlet 适配系统无法将 BaseException 子类(最值得注意的是包括 asyncio.CancelledError)传播到引擎用于使连接无效并清理连接的异常处理逻辑,从而阻止在任务取消时正确处置连接。

    参考链接: #6652

postgresql

  • [postgresql] [bug] [oracle]

    修复了 PostgreSQL 和 Oracle 上的 INTERVAL 数据类型在与 timedelta() 对象进行比较操作时会产生 AttributeError 的问题。此拉取请求由 MajorDallas 提供。

    参考链接: #6649

  • [postgresql] [bug]

    修复了池 “pre ping” 功能会隐式启动事务的问题,当与 psycopg2 驱动程序一起使用 PostgreSQL 的 “read only” 模式等自定义事务标志时,这会造成干扰。

    参考链接: #6621

mysql

  • [mysql] [usecase]

    添加了新的构造 match,它提供了 MySQL MATCH 运算符的全部范围,包括多列支持和修饰符。此拉取请求由 Anton Kovalevich 提供。

    另请参阅

    match

    参考链接: #6132

mssql

  • [mssql] [change]

    改进了 pymssql 方言使用的服务器版本正则表达式,以防止在版本字符串无效的情况下发生正则表达式溢出。

    参考链接: #6253, #6503

  • [mssql] [bug]

    修复了 “schema_translate_map” 功能在与 INSERT 语句一起使用时无法正确运行的错误,该 INSERT 语句插入到具有 IDENTITY 列的表中,其中 IDENTITY 列的值在 INSERT 的值中指定,从而触发了 SQLAlchemy 的将 IDENTITY INSERT 设置为 “on” 的功能;正是在此指令中,模式转换映射无法被遵守。

    参考链接: #6658

1.4.18

发布日期: 2021年6月10日

orm

  • [orm] [bug]

    阐明了 relationship.bake_queries 标志的当前目的,在 1.4 版本中,它是启用或禁用 “lazyload” 和 “selectinload” 加载策略中语句的 “lambda 缓存”;这与用于大多数语句的更基础的 SQL 查询缓存是分开的。此外,惰性加载器不再为其多对一 SQL 查询使用自己的缓存,这是一个实现怪癖,在任何其他加载器场景中都不存在。最后,已删除了惰性加载器和 selectinloader 策略在处理各种类/关系组合时可能发出的 “lru cache” 警告;根据对一些最终用户案例的分析,此警告并未表明任何重大问题。虽然为此类关系设置 bake_queries=False 将从使用中删除此缓存,但在这种情况下,没有任何特定的性能提升,因为不使用缓存与使用需要经常刷新的缓存相比,可能仍然在使用缓存的一侧胜出。

    参考链接: #6072, #6487

  • [orm] [bug] [regression]

    调整了从基本 Session 类生成诸如 scoped_sessionAsyncSession 之类的类的方式,这样,诸如 Flask-SQLAlchemy 使用的自定义 Session 子类在调用超类方法时不需要实现位置参数,并且可以继续使用与以前版本相同的参数样式。

    参考链接: #6285

  • [orm] [bug] [regression]

    修复了针对涉及连接表继承的复杂左侧进行的 joinedload 查询生成可能无法生成正确查询的问题,这是由于子句适配问题造成的。

    参考链接: #6595

  • [orm] [bug] [performance] [regression]

    修复了涉及 ORM 如何将给定的映射列解析为结果行的回归问题,在诸如连接迫切加载的情况下,由于自 1.3 版本以来删除的一些逻辑,可能会发生稍微昂贵的 “回退” 来设置此解析。当将 1.4 风格的查询与连接迫切加载一起使用时,此问题还可能导致发出涉及列解析的弃用警告。

    参考链接: #6596

  • [orm] [bug]

    修复了实验性的 “从 INSERT/UPDATE 语句中选择 ORM 对象” 用例中的一个问题,即如果该语句是针对单表继承子类执行的,则会引发错误。

    参考链接: #6591

  • [orm] [bug]

    当多个关系在写入外键属性方面相互重叠时,为 relationship() 发出的警告现在包括用于每个警告的特定 “overlaps” 参数,以便在不更改映射的情况下消除警告。

    参考链接: #6400

asyncio

  • [asyncio] [usecase]

    实现了一个新的注册表架构,该架构允许在给定代理的 “sync” 对象(即 SessionConnection)的情况下,找到对象的 Async 版本,例如 AsyncSessionAsyncConnection 等。以前,如果使用此类查找函数,则每次都会重新创建 Async 对象,这不太理想,因为 “async” 对象的标识和状态不会跨调用保留。

    由此,添加了新的辅助函数 async_object_session(), async_session() 以及一个新的 InstanceState 属性 InstanceState.async_session,它们用于分别检索与 ORM 映射对象关联的原始 AsyncSession,与 AsyncSession 关联的 Session,以及与 InstanceState 关联的 AsyncSession

    此补丁还实现了新方法 AsyncSession.in_nested_transaction(), AsyncSession.get_transaction(), AsyncSession.get_nested_transaction()

    参考链接: #6319

  • [asyncio] [bug]

    修复了在使用 NullPoolStaticPool 与异步引擎一起使用时出现的问题。这主要影响 aiosqlite 方言。

    参考链接: #6575

  • [asyncio] [bug]

    添加了 asyncio.exceptions.TimeoutError, asyncio.exceptions.CancelledError 作为所谓的 “退出异常”,这是一类异常,包括诸如 GreenletExitKeyboardInterrupt 之类的事件,这些事件被认为是保证 DBAPI 连接处于不可用状态的事件,应回收该连接。

    参考链接: #6592

postgresql

  • [postgresql] [bug] [regression]

    修复了回归问题,即如果 PostgreSQL “INSERT..ON CONFLICT” 结构在 “executemany” 上下文中与 “SET” 子句中的绑定参数一起使用,则在使用 psycopg2 驱动程序时将无法工作,这是由于隐式使用了 psycopg2 快速执行助手,而这些助手不适用于此样式的 INSERT 语句;由于这些助手是 1.4 版本中的默认助手,因此这实际上是一个回归问题。已添加其他检查以将此类语句排除在该特定扩展之外。

    参考链接: #6581

sqlite

  • [sqlite] [bug]

    添加了关于在 url 中传递的 pysqlcipher 的加密相关编译指示的说明。

    此更改也反向移植到:1.3.25

    参考链接: #6589

  • [sqlite] [bug] [regression]

    版本 1.4.3 #5848 中发布的 pysqlcipher 修复程序不幸地无法工作,因为新的 on_connect_url 钩子在正常使用 create_engine() 的情况下错误地没有接收到 URL 对象,而是接收到了一个未处理的字符串;测试套件未能完全设置调用此钩子的实际条件。此问题已修复。

    参考链接: #6586

1.4.17

发布日期: 2021年5月29日

orm

  • [orm] [bug] [regression]

    修复了由刚刚发布的 #6550 中提到的性能修复引起的回归问题,即针对关系的 query.join() 如果查询仅针对非 ORM 结构进行,则可能会产生 AttributeError,这是一种相当不寻常的调用模式。

    参考链接: #6558

1.4.16

发布日期: 2021年5月28日

general

  • [general] [bug]

    解决了 Python 3.10.0b1 版本中出现的各种弃用警告。

    参考链接: #6540, #6543

orm

  • [orm] [bug]

    修复了当 relationship.cascade_backrefs 参数设置为 False 时出现的问题,根据 cascade_backrefs behavior deprecated for removal in 2.0,该参数将在 SQLAlchemy 2.0 中成为标准行为,其中如果对象已通过反向引用与该集合关联,则将项目添加到唯一化集合(如 setdict)将无法触发级联事件。此修复代表了集合机制的根本性变化,通过引入新的事件状态,即使集合上没有净更改,也可以触发集合突变;现在可以使用新的事件钩子 AttributeEvents.append_wo_mutation() 来适应此操作。

    参考链接: #6471

  • [orm] [bug] [regression]

    修复了涉及标记的 ORM 复合元素(例如具有条件或 CASE 表达式的单表继承鉴别器表达式)的子句适配回归问题,这可能会导致别名表达式(例如 ORM join/joinedload 操作中使用的表达式)无法正确适配,例如在 join 中的 ON 子句中引用错误的表。

    此更改还提高了在给定 ORM 属性作为目标的情况下,调用 Select.join() 的过程中的性能提升。

    参考链接: #6550

  • [orm] [bug] [regression]

    修复了当连接继承、全局 with_polymorphic、自引用关系和连接加载的完整组合无法生成带有延迟加载和对象刷新操作范围的查询,并且还尝试渲染连接加载器时的回归问题。

    参考链接: #6495

  • [orm] [bug]

    增强了 Session.execute() 的绑定解析规则,以便当非 ORM 语句(例如 insert() 构造)仍然是针对 ORM 对象构建时,在最大程度上,ORM 实体将被用于解析绑定。例如,对于在通用超类上设置了绑定映射,而映射中没有指定映射器或表的 Session

    参考链接: #6484

engine

  • [engine] [bug]

    修复了 URL 数据库部分中的 @ 符号,如果 URL 也包含 username:password 部分,则无法正确解析的问题。

    参考链接: #6482

  • [engine] [bug]

    修复了 URL 中长期存在的问题,即如果 URL 不包含带反斜杠的数据库部分,则问号后的查询参数无法正确解析。

    参考链接: #6329

sql

  • [sql] [bug] [regression]

    修复了动态加载器策略和 relationship() 的回归问题,其中 relationship.order_by 参数被存储为可变列表,当与动态查询对象一起使用的其他 “order_by” 方法结合使用时,可能会发生突变,导致 ORDER BY 标准持续重复增长。

    参考链接: #6549

mssql

  • [mssql] [usecase]

    实现了对 CTE 构造的支持,可以直接将其用作 delete() 构造的目标,即 “WITH … AS cte DELETE FROM cte”。这似乎是 SQL Server 的一个有用的功能。

    参考链接: #6464

misc

  • [bug] [ext]

    修复了在不传递现有 Base 的情况下使用 automap_base() 时发出的弃用警告。

    参考链接: #6529

  • [bug] [pep484]

    从代码中移除 pep484 类型。当前的工作重点是 stub 包,并且在两个地方都有类型定义会使事情变得更糟,因为 SQLAlchemy 源代码中的类型通常比 stubs 中的版本过时。

    参考链接: #6461

  • [bug] [ext] [regression]

    修复了 sqlalchemy.ext.instrumentation 扩展中的回归问题,该问题阻止了 instrumentation disposal 完全正常工作。此修复包括 1.4 的回归修复以及 1.3 中也存在的相关问题的修复。作为此更改的一部分,sqlalchemy.ext.instrumentation.InstrumentationManager 类现在有一个新的方法 unregister(),它取代了之前的方法 dispose(),该方法在 1.4 版本中没有被调用。

    参考链接: #6390

1.4.15

发布日期: 2021年5月11日

general

  • [general] [feature]

    在 SQLAlchemy 中,一种新的方法已被应用于警告系统,以动态准确地预测每个警告的适当堆栈级别。这使得评估 SQLAlchemy 生成的警告和弃用警告的来源更加直接,因为警告将指示最终用户代码中的源行,而不是 SQLAlchemy 自身源代码中的任意级别。

    参考链接: #6241

orm

  • [orm] [bug] [regression]

    修复了由 “在 unexpire 上运行 eager loaders” 功能 #1763 引起的额外回归问题,其中该功能会在 contains_eager() eagerload 选项的情况下运行,如果 contains_eager() 被链接到额外的 eager loader 选项,则会产生不正确的查询,因为原始查询绑定的连接标准不再存在。

    参考链接: #6449

  • [orm] [bug]

    修复了子查询加载器策略中阻止缓存正常工作的问题。这将在日志中显示为所有发出的 subqueryload SQL 的 “generated” 消息而不是 “cached”,这会用新键饱和缓存,从而降低整体性能;它还会产生 “LRU size alert” 警告。

    参考链接: #6459

sql

  • [sql] [bug]

    调整了在 1.4.12 版本中作为 #6397 的一部分添加的逻辑,以便 BindParameter 对象的内部突变发生在子句构造阶段,就像以前一样,而不是在编译阶段。在后一种情况下,突变仍然会对传入的构造产生副作用,并且还可能干扰其他内部突变例程。

    参考链接: #6460

mysql

  • [mysql] [bug] [documentation]

    在 mysql 连接 URI 中添加了对 ssl_check_hostname= 参数的支持,并更新了关于安全连接的 mysql 方言文档。原始 pull request 由 Jerry Zhao 提供。

    参考链接: #5397

1.4.14

发布日期: 2021年5月6日

orm

  • [orm] [bug] [regression]

    修复了涉及 lazy='dynamic' 加载器与分离对象结合使用的回归问题。之前的行为是,动态加载器在调用 .all() 等方法时,对于分离对象返回空列表而没有错误,这已被恢复;但是,现在会发出警告,因为这不是正确的结果。其他动态加载器场景会正确地引发 DetachedInstanceError

    参考链接: #6426

engine

  • [engine] [usecase] [orm]

    对在现有 .begin() 上下文管理器内部调用 .commit().rollback() 的用例应用了一致的行为,并在 commit 或 rollback 之后在块内添加了可能发出 SQL 的功能。此更改延续了最初在 #6155 中添加的更改,其中提出了在 .begin() 上下文管理器块内调用 “rollback” 的用例

    • 现在允许在所有范围内(包括传统和未来的 Engine、ORM Session、asyncio AsyncEngine)无错误或警告地调用 .commit().rollback()。以前,Session 禁止这样做。

    • 然后关闭上下文管理器的剩余范围;当块结束时,会发出检查以查看事务是否已结束,如果已结束,则块将不执行任何操作返回。

    • 如果在块内、 调用 .commit().rollback() 之后 发出任何类型的后续 SQL,则现在将引发错误。块应该被关闭,因为在这种状态下,可执行对象的状态将是未定义的。

    参考链接: #6288

  • [engine] [bug] [regression]

    为调用 CursorResult.keys() 方法(针对不返回行的语句)建立了一个弃用路径,以支持 “records” 包以及任何其他未迁移的应用程序使用的旧模式。以前,这会像尝试获取行时一样无条件地引发 ResourceClosedException。虽然这是未来的正确行为,但 LegacyCursorResult 对象现在在这种情况下将为 .keys() 返回一个空列表(就像在 1.3 中一样),同时也会发出 2.0 弃用警告。当使用 2.0 风格的 “future” engine 时,使用的 _cursor.CursorResult 将继续像现在这样引发异常。

    参考链接: #6427

sql

  • [sql] [bug] [regression]

    修复了由 #6397 1.4.12 中刚进行的 “empty in” 更改引起的回归问题,其中表达式需要为 “not in” 用例添加括号,否则条件会干扰其他过滤条件。

    参考链接: #6428

  • [sql] [bug] [regression]

    TypeDecorator 类在 SQL 编译中与缓存一起使用时,除非 .cache_ok 标志设置为 TrueFalse,否则现在会发出警告。可以设置新的类级别属性 TypeDecorator.cache_ok,如果设置为 True,则表示传递给对象的所有参数都可以安全地用作缓存键,False 表示它们不安全。

    参考链接: #6436

1.4.13

发布日期: 2021年5月3日

orm

  • [orm] [bug] [regression]

    修复了 selectinload 加载器策略中的回归问题,该问题会在处理跨多个列连接的关系(例如使用复合外键时)时导致其内部状态缓存不正确。无效的缓存然后会导致其他不相关的加载器操作失败。

    参考链接: #6410

  • [orm] [bug] [regression]

    修复了 Query.filter_by() 在前导实体是 SQL 函数或从相关主实体派生的其他表达式,而不是该实体的简单实体或列时无法工作的问题。此外,改进了 Select.filter_by() 的整体行为,使其即使在非 ORM 上下文中也能与列表达式一起使用。

    参考链接: #6414

  • [orm] [bug] [regression]

    修复了使用 selectinload()subqueryload() 加载两级深路径会导致属性错误的问题。

    参考链接: #6419

  • [orm] [bug] [regression]

    修复了在结合 “dynamic” 关系使用 noload() 加载器策略时会导致属性错误的问题,因为 noload 策略会尝试将其自身应用于动态加载器。

    参考链接: #6420

engine

  • [engine] [bug] [regression]

    恢复了 Connection 中无意中移除的旧事务行为,因为它在以前的版本中从未作为已知用例进行测试,即当没有事务存在时调用 Connection.begin_nested() 方法,根本不会创建 SAVEPOINT,而是启动外部事务,返回 RootTransaction 对象而不是 NestedTransaction 对象。然后,当提交时,此 RootTransaction 将在数据库连接上发出真正的 COMMIT。以前,2.0 风格的行为存在于所有会自动开始事务但不会提交它的情况中,这是一个行为上的改变。

    当使用 2.0 风格 连接对象时,行为与之前的 1.4 版本相比没有变化;调用 Connection.begin_nested() 将在外部事务(如果尚未存在)“自动开始”,然后按指示发出 SAVEPOINT,返回 NestedTransaction 对象。外部事务通过调用 Connection.commit() 提交,就像 “commit-as-you-go” 风格的用法一样。

    在非 “future” 模式下,虽然旧的行为被恢复,但它也会发出 2.0 弃用警告,因为这是一个遗留行为。

    参考链接: #6408

asyncio

  • [asyncio] [bug] [regression]

    修复了由 #6337 引入的回归问题,该问题会在任何 asyncio 循环启动之前实例化异步引擎时创建一个 asyncio.Lock,该 asyncio.Lock 可能会附加到错误的循环,从而导致在某些情况下尝试使用引擎时出现 asyncio 错误消息。

    参考链接: #6409

postgresql

1.4.12

发布日期: 2021年4月29日

orm

  • [orm] [bug]

    修复了当与持久对象一起使用时,Session.bulk_save_objects() 无法跟踪主键列名与属性名不同的映射的主键的问题。

    此更改也反向移植到:1.3.25

    参考链接: #6392

  • [orm] [bug] [caching] [regression]

    修复了关键回归问题,其中 SQL 缓存系统中使用的绑定参数跟踪可能无法跟踪所有参数,这种情况发生在 ORM 相关查询中使用包含参数的相同 SQL 表达式时(使用诸如类继承之类的功能),然后将其嵌入到封闭表达式中,该封闭表达式将多次使用相同的表达式,例如 UNION。ORM 会单独复制各个 SELECT 语句作为类继承编译的一部分,然后嵌入到封闭语句中将无法容纳所有参数。跟踪此情况的逻辑已调整为适用于参数的多个副本。

    参考链接: #6391

  • [orm] [bug]

    修复了主要影响 hybrid_property 的两个不同问题,这些问题在常见的错误配置场景中会显现出来,这些场景在 1.3 中被静默忽略,现在在 1.4 中失败,其中 “expression” 实现会返回非 ClauseElement,例如布尔值。对于这两个问题,1.3 的行为是静默忽略错误配置,并最终尝试将该值解释为 SQL 表达式,这将导致不正确的查询。

    • 修复了属性系统与 hybrid_property 交互的问题,其中如果属性的 __clause_element__() 方法返回非 ClauseElement 对象,则内部 AttributeError 会导致属性返回 hybrid_property 本身上的 expression 函数,因为属性错误是针对名称 .expression,这将调用 __getattr__() 方法作为回退。现在会明确地引发错误。在 1.3 中,非 ClauseElement 被直接返回。

    • 修复了 SQL 参数强制转换系统中的问题,其中如果对象完全不是 SQLAlchemy 对象(例如 Python 函数),则在对象不仅仅被强制转换为绑定值的情况下,将错误类型的对象传递给期望列表达式的方法将失败。同样,1.3 没有全面的参数强制转换系统,因此这种情况也会静默通过。

    参考链接: #6350

  • [orm] [bug]

    修复了在 ORM 上下文中使用 Select 作为子查询会就地修改 Select 以禁用该对象上的 eagerload,然后会导致如果该 Select 然后在顶级执行上下文中重复使用,则不会 eagerload 的问题。

    参考链接: #6378

  • [orm] [bug] [regression]

    修复了当现有持久化对象属性发生更改时,新的 autobegin 行为未能“自动开始”的问题,这会影响 Session.rollback() 的行为,因为没有创建快照以供回滚。“属性修改”机制已更新,以确保在持久化属性更改时,像调用 Session.add() 时一样,执行不执行任何数据库操作的 “autobegin”。这是一个回归问题,因为在 1.3 版本中,rollback() 方法始终有一个事务要回滚,并且每次都会过期。

    参考链接:#6359, #6360

  • [orm] [bug] [regression]

    修复了 ORM 中的回归问题,即使用混合属性来指示来自不同实体的表达式会混淆 ORM 中的列标签逻辑,并尝试从另一个类派生混合属性的名称,从而导致属性错误。混合属性的所有者类现在与其名称一起被跟踪。

    参考链接:#6386

  • [orm] [bug] [regression]

    修复了 hybrid_property 中的回归问题,即针对 SQL 函数的混合属性在尝试为子查询的 .c 集合生成条目时会生成 AttributeError;除其他外,这会影响其在诸如 Query.count() 之类的用例中的使用。

    参考链接:#6401

  • [orm] [bug] [dataclasses]

    调整了 dataclasses 的声明式扫描,以便在使用新的 dataclasses.field() 构造(而不是类上的描述符属性)内部的 declared_attr() 的 mixin 继承行为时,能够正确地处理目标映射类是现有映射类的子类的情况,而现有映射类已经映射了该 declared_attr(),因此不应再次应用于此类。

    参考链接:#6346

  • [orm] [bug]

    修复了 (在 1.4 版本中已弃用) ForeignKeyConstraint.copy() 方法在用 schema 参数调用时导致错误的问题。

    参考链接:#6353

engine

  • [engine] [bug]

    修复了当 Insert 构造包含多个 values 短语时,显式使用 Sequence 会产生不一致的“内联”行为的问题;第一个 seq 将是内联的,但随后的 seq 将是“预执行”的,从而导致不一致的序列排序。序列表达式现在完全是内联的。

    参考链接:#6361

sql

  • [sql] [bug]

    修订了 “EMPTY IN” 表达式,不再依赖于使用子查询,因为这导致了一些兼容性和性能问题。对于选定的数据库,新方法利用返回 NULL 的 IN 表达式,并结合通常的 “1 != 1” 或 “1 = 1” 表达式,通过 AND 或 OR 附加。该表达式现在是除 SQLite 之外的所有后端的默认表达式,SQLite 在元组 “IN” 方面对于较旧的 SQLite 版本仍然存在一些兼容性问题。

    第三方方言仍然可以通过实现新的编译器方法 def visit_empty_set_op_expr(self, type_, expand_op) 来覆盖 “空集” 表达式的呈现方式,该方法优先于现有的 def visit_empty_set_expr(self, element_types) 方法,后者仍然保留。

    参考链接:#6258, #6397

  • [sql] [bug] [regression]

    修复了回归问题,即在 Select 构造的 columns 子句中使用 text() 构造(最好使用 literal_column() 构造来处理),仍然会阻止诸如 union() 之类的构造正常工作。其他用例,例如构造子查询,继续像早期版本一样工作,其中 text() 构造被静默地从导出的列集合中省略。还修复了 ORM 中类似的用法。

    参考链接:#6343

  • [sql] [bug] [regression]

    修复了涉及诸如 Select.append_column() 之类的遗留方法的回归问题,这些方法会导致内部断言失败。

    参考链接:#6261

  • [sql] [bug] [regression]

    修复了由 #5395 引起的回归问题,其中在 select() 中回调序列检查现在导致在使用也恰好具有 __iter__() 方法的映射类进行 2.0 风格查询时失败。对检查进行了更多调整以适应这种情况以及其他一些有趣的 __iter__() 场景。

    参考链接:#6300

schema

  • [schema] [bug] [mariadb] [mysql] [oracle] [postgresql]

    确保 MySQL 和 MariaDB 方言在呈现创建表中的 AUTO_INCREMENT 关键字时忽略 Identity 构造。

    更新了 Oracle 和 PostgreSQL 编译器,如果数据库版本不支持 Identity(Oracle < 12 和 PostgreSQL < 10),则不呈现 Identity。之前,无论数据库版本如何,都会呈现它。

    参考链接:#6338

postgresql

sqlite

  • [sqlite] [usecase]

    对于使用 URI 文件名创建的内存 SQLite 数据库,默认使用 SingletonThreadPool。之前,默认使用的连接池是 NullPool,它阻止了多个引擎之间共享同一个数据库。

    参考链接:#6379

mssql

  • [mssql] [bug] [schema]

    sqlalchemy.dialects.mysql.BIT 列添加 TypeEngine.as_generic() 支持,将其映射到 Boolean

    参考链接:#6345

  • [mssql] [bug] [regression]

    修复了由 #6306 引起的回归问题,该问题添加了对 DateTime(timezone=True) 的支持,其中 pyodbc 驱动程序之前的行为(在将时区感知日期插入到时区朴素 DATETIME 列时隐式删除 tzinfo)丢失了,导致在将时区感知日期时间对象插入到时区朴素数据库列时出现 SQL Server 错误。

    参考链接:#6366

1.4.11

发布日期:2021 年 4 月 21 日

orm declarative

  • [orm] [declarative] [bug] [regression]

    修复了回归问题,最近对 Python dataclasses 的支持的更改产生了意外影响,即 ORM 映射类无法成功覆盖 __new__() 方法。

    参考链接:#6331

engine

  • [engine] [bug] [regression]

    修复了由 #5497 中的更改引起的严重回归问题,其中连接池 “init” 阶段不再在互斥隔离中发生,允许其他线程在方言未初始化的情况下继续执行,这可能会影响 SQL 语句的编译。

    参考链接:#6337

1.4.10

发布日期:2021 年 4 月 20 日

orm

  • [orm] [usecase]

    修改了在 #6232 中修复的某些行为,其中 immediateload 加载策略不再进入递归循环;修改之处在于,来自 A->bs->B 的 eager load(joinedload、selectinload 或 subqueryload),然后声明 immediateload 用于身份映射中的简单 manytoone B->a->A 将填充 B->A,以便在加载 A/A.bs 集合时回填此属性。这允许对象在分离时保持功能。

  • [orm] [bug]

    修复了新的 with_loader_criteria() 功能中的错误,其中将 mixin 类与 declared_attr() 一起使用在自定义 lambda 内部访问的属性上,会在首次初始化 lambda 可调用对象时发出关于使用未映射的声明属性的警告。现在,通过对此 lambda 初始化步骤使用特殊工具,可以防止此警告。

    参考链接:#6320

  • [orm] [bug] [regression]

    修复了由在 #1763 中添加的 “刷新时 eagerloader” 功能引起的其他回归问题,其中刷新操作在历史上会设置 populate_existing,鉴于新功能,当 autoflush 为 false 时,现在会覆盖 eager 加载对象上的挂起更改。populate_existing 标志已在此情况下关闭,并使用更具体的方法来确保刷新正确的属性。

    参考链接:#6326

  • [orm] [bug] [result]

    修复了在使用 2.0 风格执行时,在调用 Result.unique() 后,对于 ORM 在任何情况下都返回单元素行的情况,阻止使用 Result.scalar_one()Result.scalar_one_or_none() 的问题。

    参考链接:#6299

sql

  • [sql] [bug]

    修复了 SQL 编译器中的问题,其中为 Values 构造设置的绑定参数如果在 CTE 内部,则无法正确地进行位置跟踪,这会影响支持 VALUES + ctes 并使用位置参数的数据库驱动程序,特别是 SQL Server 以及 asyncpg。此修复程序还修复了对编译器标志(例如 literal_binds)的支持。

    参考链接:#6327

  • [sql] [bug]

    修复并巩固了关于自定义函数和其他任意表达式构造的问题,这些构造在 SQLAlchemy 的列标签机制中会尝试使用 str(obj) 来获取字符串表示形式,以用作子查询的 .c 集合中的匿名列名。这是一种非常旧的行为,性能不佳并导致许多问题,因此已对其进行修订,不再通过在 FunctionElement 上建立特定方法来处理这种情况来执行任何编译,因为 SQL 函数是唯一发挥作用的用例。此行为的一个效果是,在子查询的 .c 集合中,没有可派生名称的未标记列表达式将被赋予以前缀 "_no_label" 开头的任意标签;这些以前表示为该表达式的通用字符串化,或表示为内部符号。

    参考链接:#6256

schema

  • [schema] [bug]

    修复了 next_value() 没有从相应的 Sequence 派生其类型,而是硬编码为 Integer 的问题。现在使用特定的数字类型。

    参考链接:#6287

mypy

  • [mypy] [bug]

    修复了 mypy 插件无法正确解释显式的 Mapped 注释与通过字符串名称引用类的 relationship() 结合使用的问题;正确的注释将被降级为不太具体的注释,从而导致类型错误。

    参考链接:#6255

mssql

  • [mssql] [usecase]

    当设置为 True 时,DateTime.timezone 参数现在将在用于发出 DDL 时,对 SQL Server 使用 DATETIMEOFFSET 列类型,而不是 DATETIME,在 DATETIME 中,该标志被静默忽略。

    参考链接:#6306

misc

  • [bug] [declarative] [regression]

    修复了调用不存在的注册表方法的 instrument_declarative()

    参考链接:#6291

1.4.9

发布日期:2021 年 4 月 17 日

orm

  • [orm] [usecase]

    建立了对 synoynm() 结合混合属性的支持,完全设置了 associationproxy,包括可以建立链接到这些构造的同义词,并且可以完全正常工作。这是一种以前半显式地不允许的行为,但是由于它并非在所有情况下都失败,因此已添加对 assoc proxy 和混合属性的显式支持。

    参考链接:#6267

  • [orm] [bug] [performance] [regression] [sql]

    修复了一个严重的性能问题,其中 select() 构造的遍历会遍历作为 columns 子句中列引用的每个 FROM 子句的重复乘积;对于一系列具有大量列的嵌套子查询,这可能会导致大量延迟和显着的内存增长。这种遍历被各种 SQL 和 ORM 函数使用,包括 ORM Session 在配置为具有 “table-per-bind” 时使用,虽然这不是常见的用例,但这似乎是 Flask-SQLAlchemy 硬编码为使用的,因此该问题会影响 Flask-SQLAlchemy 用户。遍历已修复为唯一化 FROM 子句,这实际上是 1.4 之前的架构隐式发生的情况。

    参考链接:#6304

  • [orm] [bug] [regression]

    修复了回归问题,其中映射到 synonym() 的属性不能在列加载器选项(例如 load_only())中使用。

    参考链接:#6272

sql

  • [sql] [bug] [regression]

    修复了当使用 literal_binds=True 选项编译时,元组上的空 in 语句会导致错误的回归问题。

    参考链接:#6290

postgresql

  • [postgresql] [bug] [regression] [sql]

    修复了默认编译器和 PostgreSQL 编译器中的参数错误,该错误会干扰 UPDATE..FROM 或 DELETE..FROM..USING 语句,然后将其作为 CTE 进行 SELECT。

    参考链接:#6303

1.4.8

发布日期:2021 年 4 月 15 日

orm

  • [orm] [bug] [regression]

    修复了涉及 with_expression() 加载器选项的缓存泄漏,其中给定的 SQL 表达式不会被正确地视为缓存键的一部分。

    此外,修复了涉及相应 query_expression() 功能的回归问题。虽然该错误技术上也存在于 1.3 版本中,但直到 1.4 版本才暴露出来。null() 的 “default expr” 值会在不需要时呈现,并且在 ORM 重写语句(例如在使用 joined eager loading 时)时也没有正确地进行调整。此修复程序确保像 NULLtrue 这样的 “单例” 表达式不会 “适应” 以引用 ORM 语句中的列,并且还确保如果未使用 with_expression(),则没有默认表达式的 query_expression() 不会在语句中呈现。

    参考链接:#6259

  • [orm] [bug]

    修复了由 #1763 引入的 Session.refresh() 新功能中的问题,其中 eager 加载的关系也会被刷新,其中 lazy="raise"lazy="raise_on_sql" 加载策略会干扰 immediateload() 加载策略,从而破坏了使用 selectinload()subqueryload() 加载的关系的该功能。

    参考链接:#6252

engine

  • [engine] [bug]

    现在,如果将非 Connection 对象传递给 Dialect.has_table() 方法,它会引发一个信息丰富的异常,因为这种不正确的行为似乎很常见。 此方法不适合方言外部的外部使用。 请使用 Inspector.has_table() 方法,或为了与旧版本的 SQLAlchemy 兼容,请使用 Engine.has_table() 方法。

sql

  • [sql] [feature]

    现在,CursorResult.inserted_primary_key 返回的元组是一个 Row 对象,在现有的元组接口之上具有命名元组接口。

    参考: #3314

  • [sql] [bug] [regression]

    修复了回归错误,其中 BindParameter 对象在 IN 表达式中(即使用 1.4 中的 “post compile” 功能)如果该对象是从内部克隆操作或 pickle 操作复制而来,并且参数名称包含空格或其他特殊字符,则无法正确渲染。

    参考: #6249

  • [sql] [bug] [regression] [sqlite]

    修复了回归错误,其中某些后端不支持 INSERT 语法 “INSERT… VALUES (DEFAULT)”,但它们确实支持 “INSERT..DEFAULT VALUES”,包括 SQLite。 现在,每种方言分别支持或不支持这两种语法,例如,MySQL 支持 “VALUES (DEFAULT)”,但不支持 “DEFAULT VALUES”。 还启用了对 Oracle 的支持。

    参考: #6254

mypy

  • [mypy] [change]

    更新了 Mypy 插件,仅使用语义分析器的公共插件接口。

  • [mypy] [bug]

    修订了版本 1.4.7 中对 OrderingList 的修复,该修复针对的是不正确的 API。

    参考: #6205

asyncio

  • [asyncio] [bug]

    修复了阻止将 AsyncSessionbind 属性设置为正确值的拼写错误。

    参考: #6220

mssql

  • [mssql] [bug] [regression]

    修复了与 #6173, #6184 相同的区域中的另一个回归错误,其中将 OFFSET 的值 0 与 SQL Server 的 LIMIT 结合使用会创建一个使用 “TOP” 的语句,这与 1.3 中的行为相同,但由于缓存,随后将无法相应地响应 OFFSET 的其他值。 如果 “0” 不是第一个,则会没问题。 对于此修复,现在仅当完全省略 OFFSET 值时才发出 “TOP” 语法,即不使用 Select.offset()。 请注意,此更改现在要求,如果使用了 “with_ties” 或 “percent” 修饰符,则语句不能指定偏移量为零,现在需要完全省略它。

    参考: #6265

1.4.7

发布日期:2021 年 4 月 9 日

orm

  • [orm] [bug] [regression]

    修复了回归错误,其中如果子查询加载的 “路径” 超过一级深度,则 subqueryload() 加载器策略无法正确容纳子选项,例如列上的 defer() 选项。

    参考: #6221

  • [orm] [bug] [regression]

    修复了回归错误,其中 dogpile.caching 示例依赖的 merge_frozen_result() 函数未包含在测试中,并且由于不正确的内部参数而开始失败。

    参考: #6211

  • [orm] [bug] [regression]

    修复了关键回归错误,其中当在没有现有事务的情况下发生刷新时,Session 可能无法 “自动开始” 新事务,从而隐式地将 Session 置于旧版自动提交模式,该模式会提交事务。 除了修复刷新问题外,Session 现在还具有一项检查,可以防止这种情况发生。

    此外,缩减了作为 #5226 一部分所做的更改,该更改可以在取消过期操作期间运行自动刷新,但在使用旧版 Session Session.autocommit 模式的 Session 的情况下,实际上不执行此操作,因为这会在刷新操作中导致提交。

    参考: #6233

  • [orm] [bug] [regression]

    修复了回归错误,其中 ORM 编译方案会假设混合属性的函数名称与属性名称相同,以至于在尝试确定结果元组中每个元素的正确名称时会引发 AttributeError。 1.3 中也存在类似的问题,但仅影响元组行的名称。 此处的修复添加了一项检查,即混合属性的函数名称实际上是否存在于类或其超类的 __dict__ 中,然后再分配此名称; 否则,混合属性被认为是 “未命名的”,并且 ORM 结果元组将使用底层表达式的命名方案。

    参考: #6215

  • [orm] [bug] [regression]

    修复了由作为 #1763 一部分添加的新功能引起的关键回归错误,即在取消过期操作时调用急切加载器。 新功能使用 “immediateload” 急切加载器策略来代替集合加载策略,与其他 “post-load” 策略不同,该策略不适应相互依赖关系之间的递归调用,从而导致递归溢出错误。

    参考: #6232

engine

  • [engine] [bug] [regression]

    修复了对 Row 对象使用字典访问时的行为,这意味着通过 dict(row) 转换为字典或使用字符串或其他对象(即 row["some_key"])访问成员,其工作方式与字典相同,而不是像元组那样引发 TypeError,无论 C 扩展是否到位。 这最初应该为使用 LegacyRow 的 “非未来” 情况发出 2.0 弃用警告,并为 “未来” Row 类引发 TypeError。 但是,Row 的 C 版本未能引发此 TypeError,并且更复杂的是,Session.execute() 方法现在在所有情况下都返回 Row,以保持与 ORM 结果情况的一致性,因此对于现有的 1.4 之前的样式代码,未安装 C 扩展的用户在这种情况下会看到不同的行为。

    因此,为了缓和整体升级方案,因为大多数用户都没有接触过 1.4.6 之前的 Row 的更严格行为,LegacyRowRow 都提供了字符串键访问以及对 dict(row) 的支持,在所有情况下,当启用 SQLALCHEMY_WARN_20 时,都会发出 2.0 弃用警告。 Row 对象仍然对 __contains__ 使用类似元组的行为,这可能是与 LegacyRow 相比唯一明显的行为更改,除了删除了字典样式方法 values()items()

    参考: #6218

sql

  • [sql] [bug] [regression]

    增强了用于 ColumnOperators.in_() 操作的 “扩展” 功能,以从右侧的元素列表中推断表达式的类型(如果左侧没有任何显式类型设置)。 这允许表达式支持字符串化等功能。 在 1.3 中,“扩展” 未自动用于 ColumnOperators.in_() 表达式,因此从某种意义上说,此更改修复了行为回归。

    参考: #6222

  • [sql] [bug]

    修复了 “stringify” 编译器,以支持 “multirow” INSERT 语句的基本字符串化,即 VALUES 关键字后跟多个元组的语句。

schema

  • [schema] [bug] [regression]

    修复了回归错误,其中在 Connection.execution_options.schema_translate_map 字典中使用包含花括号等特殊字符的令牌将无法正确替换。 现在显式禁止使用方括号字符 [],因为它们在当前实现中用作分隔符字符。

    参考: #6216

mypy

  • [mypy] [bug]

    修复了 Mypy 插件中的问题,其中插件无法为不直接从 TypeEngine 派生的子类的列推断正确的类型,特别是 TypeDecoratorUserDefinedType 的列。

tests

  • [tests] [change]

    DefaultDialect 添加了一个名为 supports_schemas 的新标志; 第三方方言可以将此标志设置为 False,以便在为第三方方言运行测试套件时禁用 SQLAlchemy 的架构级测试。

1.4.6

发布日期:2021 年 4 月 6 日

orm

  • [orm] [bug] [regression]

    修复了回归错误,其中当使用 Query.join() 的已弃用形式时,在单个 Query.join() 调用中传递一系列要从中连接的实体而没有任何 ON 子句,将无法正常工作。

    参考: #6203

  • [orm] [bug] [regression]

    修复了关键回归错误,其中 ORM 中的 Query.yield_per() 方法会将内部 Result 设置为一次生成块,但使用了新的 Result.unique() 方法,该方法对整个结果进行去重。 这将导致行丢失,因为 ORM 使用 id(obj) 作为去重函数,这会导致新对象的重复标识符,因为已经看到的对象被垃圾回收。 1.3 在此处的行为是在每个块中 “去重”,当以块为单位生成结果时,实际上不会产生 “去重” 的结果。 由于在已启用连接急切加载时已明确禁止使用 Query.yield_per() 方法(这是 “去重” 功能的主要理由),因此当使用 Query.yield_per() 时,现在完全关闭 “去重” 功能。

    此回归错误仅适用于旧版 Query 对象; 当使用 2.0 样式 执行时,不会自动应用 “去重”。 为了防止因显式使用 Result.unique() 而引起问题,如果在也使用任何 yield per API 的情况下从 “去重” 的 ORM 级别 Result 中获取行,则现在会引发错误,因为 yield_per 的目的是允许任意大量的行,这些行无法在内存中去重,而不会增加条目数以适应完整的结果大小。

    参考: #6206

sql

  • [sql] [bug] [mssql] [oracle] [regression]

    修复了与 1.4.5 中发布的 #6173 相同区域中的进一步回归错误,其中 “postcompile” 参数(再次最常见的是用于 Oracle 和 SQL Server 中 LIMIT/OFFSET 渲染的参数)如果同一参数在语句中的多个位置渲染,则无法正确处理。

    参考: #6202

  • [sql] [bug]

    使用 Connection.execute() 执行 Subquery 已被弃用,并且将发出弃用警告; 此用例是一个疏忽,本应从 1.4 中删除。 该操作现在将直接执行底层的 Select 对象以实现向后兼容性。 同样,CTE 类也不适合执行。 在 1.3 中,尝试执行 CTE 会导致执行无效的 “空白” SQL 语句; 由于此用例不起作用,因此现在会引发 ObjectNotExecutableError。 以前,1.4 尝试将 CTE 作为语句执行,但这只是偶尔有效。

    参考: #6204

schema

  • [schema] [bug]

    如果实例化 Table 对象时未按位置传递至少 Table.nameTable.metadata 参数,则现在会引发信息性错误消息。 以前,如果将这些参数作为关键字参数传递,则对象将静默地初始化失败。

    此更改也反向移植到:1.3.25

    参考: #6135

mypy

  • [mypy] [bug]

    应用了一系列重构和修复,以适应跨多个文件的 Mypy “增量” 模式,以前未考虑此模式。 在此模式下,Mypy 插件必须适应从其他文件中传入的 Python 数据类型,这些数据类型的信息少于直接运行时的信息。

    此外,添加了一个新的装饰器 declarative_mixin(),这对于 Mypy 插件能够明确识别声明性混合类是必要的,否则该类不会在特定的 Python 文件中使用。

    参考: #6147

  • [mypy] [bug]

    修复了 Mypy 插件在关系的 “collection_class” 是可调用对象而不是类时无法解释它的问题。 还改进了面向集合的关系的类型匹配和错误报告。

    参考: #6205

asyncio

  • [asyncio] [usecase] [postgresql]

    为 asyncpg DBAPI 适配器引发的 SQLAlchemy 异常类的 .orig 属性添加了访问器 .sqlstate 和同义词 .pgcode,即包装在 asyncpg 库本身引发的异常对象之上的中间异常对象,但在 SQLAlchemy 方言级别之下。

    参考: #6199

1.4.5

发布日期:2021 年 4 月 2 日

orm

  • [orm] [bug] [regression]

    修复了回归错误,其中 joinedload() 加载器策略无法成功地连接加载到针对 CTE 构造映射的映射器。

    参考: #6172

  • [orm] [bug] [regression]

    缩减了在 #5171 中添加的警告消息,以避免在继承场景中出现重叠列时发出警告,其中特定关系是子类本地的,因此不表示重叠。

    参考: #6171

sql

  • [sql] [bug] [postgresql]

    修复了新的 FunctionElement.render_derived() 功能中的错误,其中在别名 SQL 中显式渲染的列名对于区分大小写的名称和其他非字母数字名称,未应用正确的引号。

    参考: #6183

  • [sql] [bug] [regression]

    修复了回归错误,其中使用 Operators.in_() 方法和 Select 对象针对非表绑定的列会产生 AttributeError,或者更一般地,在二进制表达式中使用没有数据类型的 ScalarSelect 会产生无效状态。

    参考: #6181

  • [sql] [bug]

    Dialect 类添加了一个名为 Dialect.supports_statement_cache 的新标志。 现在,此标志需要直接存在于方言类中,SQLAlchemy 的 查询缓存 才能对该方言生效。 其基本原理基于已发现的问题,例如 #6173,它揭示了从编译语句硬编码文字值的方言(通常是用于 LIMIT/OFFSET 的数值参数)在这些方言被修改为仅使用语句中存在的参数之前,将与缓存不兼容。 对于未应用此标志的第三方方言,SQL 日志记录将显示消息 “dialect does not support caching”,表明方言应在验证编译阶段内未渲染任何按语句文字值后,寻求应用此标志。

    参考: #6184

schema

  • [schema] [bug]

    Enum 类型中引入了一个新参数 Enum.omit_aliases,允许在使用 pep435 Enum 时过滤别名。 以前版本的 SQLAlchemy 在所有情况下都保留别名,创建具有附加状态的数据库枚举类型,这意味着它们在数据库中被视为不同的值。 为了向后兼容,此标志在 1.4 系列中默认为 False,但在未来版本中将切换为 True。 如果未指定此标志并且传递的枚举包含别名,则会引发弃用警告。

    参考链接:#6146

mypy

  • [mypy] [bug]

    修复了 mypy 插件中的问题,其中新添加的对 as_declarative() 的支持需要更完整地将 DeclarativeMeta 类添加到 mypy 解释器的状态,以便它不会导致找不到名称错误; 此外,改进了插件的全局名称设置方式,包括 Mapped 名称。

    参考: #sqlalchemy/sqlalchemy2-stubs/#14

asyncio

  • [asyncio] [bug]

    修复了在安装了 contextvars 的向后移植库的情况下,如果运行 Python 3.6,则无法加载 asyncio 扩展的问题。

    参考: #6166

postgresql

  • [postgresql] [bug] [regression]

    修复了由 #6023 引起的回归错误,其中当使用 psycopg2 时,应用于 ARRAY 中元素的 PostgreSQL 强制转换运算符在数据类型也嵌入在 Variant 适配器的实例中的情况下,将无法使用正确的类型。

    此外,修复了在使用 Variant(ARRAY(some_schema_type)) 时发出正确 CREATE TYPE 的支持。

    此更改也反向移植到:1.3.25

    参考: #6182

  • [postgresql] [bug]

    修复了在 1.4.4 中发布的 #6099 的修复中的拼写错误,该错误完全阻止了此更改正常工作,即错误消息与 pg8000 实际发出的消息不匹配。

    参考: #6099

  • [postgresql] [bug]

    修复了当针对 Engine 生成 PGInspector 时,对于 .get_enums().get_view_names().get_foreign_table_names().get_table_oid() 会失败的问题,当针对“future”风格的引擎而不是直接针对连接使用时。

    参考: #6170

mysql

  • [mysql] [bug] [回归]

    修复了 MySQL 方言中的回归,其中用于检测表是否存在的反射查询在非常旧的 MySQL 5.0 和 5.1 版本上会失败。

    参考: #6163

mssql

  • [mssql] [bug]

    修复了 MSSQL 2012+ 中的回归,该回归阻止了在子查询中使用 offset=0 时渲染 order by 子句。

    参考: #6163

oracle

  • [oracle] [bug] [回归]

    修复了关键回归,由于缓存问题,Oracle 编译器不会在 SELECT 的 LIMIT/OFFSET 中维护正确的参数值。

    参考: #6173

1.4.4

发布日期:2021 年 3 月 30 日

orm

  • [orm] [bug]

    修复了新的 PropComparator.and_() 功能中的关键问题,其中发出二级 SELECT 语句的加载器策略(例如 selectinload()lazyload())将无法容纳用户定义的条件中绑定参数,因为用户定义的条件是根据当前正在执行的语句而不是缓存的语句,从而导致使用过时的绑定值。

    此外,对于尝试序列化使用 lazyload()PropComparator.and_() 结合使用的对象的情况,添加了警告;加载器条件无法可靠地序列化和反序列化,在这种情况下应使用预先加载。

    参考: #6139

  • [orm] [bug] [回归]

    修复了 ScopedSession 接口中缺少的方法 Session.get()

    参考: #6144

engine

  • [engine] [usecase]

    修改了 Transaction 使用的上下文管理器,以便如果事务已在块内手动回滚,则上下文管理器本身的结束不会发出“已分离”警告。这适用于常规事务、保存点事务和旧版“标记”事务。如果显式调用 .rollback() 方法超过一次,仍然会发出警告。

    参考: #6155

  • [engine] [bug]

    修复了 CursorResult 中异常处理方法的错误参数。

    参考: #6138

postgresql

  • [postgresql] [bug] [reflection]

    修复了 PostgreSQL 反射中的问题,其中表达“NOT NULL”的列将取代相应域的可空性。

    此更改也向后移植到:1.3.24

    参考: #6161

  • [postgresql] [bug]

    修改了 pg8000 方言的 is_disconnect() 处理程序,现在它适应了 pg8000 1.19.0 发出的新的 InterfaceError。拉取请求由 Hamdi Burak Usul 提供。

    参考: #6099

misc

  • [misc] [bug]

    调整了 importlib_metadata 库的用法,用于加载 setuptools entrypoints,以适应一些弃用更改。

1.4.3

发布日期:2021 年 3 月 25 日

orm

  • [orm] [bug]

    修复了 python 2.7.5(CentOS 7 上的默认版本)无法导入 sqlalchemy 的错误,因为在此 Python 版本中 exec "statement"exec("statement") 的行为方式不同。而是使用了兼容性 exec_() 函数。

    参考: #6069

  • [orm] [bug]

    修复了以下错误:当属性中使用 Select.correlate_except() 来控制关联时,ORM 查询将关联子查询与 column_property() 结合使用,将无法正确关联到封闭子查询或 CTE,在子查询中包含与旨在不关联的相关子查询中相同的 selectable 的情况下。

    参考: #6060

  • [orm] [bug]

    修复了新的“relationship with criteria”功能的组合可能与使用新的“lambda SQL”功能的功能结合使用时失败的错误,包括加载器策略(例如 selectinload 和 lazyload),对于更复杂的情况(例如多态加载)。

    参考: #6131

  • [orm] [bug]

    修复了对 ClauseElement.params() 方法的支持,使其可以与 Select 对象正确配合使用,该对象包括跨 ORM 关系结构的连接,这是 1.4 中的新功能。

    参考: #6124

  • [orm] [bug]

    修复了关系加载器机制内部生成“removed in 2.0”警告的问题。

    参考: #6115

orm declarative

  • [orm] [declarative] [bug] [回归]

    修复了每个类级别的 .metadata 属性不被遵守的回归,破坏了抽象声明类和 mixin 的每个类层次结构的 MetaData 的用例。

    另请参阅

    metadata

    参考: #6128

engine

  • [engine] [bug] [回归]

    ResultProxy 名称恢复为 sqlalchemy.engine 命名空间。此名称指的是 LegacyCursorResult 对象。

    参考: #6119

schema

  • [schema] [bug]

    调整了为多个表的删除发出 Sequence 对象的 DROP 语句的逻辑,以便在所有表之后删除所有 Sequence 对象,即使给定的 Sequence 仅与 Table 对象相关,而不直接与整体 MetaData 对象相关。此用例支持同一 Sequence 一次与多个 Table 关联。

    此更改也向后移植到:1.3.24

    参考: #6071

mypy

  • [mypy] [bug]

    添加了对 Mypy 扩展的支持,以正确解释使用 as_declarative() 函数以及 registry.as_declarative_base() 方法生成的声明性基类。

  • [mypy] [bug]

    修复了 Mypy 插件中的错误,其中 Boolean 列类型的 Python 类型检测会产生异常;此外,还实现了对 Enum 的支持,包括检测基于字符串的枚举与使用 Python enum.Enum 的情况。

    参考: #6109

postgresql

  • [postgresql] [bug] [types]

    调整了 psycopg2 方言,以便为包含 ARRAY 元素的绑定参数发出显式的 PostgreSQL 风格的 cast。这允许各种数据类型在数组中正常工作。asyncpg 方言已在最终语句中生成了这些内部 cast。这还包括对数组切片更新以及 PostgreSQL 特定的 ARRAY.contains() 方法的支持。

    此更改也向后移植到:1.3.24

    参考: #6023

  • [postgresql] [bug] [reflection]

    修复了 PostgreSQL 中混合大小写名称的表中的 identity 列的反射。

    参考: #6129

sqlite

  • [sqlite] [feature] [asyncio]

    添加了对 aiosqlite 数据库驱动程序的支持,以用于 SQLAlchemy asyncio 扩展。

    另请参阅

    Aiosqlite

    参考: #5920

  • [sqlite] [bug] [回归]

    修复了 pysqlcipher 方言以正确连接,该方言在 1.4 中已回归,并添加了测试 + CI 支持以保持驱动程序处于工作状态。该方言现在默认导入 Python 3 的 sqlcipher3 模块,然后回退到 pysqlcipher3,后者被记录为现在已不再维护。

    另请参阅

    Pysqlcipher

    参考: #5848

1.4.2

发布日期:2021 年 3 月 19 日

orm

  • [orm] [usecase] [dataclasses]

    添加了对 declared_attr 对象在 dataclass 字段上下文中工作的支持。

    参考: #6100

  • [orm] [bug] [dataclasses]

    修复了新的 ORM dataclass 功能中的问题,其中抽象基类或 mixin 上包含列或其他映射结构的 dataclass 字段,如果它们在 dataclasses.field() 对象中也包含“default”键,则不会被映射。

    参考: #6093

  • [orm] [bug] [回归]

    修复了 Query.selectable 访问器的回归,它是 Query.__clause_element__() 的同义词,已被删除,现在已恢复。

    参考: #6088

  • [orm] [bug] [回归]

    修复了以下回归:如果查询本身正在为实体使用 joinedload,并且也正在被 joinedload 预先加载过程包装在子查询中,则使用未命名的 SQL 表达式(例如 SQL 函数)会引发列目标错误。

    参考: #6086

  • [orm] [bug] [回归]

    修复了以下回归:如果 Query.join() 方法已被使用,目标实体没有任何 ON 子句,则 Query.filter_by() 方法将无法找到正确的源实体。

    参考: #6092

  • [orm] [bug] [回归]

    修复了以下回归:如果 Function 对象已被“注释”(这是 ORM 主要使用的内部 memoization 过程),则其 SQL 编译将无法正常工作。特别是,它可能会影响 ORM 延迟加载,后者在 1.4 中更多地使用了此功能。

    参考: #6095

  • [orm] [bug]

    修复了以下回归:当映射的列名与鉴别器列名重叠时,ConcreteBase 将完全无法映射,从而产生断言错误。此处的用例在 1.3 中无法正常工作,因为多态联合将生成一个完全忽略鉴别器列的查询,同时发出重复的列警告。由于 1.4 的架构现在无法轻松重现 1.3 在 select() 级别上基本上已损坏的行为,因此该用例现在引发一条信息性错误消息,指示用户使用 .ConcreteBase._concrete_discriminator_name 属性来解决冲突。为了帮助进行此配置,.ConcreteBase._concrete_discriminator_name 可能仅放置在基类上,子类将自动使用它;以前情况并非如此。

    参考: #6090

engine

  • [engine] [bug] [回归]

    恢复了 sqlalchemy.engine.reflection 的顶层导入。这确保了 Inspector 基类已正确注册,以便 inspect() 适用于不导入此软件包的第三方方言。

sql

  • [sql] [bug] [回归]

    修复了以下问题:由于需要将名称的 Python 列表转换为元组,因此使用包含点分隔包名称的 func 将无法被 SQL 缓存系统缓存。

    参考: #6101

  • [sql] [bug] [回归]

    修复了 case() 构造中的回归,其中参数规范的“字典”形式如果以位置方式而不是作为“whens”关键字参数传递,则无法正常工作。

    参考: #6097

mypy

  • [mypy] [bug]

    修复了 MyPy 扩展中的问题,该问题在检测 Column 的类型时崩溃,如果该类型带有模块前缀(例如 sa.Integer())。

    参考: #sqlalchemy/sqlalchemy2-stubs/2

postgresql

  • [postgresql] [usecase]

    重命名了反射查询使用的列名,该查询在某些与 postgresql 兼容的数据库中使用了保留字。

    参考: #6982

1.4.1

发布日期:2021 年 3 月 17 日

orm

  • [orm] [bug] [回归]

    修复了以下回归:使用 ORM 实体生成 Core 表达式构造(例如 select())会急切地配置映射器,以努力保持与 Query 对象的兼容性,后者为了支持许多 backref 相关的旧版用例而必然会这样做。但是,core select() 构造也用于映射器配置等,并且在某种程度上,这种急切配置更像是一种不便,因此在缺少 ORM 加载类型的功能(例如 Load)的情况下,已禁用 select() 和其他 Core 构造的急切配置。

    此更改保持了 Query 的行为,以便保持向后兼容性。但是,当结合 ORM 实体使用 select() 时,除非调用了 configure_mappers() 或更新的 configure(),否则在映射器配置时间之前未显式放置在其中一个类上的“backref”将不可用。对于更显式的关系配置,请优先使用 relationship.back_populates,它没有急切配置要求。

    参考: #6066

  • [orm] [bug] [回归]

    修复了关系延迟加载器中的一个关键回归,其中用于获取相关多对一对象的 SQL 条件,如果映射器配置发生更改(例如,当映射器延迟配置或按需配置时可能发生),则可能相对于加载器中的其他 memoized 结构变得陈旧,从而产生与 None 的比较并且不返回任何对象。非常感谢 Alan Hamlett 在深夜帮助跟踪此问题。

    参考: #6055

  • [orm] [bug] [回归]

    修复了以下回归:如果 Query 的实体列表是任意 SQL 列表达式,则 Query.exists() 方法将无法创建表达式。

    参考: #6076

  • [orm] [bug] [回归]

    修复了以下回归:结合加载器选项(例如 joinedload())调用 Query.count() 将无法忽略加载器选项。这始终是 Query.count() 方法特有的行为;如果给定的 Query 具有不适用于其返回内容的选项,则通常会引发错误。

    参考: #6052

  • [orm] [bug] [回归]

    修复了 Session.identity_key() 中的回归,包括该方法和相关方法未包含在任何单元测试中,以及该方法包含阻止其正常运行的错字。

    参考: #6067

orm declarative

  • [orm] [declarative] [bug] [回归]

    修复了以下错误:当使用 DeclarativeMeta 时,包含名为“registry”的属性的用户映射类将导致与新的基于注册表的映射系统发生冲突。虽然该属性仍然可以显式设置在声明性基类上以供元类使用,但一旦找到它,它就会放置在私有类变量下,因此它不会与将来为其他目的使用相同名称的子类冲突。

    参考: #6054

engine

  • [engine] [bug] [回归]

    Python namedtuple() 具有以下行为:如果命名元组包含名称 countindex,则它们将用作元组值;如果它们不存在,则保留它们作为 collections.abc.Sequence 方法的行为。因此,RowLegacyRow 类已修复,以便它们以相同的方式工作,从而为具有名为“index”或“count”的列的数据库行维护预期的行为。

    参考: #6074

mssql

  • [mssql] [bug] [回归]

    修复了以下回归:启用了 pyodbc 可用的新 setinputsizes() API,这显然与 pyodbc 的 fast_executemany() 模式不兼容,在缺少更准确的类型信息的情况下,而更准确的类型信息尚未完全实现或测试。pyodbc 方言和连接器已修改,以便除非将参数 use_setinputsizes 传递给方言(例如通过 create_engine()),否则根本不使用 setinputsizes(),此时可以使用 DialectEvents.do_setinputsizes() hook 自定义其行为。

    另请参阅

    Setinputsizes 支持

    参考: #6058

misc

  • [bug] [回归]

    itemsvalues 添加回 ColumnCollection 类。回归是在为 #4753 工单中的 from 子句和 selectable 添加重复列支持时引入的。

    参考: #6068

1.4.0

发布日期:2021 年 3 月 15 日

orm

  • [orm] [bug]

    移除了一个非常旧的警告,该警告指出 passive_deletes 不适用于多对一关系。虽然在许多情况下,将此参数放在多对一关系上可能并非本意,但在某些用例中,可能需要禁止从此类关系产生的删除级联。

    此更改也向后移植到:1.3.24

    参考: #5983

  • [orm] [bug]

    修复了当其中一个表具有不相关的、无法解析的外键约束时,连接两个表的过程可能会失败的问题,这会在连接过程中引发 NoReferenceError,尽管如此,可以绕过该错误以完成连接。在此过程中测试异常重要性的逻辑会对可能失败的构造做出假设。

    此更改也向后移植到:1.3.24

    参考: #5952

  • [orm] [bug]

    修复了当父对象已加载,然后被后续查询覆盖时,MutableComposite 构造可能会进入无效状态的问题,这是因为复合属性的刷新处理程序将对象替换为新的对象,而该对象未由可变扩展处理。

    此更改也向后移植到:1.3.24

    参考: #6001

  • [orm] [bug]

    修复了回归问题,其中 relationship.query_class 参数对于“dynamic”关系不再起作用。AppenderQuery 仍然依赖于旧的 Query 类; 鼓励用户从使用“dynamic”关系迁移到使用 with_parent() 来代替。

    参考: #5981

  • [orm] [bug] [regression]

    修复了回归问题,其中如果查询本身和连接目标都针对 Table 对象,而不是映射类,则 Query.join() 将不会产生任何效果。这是一个更系统性问题的一部分,即如果生成的语句中不存在 ORM 实体,则旧的 ORM 查询编译器将无法从 Query 中正确使用。

    参考: #6003

  • [orm] [bug] [asyncio]

    AsyncSession.delete() 的 API 现在是 awaitable 的;此方法沿着关系级联,这些关系必须以类似于 AsyncSession.merge() 方法的方式加载。

    参考: #5998

  • [orm] [bug]

    当 flush 正在进行时,工作单元进程现在完全关闭所有 “lazy='raise'” 行为。虽然在某些情况下,UOW 有时会加载最终不需要的东西,但 lazy=”raise” 策略在这里没有帮助,因为用户通常对 flush 过程没有太多控制权或可见性。

    参考: #5984

engine

  • [engine] [bug]

    修复了 “schema_translate_map” 功能未能考虑直接执行 DefaultGenerator 对象(例如序列)的用例的错误,其中包括当 implicit_returning 被禁用时,为了生成主键值而 “预执行” 的情况。

    此更改也向后移植到:1.3.24

    参考: #5929

  • [engine] [bug]

    改进了引擎日志记录,以记录在 DBAPI 驱动程序处于 AUTOCOMMIT 模式时记录的 ROLLBACK 和 COMMIT。 这些 ROLLBACK/COMMIT 是库级别的,当 AUTOCOMMIT 生效时没有任何效果,但是记录下来仍然值得,因为这些指示了 SQLAlchemy 看到的 “事务” 分界。

    参考: #6002

  • [engine] [bug] [regression]

    修复了一个回归问题,其中连接池的 “reset agent” 在 Connection 关闭时没有真正被利用,并且还导致了某种程度上的浪费的双重回滚场景。引擎的较新架构已更新,以便当 Connection 在将连接返回池之前显式关闭事务时,将跳过连接池 “reset-on-return” 逻辑。

    参考: #6004

sql

  • [sql] [change]

    更改了 CTE 构造的编译,以便如果直接对 CTE 进行字符串化,在封闭的 SELECT 上下文之外,则返回表示内部 SELECT 语句的字符串; 这与 FromClause.alias()Select.subquery() 的行为相同。 以前,将返回一个空字符串,因为 CTE 通常在生成 SELECT 之后放置在 SELECT 之上,这在调试时通常会产生误导。

  • [sql] [bug]

    修复了对于使用 “format” 或 “pyformat” 绑定参数样式的方言,Operators.op()custom_op 构造的 “百分号转义” 功能未启用,用于使用百分号的自定义运算符的错误。 现在,百分号将根据 paramstyle 自动加倍。

    参考: #6016

  • [sql] [bug] [regression]

    修复了未知数据类型的 “不支持的编译错误” 无法正确引发的回归问题。

    参考: #5979

  • [sql] [bug] [regression]

    修复了回归问题,其中独立 distinct() 以直接 SELECT 的形式使用时,将无法通过列标识在结果集中定位,ORM 就是通过这种方式定位列的。 虽然独立 distinct() 并非旨在直接 SELECT(对于常规 SELECT DISTINCT..,请使用 select.distinct()),但它以前在这种方式下在有限程度上是可用的(例如,在子查询中不起作用)。 针对诸如 “DISTINCT <col>” 之类的unary表达式的列目标已得到改进,以便这种情况再次起作用,并且还进行了额外的改进,以便以子查询形式使用此形式至少可以生成有效的 SQL,而以前情况并非如此。

    此更改还增强了基于 ORM 启用的 SELECT 语句中的 SQL 表达式对象来定位 row._mapping 中元素的能力,包括语句是由 connection.execute() 还是 session.execute() 调用的。

    参考: #6008

schema

  • [schema] [bug] [sqlite]

    修复了由 BooleanEnum 生成的 CHECK 约束在第一次编译后无法正确呈现命名约定的问题,这是由于赋予约束的名称中意外的状态更改所致。 此问题最初在 0.9 中为修复问题 #3067 而引入,并且此修复修订了当时采取的方法,该方法似乎比需要的更复杂。

    此更改也向后移植到:1.3.24

    参考: #6007

  • [schema] [bug]

    修复/实施了对主键约束命名约定的支持,该约定使用列名/键/等作为约定的一部分。 特别是,这包括自动与 Table 关联的 PrimaryKeyConstraint 对象将在新的主键 Column 对象添加到表,然后再添加到约束时更新其名称。 现在可以容纳与此约束构造过程相关的内部故障模式,包括不存在列、不存在名称或存在空白名称。

    此更改也向后移植到:1.3.24

    参考: #5919

  • [schema] [bug]

    弃用了所有模式级别的 .copy() 方法,并重命名为 _copy()。 这些不是标准的 Python “copy()” 方法,因为它们通常依赖于在特定上下文中实例化,这些上下文作为可选关键字参数传递给方法。 Table.tometadata() 方法是为 Table 对象提供复制的公共 API。

    参考: #5953

mypy

  • [mypy] [feature]

    以新插件的形式添加了对 Mypy 的初步和实验性支持,该插件本身依赖于 SQLAlchemy 的新类型存根。 该插件允许声明性映射以其标准形式与 Mypy 兼容,并为映射类和实例提供类型支持。

    参考: #4609

postgresql

  • [postgresql] [usecase] [asyncio] [mysql]

    在 SQLAlchemy 模拟的 DBAPI 游标中,为 asyncpg 和 aiomysql 方言的 cursor.execute()cursor.executemany() 方法的范围添加了连接本地的 asyncio.Lock()。 这样做的理由是为了防止在连接在多个 awaitable 中同时使用时出现故障和损坏。

    虽然这种情况也可能发生在线程代码和非 asyncio 方言中,但我们预计这种使用在 asyncio 下会更常见,因为 asyncio API 鼓励这种使用。 然而,最好为每个并发的 awaitable 使用不同的连接,否则将无法实现并发。

    对于 asyncpg 方言,这样做是为了防止在调用 prepare()fetch() 之间的空间中,连接上的并发执行导致接口错误异常,并防止启动新事务时出现竞争条件。 其他 PostgreSQL DBAPI 在连接级别是线程安全的,因此这旨在提供类似的行为,在服务器端游标领域之外。

    对于 aiomysql 方言,互斥锁将提供安全性,以便语句执行和结果集获取(在连接级别上是两个不同的步骤)不会因同一连接上的并发执行而损坏。

    参考: #5967

  • [postgresql] [bug]

    修复了在某些条件下使用 aggregate_order_by 会返回 ARRAY(NullType) 的问题,从而干扰结果对象正确返回数据的能力。

    此更改也向后移植到:1.3.24

    参考: #5989

mssql

  • [mssql] [bug]

    修复了由过滤索引的反射引入的 MSSQL 2005 的反射错误。

    参考: #5919

misc

  • [usecase] [ext]

    添加了新参数 AutomapBase.prepare.reflection_options,以允许传递 MetaData.reflect() 选项,例如 only 或特定于方言的反射选项,例如 oracle_resolve_synonyms

    参考: #5942

  • [bug] [ext]

    sqlalchemy.ext.mutable 扩展现在使用与对象关联的 InstanceState 而不是对象本身来跟踪 “parents” 集合。 后一种方法要求对象是可哈希的,以便它可以位于 WeakKeyDictionary 内部,这违反了 ORM 的总体行为约定,即 ORM 映射的对象不需要提供任何特定的 __hash__() 方法,并且支持不可哈希的对象。

    参考: #6020

1.4.0b3

发布日期:2021 年 2 月 15 日

orm

  • [orm] [feature]

    2.0 风格 中使用的 ORM 现在可以通过在 ORM 上下文中将构造提供给 Select.from_statement(),从 UPDATE..RETURNING 或 INSERT..RETURNING 语句返回的行中返回 ORM 对象。

  • [orm] [bug]

    修复了新的 1.4/2.0 风格 ORM 查询中的问题,其中语句级标签样式不会保留在结果行使用的键中; 这已应用于 Core/ORM 列/会话与连接等的所有组合,以便从语句到结果行的链接在所有情况下都相同。 作为此更改的一部分,行中列表达式的标签已得到改进,即使在子查询中使用,也可以保留 ORM 属性的原始名称。

    参考: #5933

engine

  • [engine] [bug] [postgresql]

    继续 #5653 中所做的改进,以进一步支持绑定参数名称,包括针对列名生成的名称,用于包含冒号、括号和问号的名称,以及改进的测试支持,以便即使绑定参数名称是从列名自动派生的,也应该可以毫无问题地包含 psycopg2 的 “pyformat” 样式中的括号。

    作为此更改的一部分,asyncpg DBAPI 适配器(特定于 SQLAlchemy 的 asyncpg 方言)使用的格式已从使用 “qmark” paramstyle 更改为 “format”,因为对于使用 “format” 样式(即加倍百分号)的名称存在标准的和内部支持的 SQL 字符串转义样式,而不是对于使用 “qmark” 样式的问号的名称(其中 pep-249 或 Python 未定义转义系统)。

    参考: #5941

sql

  • [sql] [usecase] [postgresql] [sqlite]

    增强 OnConflictDoUpdateset_ 关键字以接受 ColumnCollection,例如来自 Selectable.c. 集合,或 .excluded 上下文对象。

    参考: #5939

  • [sql] [bug]

    修复了 “笛卡尔积” 断言未正确适应依赖于使用 LATERAL 从子查询连接到封闭上下文中的另一个子查询的表之间的连接的错误。

    参考: #5924

  • [sql] [bug]

    修复了 1.4 回归问题,其中 Function.in_() 方法未被测试覆盖,并且在所有情况下都无法正常运行。

    参考: #5934

  • [sql] [bug]

    修复了回归问题,其中 select() 函数对任意 iterable 的使用在纯列表之外不起作用。 此处的前向/后向兼容性逻辑现在检查更广泛的传入 “iterable” 类型,包括可以直接传递来自 selectable 的 .c 集合。 由 Oliver Rice 提供的 pull request。

    参考: #5935

1.4.0b2

发布日期:2021 年 2 月 3 日

general

  • [general] [bug]

    修复了一个 SQLite 源文件,该文件在其文档字符串内部具有非 ASCII 字符,但没有源编码,这是在 “INSERT..ON CONFLICT” 功能中引入的,这会在 Python 2 下导致失败。

platform

  • [platform] [performance]

    调整了一些与导入时内部类生成相关的元素,这些元素增加了导入库的时间与 1.3 相比的显着延迟。 现在,时间比 1.3 慢约 20-30%,而不是 200%。

    参考: #5681

orm

  • [orm] [usecase]

    ORMExecuteState.bind_mapperORMExecuteState.all_mappers 访问器添加到 ORMExecuteState 事件对象,以便处理程序可以响应 ORM 语句执行中涉及的目标 mapper 和/或映射类或类。

  • [orm] [usecase] [asyncio]

    添加了 AsyncSession.scalar()AsyncSession.get() 以及对 sessionmaker.begin() 的支持,使其可以用作 AsyncSession 的异步上下文管理器。 还添加了 AsyncSession.in_transaction() 访问器。

    参考: #5796, #5797, #5802

  • [orm] [changed]

    Mapper “配置”(发生在 configure_mappers() 函数中)现在组织为基于每个注册表。 例如,这允许配置特定声明性基类中的 mapper,但不配置内存中也存在的另一个基类的 mapper。 目标是通过仅为需要的 mapper 集运行 “配置” 过程来提供一种减少应用程序启动时间的方法。 这还添加了 registry.configure() 方法,该方法将仅为特定注册表中的本地 mapper 运行配置。

    参考: #5897

  • [orm] [bug]

    为映射类或字符串映射类名称传递给 relationship.secondary 的情况添加了全面的检查和信息丰富的错误消息。 这是一个极其常见的错误,需要明确的消息。

    此外,为类注册表解析添加了一条新规则,即关于 relationship.secondary 参数,如果映射类及其表具有相同的字符串名称,则在解析此参数时将优先选择 Table。 在所有其他情况下,如果类和表共享相同的名称,则该类继续被优先选择。

    此更改也 向后移植 到:1.3.21

    参考: #5774

  • [orm] [bug]

    修复了涉及 ORM 事件(例如 InstanceEvents.load())的 restore_load_context 选项的错误,这样该标志将不会传递给在首次建立事件处理程序后映射的子类。

    此更改也 向后移植 到:1.3.21

    参考: #5737

  • [orm] [bug] [regression]

    修复了新的 Session 中的问题,该问题类似于 Connection 中的问题,即如果在 SessionEvents.after_transaction_create() 事件钩子中执行 SQL,则新的 “autobegin” 逻辑可能会被触发进入重入(递归)状态。

    参考链接: #5845

  • [orm] [bug] [unitofwork]

    改进了单元操作拓扑排序系统,使得拓扑排序现在基于输入集的排序是确定性的,而输入集本身现在在映射器级别进行排序,因此受影响的映射器的相同输入应每次都产生相同的输出,这在彼此之间没有任何依赖关系的映射器/表之间也是如此。 这进一步减少了死锁的可能性,正如在刷新期间观察到的那样,刷新会在多个不相关的表之间执行 UPDATE,从而生成行锁。

    参考链接: #5735

  • [orm] [bug]

    修复了回归问题,即 Bundle.single_entity 标志即使未设置也会对 Bundle 生效。 此外,此标志是遗留的,因为它仅对 Query 对象而不是 2.0 风格的执行有意义。 当与新式执行一起使用时,会发出弃用警告。

    参考链接: #5702

  • [orm] [bug]

    修复了回归问题,即针对普通 selectable 创建 aliased 构造并包含名称会引发 assertionerror。

    参考链接: #5750

  • [orm] [bug]

    与 Core 中 lambda 标准系统的修复相关,在 ORM 中为 with_loader_criteria() 功能以及 SessionEvents.do_orm_execute() 事件处理程序实施了各种修复,该事件处理程序通常与 [ticket:5760] 结合使用

    • 修复了如果给定的实体或基类在其下降类层次结构中包含未映射的 mixin,with_loader_criteria() 函数会失败的问题 [ticket:5766]

    • with_loader_criteria() 功能现在对于 ORM “refresh” 操作(包括延迟或过期的列属性的加载)以及显式操作(如 Session.refresh())的情况无条件禁用。 这些加载必然基于主键标识,其中永远不适合添加额外的 WHERE 子句。 [ticket:5762]

    • 添加了新的属性 ORMExecuteState.is_column_load,以指示 SessionEvents.do_orm_execute() 处理程序,特定操作是主键导向的列属性加载,不应添加额外的条件。 如上所述,with_loader_criteria() 函数现在在任何情况下都会忽略这些。 [ticket:5761]

    • 修复了 ORMExecuteState.is_relationship_load 属性对于许多延迟加载以及所有 selectinloads 未正确设置的问题。 该标志对于测试是否应将选项添加到语句中,或者它们是否已通过关系加载传播至关重要。 [ticket:5764]

    参考链接: #5760, #5761, #5762, #5764, #5766

  • [orm] [bug]

    修复了 1.4 回归问题,即结合内部调整的 SQL 元素(在继承场景中很常见)的查询使用 Query.having() 会因不正确的函数调用而失败。 拉取请求由 esoh 提供。

    参考链接: #5781

  • [orm] [bug]

    修复了一个问题,即根据多年来的文档,使用 sqlalchemy.ext.compiles 扩展创建自定义可执行 SQL 构造的 API,如果仅使用 Executable, ClauseElement 作为基类,则无法再工作,如果想要使用 Session.execute(),则需要额外的类。 这已得到解决,因此不再需要这些额外的类。

  • [orm] [bug] [regression]

    修复了 ORM 单元操作回归问题,其中错误的 “assert primary_key” 语句干扰了主键生成序列,这些序列实际上并未考虑表中的列以使用真实的主键约束,而是使用 Mapper.primary_key 来建立某些列作为“主键”。

    参考链接: #5867

orm declarative

  • [orm] [declarative] [feature]

    为 Declarative 添加了一个备用解析方案,该方案将从 dataclasses.Field 对象的 “metadata” 字典中提取 SQLAlchemy 列或映射属性。 这允许将完整的声明式映射与数据类字段结合使用。

    参考链接: #5745

engine

  • [engine] [feature]

    方言特定的构造,例如 Insert.on_conflict_do_update(),现在可以就地字符串化,而无需指定显式方言对象。 这些构造在被调用以进行 str()print() 等操作时,现在具有内部方向来调用其适当的方言,而不是不知道如何字符串化这些构造的 “default” 方言。 该方法也适用于通用模式级别的创建/删除,例如 AddConstraint,它将使其字符串化方言适应其中元素指示的方言,例如 ExcludeConstraint 对象。

  • [engine] [feature]

    添加了新的执行选项 Connection.execution_options.logging_token。 此选项将向 Connection 在执行语句时生成的日志消息添加额外的每消息令牌。 此令牌不是记录器名称本身的一部分(该部分可以使用现有的 create_engine.logging_name 参数影响),因此适用于临时连接使用,而不会产生创建许多新记录器的副作用。 该选项可以在 ConnectionEngine 级别设置。

    参考链接: #5911

  • [engine] [bug] [sqlite]

    修复了 Engine 的 2.0 “future” 版本中的错误,其中在 EngineEvents.begin() 事件钩子期间发出 SQL 会由于 autobegin 导致重入(递归)条件,从而影响为 SQLite 记录的允许保存点和可序列化隔离支持的配方等。

    参考链接: #5845

  • [engine] [bug] [oracle] [postgresql]

    调整了 cx_Oracle、asyncpg 和 pg8000 方言依赖的 “setinputsizes” 逻辑,以支持包含覆盖 TypeDecorator.get_dbapi_type() 方法的 TypeDecorator

  • [engine] [bug]

    将 “future” 关键字添加到 engine_from_config() 函数已知的单词列表中,以便在使用诸如 sqlalchemy.future = truesqlalchemy.future = false 之类的键时,可以将值 “true” 和 “false” 配置为 “boolean” 值。

sql

  • [sql] [feature]

    实现了对 “表值函数” 的支持,以及 PostgreSQL 支持的其他语法,这是最常见的功能请求之一。 表值函数是返回值列表或行的 SQL 函数,在 PostgreSQL 的 JSON 函数领域中很普遍,其中 “表值” 通常称为 “record” 数据类型。 表值函数也受 Oracle 和 SQL Server 支持。

    添加的功能包括

    另请参阅

    表值函数 - 在 SQLAlchemy 统一教程

    参考链接: #3566

  • [sql] [usecase]

    现在可以链式调用多个 “returning”,例如 Insert.returning(),以向 RETURNING 子句添加新列。

    参考链接: #5695

  • [sql] [usecase]

    添加了 Select.outerjoin_from() 方法来补充 Select.join_from()

  • [sql] [usecase]

    调整了 Compiler 的 “literal_binds” 功能,以便为值为 None 的绑定参数呈现 NULL,无论是显式传递还是省略。 之前的错误消息 “bind parameter without a renderable value” 已删除,并且缺失或 None 值现在将在所有情况下呈现 NULL。 以前,由于内部重构,NULL 的呈现开始发生在 DML 语句中,但并非显式包含在测试覆盖率中,现在已包含在其中。

    虽然没有引发错误,但当上下文位于列比较的上下文中,并且运算符不是 “IS”/“IS NOT” 时,会发出警告,表明从 SQL 的角度来看,这通常不是很有用。

    参考链接: #5888

  • [sql] [bug]

    修复了新的 Select.join() 方法中的问题,其中从当前 JOIN 链接没有查看正确的状态,导致表达式类似于 “FROM a JOIN b <onclause>, b JOIN c <onclause>” 而不是 “FROM a JOIN b <onclause> JOIN c <onclause>”。

    参考链接: #5858

  • [sql] [bug]

    当在 “SQLALCHEMY_WARN_20” 模式下将纯字符串传递给 Session.execute() 时,会发出弃用警告。

    参考链接: #5754

  • [sql] [bug] [orm]

    基于用户反馈,对 使用 Lambdas 为语句生成带来显着的速度提升 中引入的 “lambda SQL” 功能进行了各种修复,重点是在 with_loader_criteria() 功能中的使用,这是最突出的使用场景 [ticket:5760]

    • 修复了 lambda 的闭包变量中引用的布尔值 True/False 值会导致失败的问题。 [ticket:5763]

    • 修复了 lambda 中嵌入的 Python 函数生成绑定值时无法正常工作的检测; 这种情况可能不受支持,因此会引发信息丰富的错误,在这种情况下,应在 lambda 本身之外调用该函数。 新文档已添加,以进一步详细说明此行为。 [ticket:5770]

    • lambda 系统默认情况下现在完全拒绝在 lambda 的闭包变量中使用非 SQL 元素,其中错误建议两种选择,要么显式忽略不是 SQL 参数的闭包变量,要么指定一组特定的值,这些值基于哈希值被视为缓存键的一部分。 这至关重要地防止了 lambda 系统假定 lambda 闭包中的任意对象适用于缓存,同时也默认拒绝忽略它们,从而防止了它们的状态可能不恒定并对生成的 SQL 构造产生影响的情况。 错误消息很全面,并且已添加新文档以进一步详细说明此行为。 [ticket:5765]

    • 修复了针对 SQL 元素列表(例如 literal() 对象)的 in_() 表达式无法正确容纳的边缘情况的支持。 [ticket:5768]

    参考链接: #5760, #5763, #5765, #5768, #5770

  • [sql] [bug] [mysql] [postgresql] [sqlite]

    现在,如果再次调用一组选定的 DML 方法(当前都是 Insert 构造的一部分),则会引发信息丰富的错误消息,这将隐式取消先前的设置。 更改的方法包括:on_conflict_do_updateon_conflict_do_nothing (SQLite)、on_conflict_do_updateon_conflict_do_nothing (PostgreSQL)、on_duplicate_key_update (MySQL)

    参考链接: #5169

  • [sql] [bug]

    修复了新的 Values 构造中的问题,其中传递对象元组会回退到每个值的类型检测,而不是利用直接传递给 ValuesColumn 对象,该对象告诉 SQLAlchemy 期望的类型。 这将导致枚举和 numpy 字符串等对象出现问题,但这实际上是不必要的,因为已给出期望的类型。

    参考链接: #5785

  • [sql] [bug]

    修复了当在对象上内部访问 .bind 属性时(尤其是在字符串化 SQL 构造时)会错误地发出 RemovedIn20Warning 的问题。

    参考链接: #5717

  • [sql] [bug]

    SequenceIdentity 对象中正确呈现 cycle=Falseorder=FalseNO CYCLENO ORDER

    参考链接: #5722

  • [sql]

    用显式的 getter 和 setter GenerativeSelect.get_label_style()GenerativeSelect.set_label_style() 替换 Query.with_labels()GenerativeSelect.apply_labels(),以适应三种受支持的标签样式:LABEL_STYLE_DISAMBIGUATE_ONLYLABEL_STYLE_TABLENAME_PLUS_COLLABEL_STYLE_NONE

    此外,对于 Core 和 “future style” ORM 查询,LABEL_STYLE_DISAMBIGUATE_ONLY 现在是默认标签样式。 此样式与现有的 “no labels” 样式不同,因为它在列名冲突的情况下应用标签; 使用 LABEL_STYLE_NONE,重复的列名在任何情况下都无法通过名称访问。

    对于标签很重要的情况,即子查询的 .c 集合能够明确地引用所有列,LABEL_STYLE_DISAMBIGUATE_ONLY 的行为现在对于跨 Core 和 ORM 的所有 SQLAlchemy 功能都足够了,这些功能涉及此行为。 自 SQLAlchemy 1.0 以来的结果集行通常在位置上与列构造对齐。

    对于使用 Query 的旧版 ORM 查询,LABEL_STYLE_TABLENAME_PLUS_COL 应用的表加列名标签样式继续使用,以便现有测试套件和日志记录工具默认情况下看不到行为的更改。

    参考链接: #4757

schema

asyncio

  • [asyncio] [usecase]

    The AsyncEngine, AsyncConnectionAsyncTransaction 对象可以使用 Python 的 ==!= 进行比较,这将基于它们代理的“同步”对象来比较两个给定的对象。这很有用,特别是在 AsyncTransaction 的情况下,AsyncTransaction 的多个实例可以代理到同一个同步的 Transaction,并且实际上是等价的。AsyncConnection.get_transaction() 方法目前每次都会返回一个新的代理 AsyncTransaction,因为 AsyncTransaction 在其他方面与其原始的 AsyncConnection 没有状态关联。

  • [asyncio] [bug]

    调整了 greenlet 集成,该集成在 SQLAlchemy 中为 Python asyncio 提供了支持,以适应 Python contextvars(在 Python 3.7 中引入)的处理,适用于大于 0.4.17 的 greenlet 版本。Greenlet 版本 0.4.17 以向后不兼容的方式添加了对 contextvars 的自动处理;我们已与 greenlet 作者协调,在 0.4.17 之后的版本中为此添加了首选 API,现在 SQLAlchemy 的 greenlet 集成支持该 API。对于 0.4.17 之前的 greenlet 版本,不需要行为更改,版本 0.4.17 本身已从依赖项中阻止。

    参考文献: #5615

  • [asyncio] [bug]

    AsyncSession 实现了“连接绑定”,即能够传递一个 AsyncConnection 来创建一个 AsyncSession。以前,此用例未实现,并且在传递连接时将使用关联的引擎。这修复了“将会话加入到外部事务”用例无法为 AsyncSession 正确工作的问题。此外,添加了方法 AsyncConnection.in_transaction(), AsyncConnection.in_nested_transaction(), AsyncConnection.get_transaction(), AsyncConnection.get_nested_transaction()AsyncConnection.info 属性。

    参考文献: #5811

  • [asyncio] [bug]

    修复了 asyncio 连接池中的错误,其中将引发 asyncio.TimeoutError 而不是 TimeoutError。还修复了在使用异步引擎时 create_engine.pool_timeout 参数设置为零时的问题,以前这将忽略超时并阻塞,而不是像常规 QueuePool 那样立即超时。

    参考文献: #5827

  • [asyncio] [bug] [pool]

    当使用 asyncio 引擎时,连接池现在将分离并丢弃一个池化连接,该连接在其跟踪对象被垃圾回收时未显式关闭/返回到池,并发出警告,指示连接未正确关闭。由于此操作发生在 Python gc 终结器期间,因此对连接运行任何 IO 操作(包括事务回滚或连接关闭)是不安全的,因为这通常会在事件循环之外。

    异步 dpapi 上默认使用的 AsyncAdaptedQueue 应该仅在首次使用时实例化队列,以避免将其绑定到可能错误的事件循环。

    参考文献: #5823

  • [asyncio]

    SQLAlchemy 异步模式现在检测到并引发信息性错误,当使用不兼容 asyncio 的 DBAPI 时。将标准 DBAPI 与异步 SQLAlchemy 一起使用将导致它像任何同步调用一样阻塞,从而中断正在执行的 asyncio 循环。

postgresql

  • [postgresql] [usecase]

    ExcludeConstraint 对象添加了新的参数 ExcludeConstraint.ops,以支持使用此约束指定运算符类。拉取请求由 Alon Menczer 提供。

    此更改也 向后移植 到:1.3.21

    参考文献: #5604

  • [postgresql] [usecase]

    为 asyncpg 方言的 DBAPI 适配层添加了读/写 .autocommit 属性。这样,当使用需要直接与 DBAPI 连接一起使用“autocommit”的 DBAPI 特定方案时,与 psycopg2 和 pg8000 一起使用的相同 .autocommit 属性可用。

  • [postgresql] [changed]

    修复了 psycopg2 方言会静默传递 use_native_unicode=False 标志的问题,而在 Python 3 下实际上没有任何效果,因为 psycopg2 DBAPI 在 Python 3 下无条件地使用 Unicode。当在 Python 3 下使用时,此用法现在会引发 ArgumentError。添加了对 Python 2 的测试支持。

  • [postgresql] [performance]

    通过在每个连接的基础上缓存 asyncpg PreparedStatement 对象,提高了 asyncpg 方言的性能。对于在池化连接集上使用相同语句的测试用例,这似乎可以提高 10-20% 的速度。缓存大小是可调整的,也可以禁用。

    另请参阅

    预处理语句缓存

  • [postgresql] [bug] [mysql]

    修复了 1.3.2 中为 PostgreSQL 方言引入的回归,也复制到了 1.3.18 中 MySQL 方言的功能,其中使用非 Table 构造(例如 text())作为 Select.with_for_update.of 的参数,将无法在 PostgreSQL 或 MySQL 编译器中正确容纳。

    此更改也 向后移植 到:1.3.21

    参考文献: #5729

  • [postgresql] [bug]

    修复了一个小的回归,其中即使服务器版本信息被检测为低于 8.2 版本,也会发出“show standard_conforming_strings”的查询,以前它只会发生在服务器版本 8.2 或更高版本的情况下。该查询在 Amazon Redshift 上失败,Amazon Redshift 报告的 PG 服务器版本低于此值。

    参考文献: #5698

  • [postgresql] [bug]

    建立了对 Column 对象以及 ORM instrumented 属性作为传递给 Insert.on_conflict_do_update()Insert.on_conflict_do_update() 方法的 set_ 字典中的键的支持,这些键匹配目标 Table.c 集合中的 Column 对象。以前,只期望字符串列名;列表达式将被假定为表外表达式,它将完全呈现并发出警告。

    参考链接: #5722

  • [postgresql] [bug] [asyncio]

    修复了 asyncpg 方言中的错误,其中在“commit”期间或不太可能在“rollback”期间发生的故障应取消整个事务;不再可能发出回滚。以前,连接将继续等待无法成功的回滚,因为 asyncpg 会拒绝它。

    参考文献: #5824

mysql

  • [mysql] [feature]

    在使用 asyncio SQLAlchemy 扩展时,添加了对 aiomysql 驱动程序的支持。

    另请参阅

    aiomysql

    参考文献: #5747

  • [mysql] [bug] [reflection]

    修复了在 MariaDB 上反射服务器默认值时,仅当该值包含小数点时,反射会无法正确反射的问题,从而导致反射的表缺少任何服务器默认值。

    此更改也 向后移植 到:1.3.21

    参考文献: #5744

sqlite

  • [sqlite] [usecase]

    为 SQLite 实现了 INSERT… ON CONFLICT 子句。拉取请求由 Ramon Williams 提供。

    参考文献: #4010

  • [sqlite] [bug]

    当使用 sqlite 时,使用 python re.search() 而不是 re.match() 作为 Column.regexp_match() 方法使用的操作。这与其他数据库上的正则表达式以及众所周知的 SQLite 插件的行为相匹配。

    参考文献: #5699

mssql

  • [mssql] [bug] [datatypes] [mysql]

    当使用 Comparator.as_float() 方法从 JSON 字符串中提取浮点和/或十进制值时,小数精度和行为得到了改进,当 JSON 字符串中的数值具有许多有效数字时;以前,MySQL 后端会截断具有许多有效数字的值,而 SQL Server 后端会由于 DECIMAL 强制转换的有效数字不足而引发异常。现在,这两个后端都使用与 FLOAT 兼容的方法,该方法不为浮点值硬编码有效数字。对于精度数值,添加了一个新的方法 Comparator.as_numeric(),它接受精度和小数位数的参数,并将返回值作为 Python Decimal 对象返回,且不进行浮点转换,假设 DBAPI 支持它(pysqlite 除外)。

    参考文献: #5788

oracle

  • [oracle] [bug]

    修复了由于 #5755 引起的回归,该回归为 Oracle 实现了隔离级别支持。据报告,许多 Oracle 帐户实际上没有查询 v$transaction 视图的权限,因此此功能已更改为在数据库连接失败时优雅地回退,其中方言将假定“READ COMMITTED”是默认隔离级别,就像 SQLAlchemy 1.3.21 之前的情况一样。但是,显式使用 Connection.get_isolation_level() 方法现在必须引发异常,因为具有此限制的 Oracle 数据库明确禁止用户读取当前隔离级别。

    此更改也 向后移植 到: 1.3.22

    参考文献: #5784

  • [oracle] [bug]

    Oracle 两阶段事务在基本级别上不再被弃用。在收到 cx_Oracle 开发人员的支持后,我们可以为基本的 xid + begin/prepare 支持提供一些限制,这将在即将发布的 cx_Oracle 版本中更全面地工作。目前不支持两阶段“恢复”。

    参考文献: #5884

  • [oracle] [bug]

    Oracle 方言现在使用 select sys_context( 'userenv', 'current_schema' ) from dual 来获取默认模式名称,而不是 SELECT USER FROM DUAL,以适应 Oracle 下会话本地模式名称的更改。

    参考文献: #5716

tests

  • [tests] [usecase] [pool]

    改进了文档并为亚秒级池超时添加了测试。拉取请求由 Jordan Pittier 提供。

    参考文献: #5582

misc

  • [usecase] [pool]

    引擎连接例程的内部机制已更改,因此现在可以保证,当使用 insert=True 建立 PoolEvents.connect() 处理程序的用户定义事件处理程序时,将允许运行一个事件处理程序,该处理程序肯定在任何特定于方言的初始化启动之前被调用,最值得注意的是,当它执行检测默认模式名称之类的操作时。以前,这在大多数情况下会发生,但不是无条件地发生。模式文档中添加了一个新示例,说明如何在连接时事件中建立“默认模式名称”。

    参考文献: #5497, #5708

  • [bug] [reflection]

    修复了当反射相关表时,内部调用现已弃用的 autoload 参数的错误。

    参考文献: #5684

  • [bug] [pool]

    修复了当使用关键字(最值得注意的是 insert=True)指定连接池事件时,事件在设置时会丢失的回归。这将阻止需要在方言级事件之前触发的启动事件正常工作。

    参考文献: #5708

  • [bug] [pool] [pypy]

    修复了在 pypy 下,如果检出的连接在未关闭的情况下超出范围,连接池将不会将连接返回到池或在垃圾回收时以其他方式完成的问题。这是一个长期存在的问题,由于 pypy 在 GC 行为上的差异,如果弱引用终结器相对于另一个也正在被垃圾回收的对象,则不会调用它们。现在维护对相关记录的强引用,以便弱引用具有强引用的“基础”来触发。

    参考文献: #5842

1.4.0b1

发布日期: 2020 年 11 月 2 日

general

  • [general] [change]

    “python setup.py test”不再是测试运行器,因为这已被 Pypa 弃用。请使用 “tox” 且不带参数进行基本测试运行。

    参考文献: #4789

  • [general] [bug]

    重构了用于交叉导入模块(这些模块之间具有相互依赖关系)的内部约定,使得函数和方法的检查参数不再被修改。这允许 pylint、Pycharm、其他代码检查器以及未来添加的假设 pep-484 实现能够正常工作,因为它们不再看到函数调用的参数缺失。新方法也更简单且性能更高。

    参考文献: #4656, #4689

platform

  • [platform] [change]

    使用 importlib_metadata 库扫描 setuptools entrypoints,而不是 pkg_resources。由于 importlib_metadata 是一个小型库,包含在 Python 3.8 及更高版本中,因此对于 Python 3.8 之前的版本,兼容性库作为依赖项安装。

    参考文献: #5400

  • [platform] [change]

    安装已现代化,使用 setup.cfg 进行大多数包元数据。

    参考文献: #5404

  • [platform] [removed]

    放弃了对已达到 EOL 的 python 3.4 和 3.5 的支持。SQLAlchemy 1.4 系列需要 python 2.7 或 3.6+。

    参考文献: #5634

  • [platform] [removed]

    删除了与支持 Jython 和 zxJDBC 相关的所有方言代码。SQLAlchemy 多年来一直不支持 Jython,并且当前的 zxJDBC 代码预计根本无法正常工作;目前,它只是占用空间,并通过在文档中显示而增加混乱。目前,Jython 似乎已在其版本中实现了 Python 2.7 支持,但未实现 Python 3 支持。如果 Jython 要再次获得支持,它应该采取的形式是针对 Python 3 版本的 Jython,并且各种后端的各种 zxJDBC stubs 应作为第三方方言实现。

    参考文献: #5094

orm

  • [orm] [feature]

    ORM 现在可以使用直接使用 select() 构造生成的查询,这些查询以前仅在使用 Query 时可用。一个新的系统,通过该系统,ORM “插件”可以在 Core Select 中建立自身,允许以前在 Query 内部的大部分查询构建逻辑现在发生在 Select 的编译级扩展中。对于 UpdateDelete 构造也进行了类似的更改。当使用 Session.execute() 调用构造时,现在在方法中执行 ORM 相关的工作。对于 Select,返回的 Result 对象现在包含 ORM 级别的实体和结果。

    参考文献: #5159

  • [orm] [feature]

    添加了在查询中为关系属性生成的 ON 子句添加任意条件的功能,这适用于诸如 Query.join() 之类的方法以及加载器选项(如 joinedload())。此外,选项的“全局”版本允许将限制条件全局应用于查询中的特定实体。

    参考文献: #4472

  • [orm] [feature]

    ORM Declarative 系统现在已统一到 ORM 本身中,在 sqlalchemy.orm 下有新的导入空间和新的映射种类。现在支持基于装饰器的映射(无需使用基类)、对可以访问声明式类注册表以进行关系映射的经典样式 mapper() 调用的支持,以及 Declarative 与第三方类属性系统(如 dataclassesattrs)的完全集成。

    参考文献: #5508

  • [orm] [feature]

    当在映射器上或通过查询选项配置时,急切加载器(例如 joined loading、SELECT IN loading 等)现在将在过期对象上的刷新期间被调用;在 selectinload 和 subqueryload 的情况下,由于额外的加载仅针对单个对象,因此在这些情况下使用“immediateload”方案,该方案类似于延迟加载发出的单父查询。

    参考文献: #1763

  • [orm] [feature]

    添加了对直接映射使用 Python dataclasses 装饰器定义的 Python 类的支持。此拉取请求由 Václav Klusák 提供。这项新功能集成到声明式级别的新支持中,以支持诸如 dataclassesattrs 之类的系统。

    参考链接: #5027

  • [orm] [feature]

    为 ORM 映射列添加了 “raiseload” 功能,通过 defer.raiseload 参数作用于 defer()deferred()。这为列表达式映射的属性提供了与 raiseload() 选项对关系映射属性类似的行为。此更改还包括关于延迟加载列过期的一些行为更改;详情请参阅迁移说明。

    参考链接: #4826

  • [orm] [usecase]

    在 ORM 批量更新和删除中用于 synchronize_session=”evaluate” 的评估器现在支持 IN 和 NOT IN 运算符。也支持元组 IN。

    参考链接: #1653

  • [orm] [usecase]

    增强了逻辑,用于跟踪当关系写入同一列时是否会相互冲突,以包括两个关系之间应具有“反向引用(backref)”的简单情况。这意味着,如果两个关系不是 viewonly,没有使用 back_populates 链接,并且不以其他方式处于继承的兄弟/覆盖安排中,并且将填充相同的外键列,则会在映射器配置时发出警告,警告可能发生冲突。添加了一个新的参数 relationship.overlaps,以适应那些非常罕见的情况,即这种重叠的持久性安排可能是不可避免的。

    参考链接: #5171

  • [orm] [usecase]

    ORM 批量更新和删除操作,历史上通过 Query.update()Query.delete() 方法以及 UpdateDelete 构造函数(用于 2.0 风格 执行)提供,现在将自动适应单表继承鉴别器所需的额外 WHERE 条件,以便将语句限制为引用特定子类型的行。新的 with_loader_criteria() 构造函数也支持批量更新/删除操作。

    参考链接: #3903, #5018

  • [orm] [usecase]

    更新了关系中的 relationship.sync_backref 标志,使其在 viewonly=True 关系中隐式为 False,从而防止同步事件。

    参考链接: #5237

  • [orm] [change]

    调整了当刷新一个待处理对象,而其标识在身份映射中已存在的情况,以发出警告,而不是抛出 FlushError 异常。理由是为了让刷新继续进行并引发 IntegrityError 异常,就像现有对象未在身份映射中存在时一样。这有助于使用 IntegrityError 作为捕获表中是否已存在行的方案。

    参考链接: #4662

  • [orm] [change] [sql]

    选择的核心和 ORM 查询对象现在在编译步骤中执行更多的 Python 计算任务,而不是在构造时。这是为了支持即将到来的缓存模型,该模型将基于从语句构造派生的缓存键提供编译语句结构的缓存,而语句构造本身预计每次使用时都会在 Python 代码中重新构造。这意味着这些对象的内部状态可能与以前不同,并且各种参数验证的一些但并非全部错误引发场景将在编译/执行阶段而不是在语句构造时发生。有关完整详细信息,请参阅下面链接的迁移说明。

  • [orm] [change]

    对于新的 2.0 风格 的 ORM 查询,客户端行自动去重功能已关闭。这提高了清晰度和性能。但是,当使用连接迫切加载集合时,客户端行去重通常是必要的,因为对于集合中的每个元素,主实体都会有重复项,因为使用了连接。现在必须手动启用此去重功能,并且可以使用新的 Result.unique() 修饰符来实现。为了避免静默失败,当 2.0 风格的 ORM 查询的结果使用连接加载集合时,ORM 显式要求调用此方法。在任何情况下,对于集合的迫切加载,更新的 selectinload() 策略可能是更可取的。

    参考链接: #4395

  • [orm] [change]

    当要求将 select() 构造隐式强制转换为子查询时,ORM 现在会发出警告。这发生在诸如 Query.select_entity_from()Query.select_from() 方法以及 with_polymorphic() 函数中。当 SelectBase(这是由 select() 生成的)或 Query 对象直接传递给这些函数和其他函数时,ORM 通常通过调用 SelectBase.alias() 方法自动将它们强制转换为子查询(现在已被 SelectBase.subquery() 方法取代)。有关更多详细信息,请参阅下面链接的迁移说明。

    参考链接: #4617

  • [orm] [change]

    Query 返回的 “KeyedTuple” 类现在被核心 Row 类取代,其行为方式与 KeyedTuple 相同。在 SQLAlchemy 2.0 中,核心和 ORM 都将使用相同的 Row 对象返回结果行。在此期间,核心使用向后兼容类 LegacyRow,该类维护了以前由 “RowProxy” 使用的映射/元组混合行为。

    参考链接: #4710

  • [orm] [performance]

    批量更新和删除方法 Query.update()Query.delete(),以及它们的 2.0 风格对应物,现在在使用 “fetch” 策略时,会使用 RETURNING 来获取受影响的主键标识列表,而不是发出单独的 SELECT 语句(当使用的后端支持 RETURNING 时)。此外,在普通情况下,“fetch” 策略不会使已更新的属性过期,而是会直接应用更新后的值,就像 “evaluate” 策略一样,以避免不得不刷新对象。“evaluate” 策略也会回退到使已更新为 Python 中不可评估的 SQL 表达式的属性过期。

  • [orm] [performance] [postgresql]

    在 ORM 刷新过程中实现了对 psycopg2 execute_values() 扩展的支持,通过 #5401 中对核心的增强功能,以便此扩展既可以用作批量处理 INSERT 语句的策略,也可以在多个参数集中使用 RETURNING 来批量检索主键值。这使得 ORM 代表 PostgreSQL 发出的大部分 INSERT 语句都可以批量提交,并且还可以通过 execute_values() 扩展提交,对于此特定后端,该扩展的性能比普通的 executemany() 快五倍。

    参考链接: #5263

  • [orm] [bug]

    针对映射继承子类的查询,该子类还使用 Query.select_entity_from() 或类似技术来提供现有的子查询以从中进行 SELECT,如果给定的子查询返回的实体与给定的子类不对应(即,它们是同一层次结构中的兄弟类或超类),现在会引发错误。以前,这些会无错误地返回。此外,如果继承映射是单继承映射,则给定的子查询必须应用适当的过滤来针对多态鉴别器列,以避免此错误;以前,Query 会将此条件添加到外部查询,但这会干扰某些也返回其他类型实体的查询。

    参考链接: #5122

  • [orm] [bug]

    内部属性符号 NO_VALUE 和 NEVER_SET 已统一,因为这两个符号之间没有有意义的区别,除了在一些代码路径中它们以微妙且未记录的方式区分,这些已得到修复。

    参考链接: #4696

  • [orm] [bug]

    修复了在针对 select() 构造的映射器上指定的版本控制列(其中 version_id_col 本身针对底层表)在访问时会产生额外加载的错误,即使值已由刷新本地持久化。实际的修复是 #4617 中更改的结果,因为 select() 对象不再具有 .c 属性,因此不会混淆映射器,使其认为存在未知的列值。

    参考链接: #4194

  • [orm] [bug]

    如果实例是未映射的对象,则现在为 InstrumentedAttribute 引发 UnmappedInstanceError 异常。在此之前,会引发 AttributeError 异常。此拉取请求由 Ramon Williams 提供。

    参考链接: #3858

  • [orm] [bug]

    Session 对象在构造时或前一个事务关闭后不再立即启动 SessionTransaction 对象;相反,“自动开始(autobegin)”逻辑现在在下次需要时按需启动新的 SessionTransaction。理由包括从已关闭的 Session 中删除引用循环,以及消除因创建通常立即丢弃的 SessionTransaction 对象而产生的开销。此更改影响 SessionEvents.after_transaction_create() 钩子的行为,事件将在 Session 首次需要 SessionTransaction 时发出,而不是在创建 Session 或关闭上一个 SessionTransaction 时发出。Engine 和数据库本身之间的交互保持不变。

    参考链接: #5074

  • [orm] [bug]

    为 ORM 查询上下文添加了新的实体目标定位功能,以帮助处理 Session 使用绑定字典而不是单个绑定来绑定映射类的情况,并且 Query 针对最终从诸如 Query.subquery() 之类的方法生成的 Core 语句的情况。最初使用深度搜索实现,当前方法利用统一的 select() 构造来跟踪作为构造一部分的第一个映射器。

    参考链接: #4829

  • [orm] [bug] [inheritance]

    如果在 with_polymorphic() 中,selectableflat 参数都设置为 True,则现在会引发 ArgumentError 异常。可选名称已别名,应用 flat=True 会用匿名名称覆盖可选名称,这在以前会导致代码中断。此拉取请求由 Ramon Williams 提供。

    参考链接: #4212

  • [orm] [bug]

    修复了多态加载内部的问题,该问题会在某些非过期场景中,结合使用 “with_polymorphic” 时,回退到更昂贵、即将被弃用的结果列查找形式。

    参考链接: #4718

  • [orm] [bug]

    如果在 relationship() 上设置了任何与持久性相关的 “cascade” 设置,并且还设置了 viewonly=True,则会引发错误。“cascade” 设置现在仅在也设置了 viewonly 时,才默认为与非持久性相关的设置。这是 #4993 的延续,在该问题中,此设置在 1.3 中已更改为发出警告。

    参考链接: #4994

  • [orm] [bug]

    改进了声明式继承扫描,以避免在基类列表中多次出现相同的基类时出现错误。

    参考链接: #4699

  • [orm] [bug]

    修复了 ORM 版本控制功能中的错误,其中,如果先前的值已过期,则针对映射的可选对象配置的计数器显式分配 version_id(其中 version_id_col 针对底层表)将失败;这是因为映射的属性未配置 active_history=True。

    参考链接: #4195

  • [orm] [bug]

    如果 ORM 加载了主键存在但鉴别器列为 NULL 的多态实例的行,则现在会引发异常,因为鉴别器列不应为 null。

    参考链接: #4836

  • [orm] [bug]

    访问新创建对象上的面向集合的属性不再改变 __dict__,但仍然返回一个空集合,这始终是这种情况。这使得面向集合的属性在与返回 None 的标量属性进行比较时工作方式一致,但也不会改变 __dict__。为了适应集合被改变的情况,每次最初创建后都会返回相同的空集合,并且当它被改变时(例如,附加、添加等项目),它会被移动到 __dict__ 中。这消除了 ORM 中只读属性访问的最后一个改变副作用。

    参考链接: #4519

  • [orm] [bug]

    如果过期的属性列表包含一个或多个使用 Session.expire()Session.refresh() 方法显式过期或刷新的属性,则刷新过期对象现在将触发自动刷新。这是试图在许多情况下不希望自动刷新时可能发生的属性的正常非过期,与属性被显式过期或刷新的情况之间找到一个折衷方案,并且这些属性可能依赖于会话中需要刷新的其他待处理状态。这两个方法现在还获得了一个新的标志 Session.expire.autoflushSession.refresh.autoflush,默认为 True;当设置为 False 时,这将禁用在这些属性的非过期时发生的自动刷新。

    参考链接: #5226

  • [orm] [bug]

    relationship.cascade_backrefs 标志的行为将在 2.0 中反转并无条件设置为 False,以便反向引用不会将保存更新操作从正向分配级联到反向分配。当参数保留其默认值 True 并且实际发生此类级联操作时,会发出 2.0 弃用警告。可以通过在特定的 relationship() 上将标志设置为 False 来始终建立新行为,或者更普遍地,可以通过将 Session.future 标志设置为 True 来在全局范围内设置。

    参考链接: #5150

  • [orm] [deprecated]

    Query 以及动态关系加载器使用的 “切片索引” 功能在 SQLAlchemy 2.0 中将不再接受负索引。这些操作效率不高,并且会加载整个集合,这既令人惊讶又不可取。除非设置了 Session.future 标志,否则这些操作将在 1.4 中发出警告,如果设置了该标志,则会引发 IndexError。

    参考链接: #5606

  • [orm] [deprecated]

    不传递 QueryContext 调用 Query.instances() 方法已弃用。此方法的最初用例是,当仅给出要选择的实体以及 DBAPI cursor 对象时,Query 可以生成 ORM 对象。但是,为了使其正确工作,存在从 SQLAlchemy ResultProxy 传递的基本元数据,该元数据是从映射的列表达式派生的,最初来自 QueryContext。要从任意 SELECT 语句检索 ORM 结果,应使用 Query.from_statement() 方法。

    参考链接: #4719

  • [orm] [deprecated]

    在 ORM 操作(如 Query.join())中使用字符串表示关系名称,以及在加载器选项(如 selectinload())中使用字符串表示所有 ORM 属性名称已被弃用,并将在 SQLAlchemy 2.0 中移除。应传递类绑定的属性。这为给定的方法提供了更好的特异性,允许诸如 of_type() 之类的修饰符,并降低了内部复杂性。

    此外,aliasedfrom_joinpoint 参数在 Query.join() 中也已被弃用。aliased() 构造现在提供了极大的灵活性和功能,应直接使用。

    参考链接: #4705, #5202

  • [orm] [已弃用]

    Query.distinct() 中已弃用的逻辑,该逻辑会自动将 ORDER BY 子句中的列添加到 columns 子句中;这将在 2.0 版本中移除。

    参考链接: #5134

  • [orm] [已弃用]

    将关键字参数传递给诸如 Session.execute() 等方法,以便传递到 Session.get_bind() 方法中已弃用;应改为传递新的 Session.execute.bind_arguments 字典。

    参考链接: #5573

  • [orm] [已弃用]

    eagerload()relation() 是旧的别名,现已弃用。请分别使用 joinedload()relationship()

    参考链接: #5192

  • [orm] [已移除]

    所有长期弃用的“扩展”类都已被移除,包括 MapperExtension、SessionExtension、PoolListener、ConnectionProxy、AttributeExtension。这些类自 0.7 版本以来已被弃用,早已被事件监听器系统取代。

    参考链接: #4638

  • [orm] [已移除]

    移除已弃用的加载器选项 joinedload_all, subqueryload_all, lazyload_all, selectinload_all。应使用带有方法链的普通版本来代替它们。

    参考链接: #4642

  • [orm] [已移除]

    移除已弃用的函数 comparable_property。请参考 hybrid 扩展。这也移除了声明式扩展中的函数 comparable_using

    移除已弃用的函数 compile_mappers。请使用 configure_mappers()

    移除已弃用的方法 collection.linker。请参考 AttributeEvents.init_collection()AttributeEvents.dispose_collection() 事件处理程序。

    移除已弃用的方法 Session.prune 和参数 Session.weak_identity_map。请参阅 Session 引用行为 中的配方,了解维护强身份引用的基于事件的方法。此更改还移除了类 StrongInstanceDict

    移除已弃用的参数 mapper.order_by。使用 Query.order_by() 来确定结果集的排序。

    移除已弃用的参数 Session._enable_transaction_accounting

    移除已弃用的参数 Session.is_modified.passive

    参考链接: #4643

engine

  • [engine] [特性]

    实现了一个全新的 Result 对象,取代了之前的 ResultProxy 对象。正如在 Core 中实现的那样,子类 CursorResult 具有与之前的 ResultProxy 兼容的调用接口,并且还添加了大量新功能,这些功能可以应用于 Core 结果集以及 ORM 结果集,现在它们已集成到同一模型中。Result 包括诸如列选择和重新排列、改进的 fetchmany 模式、去重以及可用于从内存结构创建数据库结果的各种实现。

    另请参阅

    新的 Result 对象

    参考链接: #4395, #4959, #5087

  • [engine] [特性] [orm]

    SQLAlchemy 现在在 Core 和 ORM 中都包含了对 Python asyncio 的支持,使用了包含的 asyncio 扩展。该扩展利用 greenlet 库来适配 SQLAlchemy 面向同步的内部结构,从而使最终与 asyncio 数据库适配器交互的 asyncio 接口成为可能。目前支持的唯一驱动程序是用于 PostgreSQL 的 asyncpg 驱动程序。

    参考链接: #3414

  • [engine] [特性] [alchemy2]

    实现了 create_engine.future 参数,该参数启用了与 SQLAlchemy 2 的向前兼容性。用于与 SQLAlchemy 2 实现向前兼容性。此引擎具有始终事务性的行为,并带有自动开始事务。

    参考链接: #4644

  • [engine] [特性] [pyodbc]

    重新设计了 “setinputsizes()” 方言钩子集,使其可以为任何任意 DBAPI 正确扩展,方法是允许方言调用 cursor.setinputsizes(),并采用适合该 DBAPI 的样式。特别是,这旨在支持 pyodbc 的使用风格,它与 cx_Oracle 的风格根本不同。添加了对 pyodbc 的支持。

    参考链接: #5649

  • [engine] [特性]

    添加了新的反射方法 Inspector.get_sequence_names(),它返回所有已定义的序列,以及 Inspector.has_sequence(),用于检查特定序列是否存在。已为支持 Sequence 的后端添加了对此方法的支持:PostgreSQL、Oracle 和 MariaDB >= 10.3。

    参考链接: #2056

  • [engine] [特性]

    Table.autoload_with 参数现在直接接受 Inspector 对象,以及之前的任何 EngineConnection

    参考链接: #4755

  • [engine] [变更]

    RowProxy 类不再是“代理”对象,而是在构造时直接填充 DBAPI 行元组的后处理内容。现在命名为 Row,Python 级值处理器的机制已得到简化,特别是它影响 C 代码格式的方式,以便预先将 DBAPI 行处理为结果元组。ResultProxy 返回的对象现在是 LegacyRow 子类,它维护映射/元组混合行为,但基类 Row 现在更像命名元组。

    参考链接: #4710

  • [engine] [变更] [性能] [py3k]

    禁用了在 Python 3 下运行时在方言启动时运行的“unicode 返回”检查,多年来,此检查一直用于测试当前 DBAPI 对于 VARCHAR 和 NVARCHAR 数据类型是否返回 Python Unicode 或 Py2K 字符串的行为。在 Python 2 下,检查仍然默认发生,但是当 Python 2 支持也被移除时,测试行为的机制将在 SQLAlchemy 2.0 中移除。

    当需要时,此逻辑非常有效,但是现在 Python 3 已成为标准,所有 DBAPI 都应预期为字符数据类型返回 Python 3 字符串。在极少数情况下,第三方 DBAPI 不支持此功能,String 中的转换逻辑仍然可用,并且第三方方言可以在其前期的方言标志中通过将方言级别标志 returns_unicode_strings 设置为 String.RETURNS_CONDITIONALString.RETURNS_BYTES 之一来指定此功能,这两者都将在 Python 3 下启用 Unicode 转换。

    参考链接: #5315

  • [engine] [性能]

    池 “pre-ping” 功能已得到改进,在同一签出操作中刚打开的 DBAPI 连接不会调用它。pre ping 仅适用于已签入池并再次签出的 DBAPI 连接。

    参考链接: #4524

  • [engine] [bug]

    修改了 Connection.execution_options.schema_translate_map 功能,以便在语句的执行阶段而不是编译阶段处理 SQL 语句以接收特定的模式名称。这是为了支持语句被有效地缓存。以前,为特定运行渲染到语句中的当前模式将被视为缓存键本身的一部分,这意味着对于针对数百个模式的运行,将有数百个缓存键,从而使缓存的性能大大降低。新行为与 1.4 中作为 #4645, #4808 的一部分添加的“后编译”渲染方式类似。

    参考链接: #5004

  • [engine] [bug]

    在最外层事务被显式回滚之前,Connection 对象现在不会清除已回滚的事务。这本质上与 ORM Session 长期以来的行为相同,其中需要对所有封闭事务显式调用 .rollback() 才能逻辑地清除事务,即使 DBAPI 级别的事务已被回滚。新行为有助于解决诸如 “ORM rollback test suite” 模式之类的情况,其中测试套件在 ORM 范围内回滚事务,但寻求在外部控制事务范围的测试工具不希望隐式启动新事务。

    参考链接: #4712

  • [engine] [bug]

    调整了方言初始化过程,使得在第一个连接上不会第二次调用 Dialect.on_connect()。首先调用钩子,然后如果该连接是该方言的第一个连接,则调用 Dialect.initialize(),然后不再调用任何事件。这消除了对 “on_connect” 函数的两次调用,这两次调用可能会产生非常难以调试的情况。

    参考链接: #5497

  • [engine] [已弃用]

    URL 对象现在是不可变的命名元组。要修改 URL 对象,请使用 URL.set() 方法生成新的 URL 对象。

    另请参阅

    URL 对象现在是不可变的 - 迁移说明

    参考链接: #5526

  • [engine] [已弃用]

    MetaData.bind 参数以及“绑定元数据”的总体概念在 SQLAlchemy 1.4 中已弃用,并将在 SQLAlchemy 2.0 中移除。当使用 SQLAlchemy 2.0 弃用模式 时,该参数以及相关函数现在会发出 RemovedIn20Warning

    参考链接: #4634

  • [engine] [已弃用]

    server_side_cursors 引擎级参数已弃用,并将在未来的版本中移除。对于非缓冲游标,应在每次执行时使用 Connection.execution_options.stream_results 执行选项。

  • [engine] [已弃用]

    Connection.connect() 方法已弃用,并且 “连接分支” 的概念也已弃用,该概念将 Connection 复制到新的连接中,该新连接具有空操作 “.close()” 方法。此模式面向 “无连接执行” 概念,该概念也将在 2.0 中移除。

    参考链接: #5131

  • [engine] [已弃用]

    create_engine() 上的 case_sensitive 标志已弃用;此标志是结果行对象过渡的一部分,目的是允许默认进行区分大小写的列匹配,同时为以前的匹配方法提供向后兼容性。就像任何其他 Python 映射一样,行的所有字符串访问都应假定为区分大小写。

    参考链接: #4878

  • [engine] [已弃用]

    “隐式自动提交”是指在连接上发出 DML 或 DDL 语句时发生的 COMMIT,已被弃用,并且不会成为 SQLAlchemy 2.0 的一部分。当自动提交生效时,会发出 2.0 风格的警告,以便可以调整调用代码以使用显式事务。

    作为此更改的一部分,当针对 Engine 使用时,DDL 方法(例如 MetaData.create_all())将在 BEGIN 块中运行操作(如果尚未启动)。

    参考链接: #4846

  • [engine] [已弃用]

    弃用了 Column 可以用作结果集行查找中的键的行为,当 Column 不是正在选择的 SQL selectable 的一部分时;也就是说,它仅按名称匹配。现在为此情况发出弃用警告。各种 ORM 用例(例如涉及 text() 构造的用例)已得到改进,因此在大多数情况下避免了这种回退逻辑。

    参考链接: #4877

  • [engine] [已弃用]

    弃用了剩余的引擎级内省和实用程序方法,包括 Engine.run_callable(), Engine.transaction(), Engine.table_names(), Engine.has_table()。实用程序方法已被现代上下文管理器模式取代,并且表内省任务适合由 Inspector 对象完成。

    参考链接: #4755

  • [engine] [已移除]

    移除 DialectInspector 类中已弃用的方法 get_primary_keys。请参考 Dialect.get_pk_constraint()Inspector.get_primary_keys() 方法。

    移除已弃用的事件 dbapi_error 和方法 ConnectionEvents.dbapi_error。请参考 ConnectionEvents.handle_error() 事件。此更改还移除了属性 ExecutionContext.is_disconnectExecutionContext.exception

    参考链接: #4643

  • [engine] [已移除]

    内部方言方法 Dialect.reflecttable 已被移除。对第三方方言的审查未发现任何使用此方法的方言,因为它已被记录为外部方言不应使用的方法。此外,私有 Engine._run_visitor 方法也被移除。

    参考链接: #4755

  • [engine] [已移除]

    长期弃用的 Inspector.get_table_names.order_by 参数已被移除。

    参考链接: #4755

  • [engine] [已重命名]

    Inspector.reflecttable() 已重命名为 Inspector.reflect_table()

    参考链接: #5244

sql

  • [sql] [特性]

    将 “from linting” 作为内置功能添加到 SQL 编译器中。这允许编译器维护特定 SELECT 语句中所有 FROM 子句的图,这些子句通过 WHERE 或 JOIN 子句中连接这些 FROM 子句的标准链接在一起。如果任意两个 FROM 子句之间没有路径,则会发出警告,提示查询可能正在生成笛卡尔积。由于 Core 表达式语言以及 ORM 都构建在 “隐式 FROM” 模型之上,如果查询的任何部分引用了特定的 FROM 子句,则会自动添加该子句,因此很容易发生这种情况,并且希望新功能可以帮助解决此问题。

    参考链接: #4737

  • [sql] [特性] [mssql] [oracle]

    添加了新的“编译后参数”功能。此功能允许 bindparam() 构造在其值传递给 DBAPI 驱动程序之前,但在编译步骤之后,使用编译器的“字面渲染”功能将其值渲染到 SQL 字符串中。此功能最直接的理由是支持 LIMIT/OFFSET 方案,这些方案作为数据库驱动程序处理的绑定参数无法正常工作或性能不佳,同时仍然允许 SQLAlchemy SQL 构造以其编译形式进行缓存。此新功能的直接目标是 SQL Server(和 Sybase)使用的“TOP N”子句,该子句不支持绑定参数,以及 Oracle 方言使用的“ROWNUM”和可选的“FIRST_ROWS()”方案,前者已知在没有绑定参数的情况下性能更好,而后者不支持绑定参数。该功能建立在最初为支持 IN 表达式的“扩展”参数而开发的机制之上。作为此功能的一部分,Oracle 的 use_binds_for_limits 功能已无条件开启,并且此标志现已弃用。

    参考:#4808

  • [sql] [feature]

    在受支持的后端添加了正则表达式支持。已定义两个操作:

    支持的后端包括 SQLite、PostgreSQL、MySQL / MariaDB 和 Oracle。

    参考:#1390

  • [sql] [feature]

    select() 构造及相关构造现在允许在 columns 子句中复制列标签和列本身,完全镜像列表达式的传入方式。这允许执行结果返回的元组与最初 SELECT 的内容相匹配,这与 ORM Query 的工作方式相同,因此这在两个构造之间建立了更好的交叉兼容性。此外,它允许在某些情况下更直观地构造对列位置敏感的结构,例如 UNION(即 _selectable.CompoundSelect),其中特定列可能出现在多个位置。为了支持此更改,ColumnCollection 已被修订为支持重复列以及允许整数索引访问。

    参考:#4753

  • [sql] [feature]

    增强了 select() 构造的消除歧义标签功能,以便当在子查询中使用 select 语句时,来自不同表的重复列名现在会自动标记为唯一标签名,而无需使用结合表名和列名的完整“apply_labels()”功能。消除歧义的标签在子查询的 .c 集合中以纯字符串键的形式提供,最重要的是,此功能允许针对实体和任意子查询的组合使用 ORM aliased() 构造正确工作,即使源表中的列名相同,也能定位到正确的列,而无需“apply labels”警告。

    另请参阅

    从查询本身作为子查询进行选择,例如 “from_self()” - 说明了新的消除歧义功能,作为从 Query.from_self() 方法迁移出来的策略的一部分。

    参考:#5221

  • [sql] [feature]

    “扩展 IN”功能,它在查询执行时生成 IN 表达式,这些表达式基于与语句执行关联的特定参数,现在用于针对字面值列表进行的所有 IN 表达式。这允许 IN 表达式完全可缓存,而与传递的值列表无关,并且还包括对空列表的支持。对于 IN 表达式包含非字面 SQL 表达式的任何场景,将保持为 IN 中的每个位置预渲染的旧行为。此更改还完成了对扩展 IN 与元组的支持,之前类型特定的绑定处理器未生效。

    参考:#4645

  • [sql] [feature]

    随着作为 #4369 一部分引入的新的透明语句缓存功能,添加了一个旨在减少创建语句的 Python 开销的新功能,允许在使用 lambda 指示传递给语句对象的参数时使用,例如 select()、Query()、update() 等,以及允许以类似于“baked query”系统的方式在 lambda 中构造完整语句。使用 lambda 的理由改编自“baked query”方法,该方法使用 lambda 将任何数量的 Python 代码封装到仅在首次将语句构造为字符串时才需要调用的可调用对象中。然而,新功能更加复杂,因为将作为参数传递的 Python 字面值会自动提取,因此不再需要对这些查询使用 bindparam() 对象。该功能的使用是可选的,可以根据需要使用小到大程度,同时仍然允许语句完全可缓存。

    参考:#5380

  • [sql] [usecase]

    Index.create()Index.drop() 方法现在具有参数 Index.create.checkfirst,与 TableSequence 的方式相同,启用后,将使操作在执行创建或删除操作之前检测索引是否存在(或不存在)。

    参考:#527

  • [sql] [usecase]

    true()false() 运算符现在可以作为 join() 的 “onclause” 应用于不支持“原生布尔”表达式的后端,例如 Oracle 或 SQL Server,并且该表达式将渲染为 true 的 “1=1” 和 false 的 “1=0”。这是多年前在 #2804 中为 and/or 表达式引入的行为。

  • [sql] [usecase]

    更改 ColumnCollection__str 方法,以避免将其与 Python 字符串列表混淆。

    参考:#5191

  • [sql] [usecase]

    为受支持的后端(当前为 PostgreSQL、Oracle 和 MSSQL)的 select 添加对 FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES} 的支持。

    参考:#5576

  • [sql] [usecase]

    添加了额外的逻辑,以便某些通常包装单个数据库列的 SQL 表达式将使用该列的名称作为其在 SELECT 语句中的“匿名标签”名称,从而可能使基于键的查找在结果元组中更直观。这方面的主要示例是 CAST 表达式,例如 CAST(table.colname AS INTEGER),它将导出其默认名称为 “colname”,而不是通常的 “anon_1” 标签,即 CAST(table.colname AS INTEGER) AS colname。如果内部表达式没有名称,则使用之前的“匿名标签”逻辑。当使用利用 Select.apply_labels() 的 SELECT 语句(例如 ORM 发出的语句)时,标签逻辑将生成 <tablename>_<inner column name>,就像列单独命名一样。该逻辑目前适用于 cast()type_coerce() 构造以及一些单元素布尔表达式。

    参考:#4449

  • [sql] [change]

    “子句强制”系统,它是 SQLAlchemy Core 的系统,用于接收参数并将它们解析为 ClauseElement 结构,以便构建 SQL 表达式对象,已从一系列临时函数重写为完全一致的基于类的系统。此更改是内部的,除了在将错误类型的参数传递给表达式对象时会显示更具体的错误消息外,不应对最终用户产生任何影响,但是此更改是涉及 select() 对象的角色和行为的更大的一组更改的一部分。

    参考链接: #4617

  • [sql] [change]

    添加了一个核心 Values 对象,该对象使 VALUES 构造能够在支持它的数据库(主要是 PostgreSQL 和 SQL Server)的 SQL 语句的 FROM 子句中使用。

    参考:#4868

  • [sql] [change]

    select() 构造正在朝着新的调用形式 select(col1, col2, col3, ..) 发展,所有其他关键字参数都已删除,因为这些都适合使用生成方法。传递给 select() 的列或表参数的单个列表仍然被接受,但是如果表达式以简单的位置样式传递,则不再是必需的。当使用此形式时,不允许使用其他关键字参数。

    参考:#5284

  • [sql] [change]

    作为 SQLAlchemy 2.0 迁移项目的一部分,对 SelectBase 类层次结构(它是所有 “SELECT” 语句构造的根)的角色进行了概念性更改,即它们不再直接充当 FROM 子句,也就是说,它们不再是 FromClause 的子类。对于最终用户,此更改主要意味着在另一个 select() 的 FROM 子句中放置 select() 构造,首先需要将其包装在子查询中,这在历史上是通过使用 SelectBase.alias() 方法来实现的,现在也可以通过使用 SelectBase.subquery() 来实现。无论如何,这通常是一个要求,因为许多数据库在它们的 FROM 子句中不接受未命名的 SELECT 子查询。

    参考链接: #4617

  • [sql] [change]

    添加了一个新的 Core 类 Subquery,当针对 SelectBase 对象创建命名子查询时,它将取代 AliasSubquery 的行为方式与 Alias 相同,并且是从 SelectBase.subquery() 方法产生的;为了易用性和向后兼容性,SelectBase.alias() 方法是此新方法的同义词。

    参考链接: #4617

  • [sql] [performance]

    Core 和 ORM 内部结构的全方位重组和重构现在允许 DQL(例如 SELECT)和 DML(例如 INSERT、UPDATE、DELETE)领域内的所有 Core 和 ORM 语句在大多数情况下完全缓存其 SQL 编译以及结果获取元数据的构造。这有效地提供了一个透明且通用的版本,类似于 “Baked Query” 扩展在过去版本中为 ORM 提供的功能。新功能可以根据它最终为给定方言生成的字符串来计算任何给定 SQL 构造的缓存键,从而允许每次都组合等效的 select()、Query()、insert()、update() 或 delete() 对象的函数在第一次生成语句后缓存该语句。

    该功能是透明地启用的,但包括一些新的编程范例,可以用来使缓存更有效。

    参考:#4639

  • [sql] [bug]

    修复了从 ORM 绑定的列(主要是 ForeignKey 对象,但也包括 UniqueConstraintCheckConstraint 等)构造约束时,ORM 级别的 InstrumentedAttribute 完全被丢弃的问题,并且从列中删除了所有 ORM 级别的注释;这是为了使约束仍然可以完全 pickle 化,而不会引入 ORM 级别的实体。这些注释不是必须存在于模式/元数据级别的。

    参考:#5001

  • [sql] [bug]

    基于 GenericFunction 注册的函数名称现在在所有情况下都以不区分大小写的方式检索,从而消除了 1.3 中的弃用逻辑,该逻辑暂时允许多个 GenericFunction 对象以不同的大小写存在。当 GenericFunction 替换另一个同名函数时,无论是否区分大小写,都会在替换对象之前发出警告。

    参考:#4569, #4649

  • [sql] [bug]

    创建没有参数或空 *argsand_()or_() 构造现在将发出弃用警告,因为生成的 SQL 是空操作(即,它渲染为空白字符串)。此行为被认为是非直观的,因此对于空或可能为空的 and_()or_() 构造,应包含适当的默认布尔值,例如 and_(True, *args)or_(False, *args)。正如 SQLAlchemy 的许多主要版本的情况一样,如果 *args 部分非空,则这些特定的布尔值将不会渲染。

    参考:#5054

  • [sql] [bug]

    改进了 tuple_() 构造,使其在列子句上下文中使用时行为可预测。SQL 元组在大多数后端上不支持作为 “SELECT” 列子句元素;在支持它的后端(不出所料,PostgreSQL)上,Python DBAPI 没有 “嵌套类型” 概念,因此在获取此类对象的行时仍然存在挑战。tuple_()select()Query 中的使用现在将在 CompileError 处引发,此时 tuple_() 对象被视为用于获取行(即,如果元组在子查询的列子句中,则不会引发错误)。对于 ORM 用法,Bundle 对象是一个显式指令,指示一系列列应作为每个行的子元组返回,错误消息会建议使用它。此外,元组现在将在所有上下文中都使用括号渲染。以前,括号化不会在列上下文中渲染,从而导致未定义的行为。

    参考:#5127

  • [sql] [bug] [postgresql]

    改进了对字符串中包含百分号的列名的支持,包括修复了匿名标签中也嵌入了包含百分号的列名的问题,并重新建立了对 psycopg2 方言中嵌入百分号的绑定参数名称的支持,使用类似于 cx_Oracle 方言使用的后期转义过程。

    参考:#5653

  • [sql] [bug]

    作为 FunctionElement 子类创建的自定义函数现在将基于函数的 “name” 生成 “匿名标签”,就像任何其他 Function 对象一样,例如 "SELECT myfunc() AS myfunc_1"。虽然 SELECT 语句不再需要标签才能使结果代理对象正常工作,但 ORM 仍然通过使用对象作为映射键来定位行中的列,当列表达式具有不同的名称时,这种方法更可靠。在任何情况下,由 func 生成的函数和作为自定义 FunctionElement 对象生成的函数之间的行为现在变得一致。

    参考:#4887

  • [sql] [bug]

    根据新的基于访问者的方法重新设计了 ClauseElement.compare() 方法,并额外添加了测试覆盖率,以确保所有 ClauseElement 子类在结构方面可以相互准确比较。结构比较功能目前在 ORM 中少量使用,但它也可能构成新缓存功能的基础。

    参考:#4336

  • [sql] [bug]

    弃用在 PostgreSQL 以外的方言中使用 DISTINCT ON。弃用 MySQL 方言中字符串 distinct 的旧用法

    参考:#4002

  • [sql] [bug]

    当根据 Table 绑定的列应用 CompoundSelect.order_by() 时,_selectable.CompoundSelect(例如 UNION、EXCEPT 等)的 ORDER BY 子句将不会渲染与给定列关联的表名。大多数数据库要求 ORDER BY 子句中的名称仅表示为标签名称,这些标签名称与第一个 SELECT 语句中的名称匹配。此更改与 #4617 相关,因为之前的解决方法是引用 _selectable.CompoundSelect.c 属性,以便获取没有表名的列。由于子查询现在已命名,因此此更改允许解决方法继续工作,并允许表绑定的列以及 CompoundSelect.selected_columns 集合在 CompoundSelect.order_by() 方法中使用。

    参考链接: #4617

  • [sql] [bug]

    不再将 Join 构造视为 “onclause” 的来源,以从封闭的 Select 对象的 FROM 列表中省略额外的 FROM 对象作为独立的 FROM 对象。这适用于包含对 JOIN 之外的另一个 FROM 对象的引用的 ON 子句;虽然从 SQL 的角度来看这通常是不正确的,但省略它也是不正确的,并且行为上的更改使 Select / Join 的行为更加直观。

    参考链接: #4621

  • [sql] [deprecated]

    Join.alias() 方法已弃用,将在 SQLAlchemy 2.0 中移除。应使用显式的 select + 子查询,或内部表的别名来代替。

    参考链接: #5010

  • [sql] [deprecated]

    当定义了同名的列时,Table 类现在会引发弃用警告。 为了替换列,为 Table.append_column() 方法添加了一个新的参数 Table.append_column.replace_existing

    当使用字符串调用 ColumnCollection.contains_column() 时,现在会引发错误,建议调用者改用 in

  • [sql] [removed]

    已为 1.4 版本移除了在 1.3 版本中已弃用的 “threadlocal” 执行策略,以及 “engine strategies” 的概念和 Engine.contextual_connect 方法。 关键字参数 “strategy='mock'” 仍然被接受,但会发出弃用警告;对于这种情况,请改用 create_mock_engine()

    另请参阅

    “threadlocal” 引擎策略已弃用 - 来自 1.3 迁移说明,其中讨论了弃用的理由。

    参考链接: #4632

  • [sql] [removed]

    移除了 sqlalchemy.sql.visitors.iterate_depthfirstsqlalchemy.sql.visitors.traverse_depthfirst 函数。这些函数在 SQLAlchemy 的任何部分都未使用。 iterate()traverse() 函数通常用于这些函数。 还从剩余的函数中移除了未使用的选项,包括 “column_collections”、“schema_visitor”。

  • [sql] [removed]

    Compiler 对象中移除了绑定引擎的概念,并从 Compiler 中移除了 .execute().scalar() 方法。 这些本质上是十多年前被遗忘的方法,没有任何实际用途,并且 Compiler 对象本身维护对 Engine 的引用是不合适的。

  • [sql] [removed]

    移除已弃用的方法 Compiled.compileClauseElement.__and__ClauseElement.__or__ 以及属性 Over.func

    移除已弃用的 FromClause.count 方法。 请使用 count 函数,该函数可从 func 命名空间获得。

    参考链接: #4643

  • [sql] [removed]

    移除已弃用的参数 text.bindparamstext.typemap。 请参考 TextClause.bindparams()TextClause.columns() 方法。

    移除已弃用的参数 Table.useexisting。 请使用 Table.extend_existing

    参考链接: #4643

  • [sql] [renamed]

    Table 参数 mustexist 已重命名为 Table.must_exist,现在使用时会发出警告。

  • [sql] [renamed]

    SelectBase.as_scalar()Query.as_scalar() 方法已分别重命名为 SelectBase.scalar_subquery()Query.scalar_subquery()。 旧名称在 1.4 系列中继续存在,但会发出弃用警告。 此外,当在列上下文中评估时,将 SelectBaseAlias 和其他面向 SELECT 的对象隐式强制转换为标量子查询的做法也已弃用,并发出警告,提示应显式调用 SelectBase.scalar_subquery() 方法。 此警告将在以后的主要版本中变为错误,但是,当需要调用 SelectBase.scalar_subquery() 时,消息将始终清晰明了。 更改的后一部分是为了清晰起见,并减少查询强制转换系统的隐式决策。 Subquery.as_scalar() 方法(以前是 Alias.as_scalar)也已弃用; 应直接从 `select() 对象或 Query 对象调用 .scalar_subquery()

    此更改是将 select() 对象转换为不再直接属于 “from clause” 类层次结构的一部分的更大更改的一部分,其中还包括对子句强制转换系统的全面修订。

    参考链接: #4617

  • [sql] [renamed]

    一些运算符被重命名,以在 SQLAlchemy 中实现更一致的命名。

    运算符的更改如下:

    • isfalse 现在是 is_false

    • isnot_distinct_from 现在是 is_not_distinct_from

    • istrue 现在是 is_true

    • notbetween 现在是 not_between

    • notcontains 现在是 not_contains

    • notendswith 现在是 not_endswith

    • notilike 现在是 not_ilike

    • notlike 现在是 not_like

    • notmatch 现在是 not_match

    • notstartswith 现在是 not_startswith

    • nullsfirst 现在是 nulls_first

    • nullslast 现在是 nulls_last

    • isnot 现在是 is_not

    • notin_ 现在是 not_in

    因为这些是核心运算符,所以此更改的内部迁移策略是在很长一段时间内(如果不是无限期)支持旧术语,但更新所有文档、教程和内部用法以使用新术语。 新术语用于定义函数,旧术语已弃用为新术语的别名。

    参考链接: #5429, #5435

  • [sql] [postgresql]

    允许在使用参数 Sequence.data_type 在 PostgreSQL 中创建 Sequence 时指定数据类型。

    参考链接: #5498

  • [sql] [reflection]

    外键 “ON UPDATE” 的 “NO ACTION” 关键字现在被认为是所有支持的后端(SQlite、MySQL、PostgreSQL)上外键的默认级联,并且当检测到时,不会包含在反射字典中;无论如何,这已经是 PostgreSQL 和 MySQL 在所有以前的 SQLAlchemy 版本中的行为。 当检测到 “RESTRICT” 关键字时,会积极存储它;PostgreSQL 报告此关键字,MySQL 从 8.0 版本开始也报告此关键字。 在较早的 MySQL 版本中,数据库不会报告它。

    参考链接: #4741

  • [sql] [reflection]

    添加了对反射 “identity” 列的支持,这些列现在作为 Inspector.get_columns() 返回的结构的一部分返回。 当反射完整的 Table 对象时,标识列将使用 Identity 构造表示。 目前,支持的后端是 PostgreSQL >= 10、Oracle >= 12 和 MSSQL(具有不同的语法和部分功能)。

    参考链接: #5324, #5527

schema

  • [schema] [change]

    Enum.create_constraintBoolean.create_constraint 参数现在默认为 False,表示当创建这两种数据类型的所谓 “非原生” 版本时,默认情况下不会生成 CHECK 约束。 这些 CHECK 约束带来了模式管理维护的复杂性,应该选择加入,而不是默认开启。

    参考链接: #5367

  • [schema] [bug]

    清理了数据类型的内部 str(),以便所有类型都生成不带任何方言的字符串表示形式,包括它适用于第三方方言类型,而无需存在该方言。 字符串表示形式默认为该类型的大写名称,没有其他内容。

    参考链接: #4262

  • [schema] [removed]

    移除已弃用的类 Binary。 请使用 LargeBinary

    参考链接: #4643

  • [schema] [renamed]

    Table.tometadata() 方法重命名为 Table.to_metadata()。 之前的名称仍然保留,但会发出弃用警告。

    参考链接: #5413

  • [schema] [sql]

    添加了 Identity 构造,可用于配置使用 GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY 呈现的标识列。 目前,支持的后端是 PostgreSQL >= 10、Oracle >= 12 和 MSSQL(具有不同的语法和部分功能)。

    参考链接: #5324, #5360, #5362

extensions

  • [extensions] [usecase]

    当自定义构造被解释为 SELECT 语句的 columns 子句中的元素时,使用 sqlalchemy.ext.compiled 扩展创建的自定义编译器构造将自动向编译器添加上下文信息,这样自定义元素就可以作为结果行映射中的键进行定位,这是 ORM 为了将列元素匹配到结果元组中而使用的定位类型。

    参考:#4887

  • [extensions] [change]

    添加了新的参数 AutomapBase.prepare.autoload_with,它取代了 AutomapBase.prepare.reflectAutomapBase.prepare.engine

    参考链接: #5142

postgresql

  • [postgresql] [usecase]

    为 psycopg2、asyncpg 和 pg8000 方言的所有版本添加了对 PostgreSQL “readonly” 和 “deferrable” 标志的支持。 这利用了新通用的 “隔离级别” API 版本来支持其他类型的会话属性,这些属性通过执行选项设置,并在连接返回到连接池时可靠地重置。

    参考链接: #5549

  • [postgresql] [usecase]

    现在可以将 BufferedRowResultProxy 的最大缓冲区大小(当 stream_results=True 时,PostgreSQL 等方言使用它)设置为大于 1000 的数字,并且缓冲区将增长到该大小。 以前,即使将该值设置得更大,缓冲区也不会超过 1000。 缓冲区的增长现在也基于一个简单的乘法因子,当前设置为 5。 拉取请求由 Soumaya Mauthoor 提供。

    参考链接: #4914

  • [postgresql] [change]

    当对 PostgreSQL 使用 psycopg2 方言时,psycopg2 的最低版本设置为 2.7。 psycopg2 方言依赖于 psycopg2 在过去几年中发布的许多功能,因此为了简化方言,2017 年 3 月发布的 2.7 版本现在是要求的最低版本。

  • [postgresql] [performance]

    psycopg2 方言现在默认使用性能非常高的 execute_values() psycopg2 扩展来处理编译后的 INSERT 语句,并且在使用此扩展时还实现了 RETURNING 支持。 这允许即使包含自动递增 SERIAL 或 IDENTITY 值的 INSERT 语句也能非常快速地运行,同时仍然能够返回新生成的主键值。 ORM 将在单独的更改中集成此新功能。

    另请参阅

    psycopg2 方言默认使用带有 RETURNING 的 “execute_values” 功能来处理 INSERT 语句 - 关于 executemany_mode 参数的完整更改列表。

    参考链接: #5401

  • [postgresql] [bug]

    pg8000 方言已针对最新版本的 PostgreSQL 的 pg8000 驱动程序进行了修订和现代化。 拉取请求由 Tony Locke 提供。 请注意,这必然将 pg8000 锁定在 1.16.6 或更高版本,该版本不再支持 Python 2。 需要 pg8000 的 Python 2 用户应确保他们的需求锁定在 SQLAlchemy<1.4

  • [postgresql] [deprecated]

    pygresql 和 py-postgresql 方言已弃用。

    参考链接: #5189

  • [postgresql] [removed]

    移除对 postgres:// 形式的已弃用引擎 URL 的支持;这已经发出警告多年,项目应使用 postgresql://

    参考链接: #4643

mysql

  • [mysql] [feature]

    为 mysql 方言添加了对 MariaDB Connector/Python 的支持。 原始拉取请求由 Georg Richter 提供。

    参考链接: #5459

  • [mysql] [usecase]

    create_engine() URL 中添加了一个新的方言令牌 “mariadb”,可以用来代替 “mysql”。 这将交付一个 MariaDB 方言子类,该子类在使用中的 MySQLDialect 中强制将 “is_mariadb” 标志设置为 True。 如果收到的服务器版本字符串未指示正在使用 MariaDB,则该方言将引发错误。 这对于 MariaDB 特定的测试场景以及支持硬编码为仅 MariaDB 概念的应用程序非常有用。 随着 MariaDB 和 MySQL 功能集和使用模式继续分化,这种模式可能会变得更加突出。

    参考链接: #5496

  • [mysql] [usecase]

    添加了对在 MariaDB 10.3 及更高版本中使用 Sequence 构造的支持,因为现在此数据库支持此构造。 该构造以与其他数据库(如 PostgreSQL 和 Oracle)相同的方式与 Table 对象集成;如果它存在于整数主键 “autoincrement” 列上,则用于生成默认值。 为了向后兼容,为了支持 Table 在其上具有 Sequence 以支持仅序列数据库(如 Oracle),同时仍然不让序列在 MariaDB 上触发,应设置 optional=True 标志,这表示仅当目标数据库不提供其他选项时,才应使用该序列来生成主键。

    参考链接: #4976

  • [mysql] [bug]

    MySQL 和 MariaDB 方言现在从 information_schema.tables 系统视图查询,以确定特定表是否存在。 以前,使用 “DESCRIBE” 命令和异常捕获来检测不存在的表,这将产生在连接上发出 ROLLBACK 的不良影响。 似乎存在遗留的编码问题阻止了 “SHOW TABLES” 的使用,但是对于此问题,由于 #4189,MySQL 支持现在为 5.0.2 或更高版本,因此 information_schema 表现在在所有情况下都可用。

  • [mysql] [bug]

    with_for_update() 一起使用的 “skip_locked” 关键字将在所有 MySQL 后端上呈现 “SKIP LOCKED”,这意味着它将在 MySQL 低于 8 版本和当前的 MariaDB 后端上失败。 这是因为这些后端不支持 “SKIP LOCKED” 或任何等效项,因此不应默默地忽略此错误。 这已从 1.3 系列中的警告升级。

    参考链接: #5568

  • [mysql] [bug]

    MySQL 方言的 server_version_info 元组现在都是数字。 诸如 “MariaDB” 之类的字符串标记不再存在,以便在所有情况下数字比较都有效。 应查阅方言上的 .is_mariadb 标志,以了解是否检测到 mariadb。 此外,还移除了旨在支持非常旧的 MySQL 版本 3.x 和 4.x 的结构; 现在支持的最低 MySQL 版本是 5.0.2。

    参考链接: #4189

  • [mysql] [deprecated]

    OurSQL 方言已弃用。

    参考链接: #5189

  • [mysql] [removed]

    移除自 1.0 版本以来已弃用的已弃用方言 mysql+gaerdbms。 直接使用 MySQLdb 方言。

    mysql 方言的 ENUMSET 中移除已弃用的参数 quoting。 传递给 enum 或 set 的值在需要时由 SQLAlchemy 自动引用。

    参考链接: #4643

sqlite

mssql

  • [mssql] [feature] [sql]

    在使用 JSON 实现的 SQL Server 方言上添加了对 JSON 数据类型的支持,该实现根据 SQL Server 文档对 NVARCHAR(max) 数据类型实现了 SQL Server 的 JSON 功能。 实现由 Gord Thompson 提供。

    参考链接: #4384

  • [mssql] [feature]

    添加了对 Microsoft SQL Server 的“CREATE SEQUENCE”和完整 Sequence 的支持。 这移除了使用 Sequence 对象来操作 IDENTITY 特性的已弃用功能,现在应该使用 mssql_identity_startmssql_identity_increment 来执行此操作,如 自增行为 / IDENTITY 列 中所述。 此更改包括一个新的参数 Sequence.data_type,以适应 SQL Server 的数据类型选择,对于该后端,包括 INTEGER、BIGINT 和 DECIMAL(n, 0)。 SQL Server 版本的 Sequence 的默认起始值已设置为 1;现在所有后端都会在 CREATE SEQUENCE DDL 中发出此默认值。

    参考链接: #4235, #4633

  • [mssql] [usecase] [postgresql] [reflection] [schema]

    改进了对覆盖索引(带有 INCLUDE 列)的支持。 添加了 postgresql 从 Core 渲染带有 INCLUDE 子句的 CREATE INDEX 语句的能力。 索引反射还为 mssql 和 postgresql (11+) 分别报告 INCLUDE 列。

    参考链接: #4458

  • [mssql] [usecase] [postgresql]

    添加了对部分索引/过滤索引(即使用 mssql_wherepostgresql_where 参数的索引)进行检查/反射的支持,通过 Index 实现。 该条目既是 Inspector.get_indexes() 返回的字典的一部分,也是反射的 Index 结构的一部分。 拉取请求由 Ramon Williams 提供。

    参考链接: #4966

  • [mssql] [usecase] [reflection]

    添加了对 SQL Server 方言反射临时表的支持。 现在从 MSSQL “tempdb” 系统目录中内省以井号“#”为前缀的表名。

    参考链接: #5506

  • [mssql] [change]

    对于 SQL Server 11 及更高版本,现在使用 SQL Server OFFSET 和 FETCH 关键字进行 limit/offset,而不是使用窗口函数。 TOP 仍然用于仅具有 LIMIT 的查询。 拉取请求由 Elkin 提供。

    参考链接: #5084

  • [mssql] [bug] [schema]

    修复了 sqlalchemy.engine.reflection.has_table() 对于临时表始终返回 False 的问题。

    参考链接: #5597

  • [mssql] [bug]

    修复了 DATETIMEOFFSET 数据类型的基类,使其基于 DateTime 类层次结构,因为这是一个保存日期时间的数据类型。

    参考链接: #4980

  • [mssql] [deprecated]

    adodbapi 和 mxODBC 方言已被弃用。

    参考链接: #5189

  • [mssql]

    mssql 方言将假定至少使用了 MSSQL 2005。 如果检测到以前的版本,则不会引发硬性异常,但对于旧版本,操作可能会失败。

  • [mssql] [reflection]

    作为支持反射 Identity 对象的一部分,方法 Inspector.get_columns() 不再返回 mssql_identity_startmssql_identity_increment 作为 dialect_options 的一部分。 请改用 identity 键中的信息。

    参考链接: #5527

  • [mssql] [engine]

    弃用了 legacy_schema_aliasing 参数到 sqlalchemy.create_engine()。 这是一个长期过时的参数,自 1.1 版本以来默认为 False。

    参考链接: #4809

oracle

  • [oracle] [usecase]

    Oracle 方言的 max_identifier_length 现在默认为 128 个字符,除非首次连接时的兼容性版本低于 12.2,在这种情况下,将使用 30 个字符的旧长度。 这是提交到 1.3 系列的问题的延续,该问题添加了首次连接时的最大标识符长度检测,并警告 Oracle 服务器中的更改。

    另请参阅

    最大标识符长度 - 在 Oracle 方言文档中

    参考链接: #4857

  • [oracle] [change]

    Oracle 中使用的 LIMIT / OFFSET 方案现在在使用子查询(包含 ROWNUM)透明地重写 SELECT 语句时,使用命名子查询而不是未命名子查询。 此更改是更大更改的一部分,其中 Core 不再直接支持未命名子查询,并且使 Oracle 方言中 select() 构造的内部使用现代化。

  • [oracle] [bug]

    正确渲染 SequenceIdentity 列选项 nominvaluenomaxvalue 作为 oracle 数据库上的 NOMAXVALUE` ``NOMINVALUE

  • [oracle] [bug]

    Oracle 方言的 INTERVAL 类现在正确地是 Interval 的抽象版本以及正确的“模拟”基类的子类,这允许在原生和非原生模式下都能正确行为; 以前它仅基于 TypeEngine

    参考链接: #4971

misc

  • [deprecated] [firebird]

    Firebird 方言已被弃用,因为现在有一个第三方方言支持此数据库。

    参考链接: #5189

  • [misc] [deprecated]

    Sybase 方言已被弃用。

    参考链接: #5189