SQLAlchemy 2.0 文档
变更和迁移
- SQLAlchemy 2.0 - 主要迁移指南
- SQLAlchemy 2.0 的新特性?
- 2.0 更新日志
- 1.4 更新日志¶
- 1.4.55
- 1.4.54
- 1.4.53
- 1.4.52
- 1.4.51
- 1.4.50
- 1.4.49
- 1.4.48
- 1.4.47
- 1.4.46
- 1.4.45
- 1.4.44
- 1.4.43
- 1.4.42
- 1.4.41
- 1.4.40
- 1.4.39
- 1.4.38
- 1.4.37
- 1.4.36
- 1.4.35
- 1.4.34
- 1.4.33
- 1.4.32
- 1.4.31
- 1.4.30
- 1.4.29
- 1.4.28
- 1.4.27
- 1.4.26
- 1.4.25
- 1.4.24
- 1.4.23
- 1.4.22
- 1.4.21
- 1.4.20
- 1.4.19
- 1.4.18
- 1.4.17
- 1.4.16
- 1.4.15
- 1.4.14
- 1.4.13
- 1.4.12
- 1.4.11
- 1.4.10
- 1.4.9
- 1.4.8
- 1.4.7
- 1.4.6
- 1.4.5
- 1.4.4
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.4.0b3
- 1.4.0b2
- 1.4.0b1
- 1.3 更新日志
- 1.2 更新日志
- 1.1 更新日志
- 1.0 更新日志
- 0.9 更新日志
- 0.8 更新日志
- 0.7 更新日志
- 0.6 更新日志
- 0.5 更新日志
- 0.4 更新日志
- 0.3 更新日志
- 0.2 更新日志
- 0.1 更新日志
- SQLAlchemy 1.4 的新特性?
- SQLAlchemy 1.3 的新特性?
- SQLAlchemy 1.2 的新特性?
- SQLAlchemy 1.1 的新特性?
- SQLAlchemy 1.0 的新特性?
- SQLAlchemy 0.9 的新特性?
- SQLAlchemy 0.8 的新特性?
- SQLAlchemy 0.7 的新特性?
- SQLAlchemy 0.6 的新特性?
- SQLAlchemy 0.5 的新特性?
- SQLAlchemy 0.4 的新特性?
项目版本
- 上一篇: 2.0 更新日志
- 下一篇: 1.3 更新日志
- 上级: 首页
- 在此页上
- 1.4 更新日志
- 1.4.55
- 1.4.54
- 1.4.53
- 1.4.52
- 1.4.51
- 1.4.50
- 1.4.49
- 1.4.48
- 1.4.47
- 1.4.46
- 1.4.45
- 1.4.44
- 1.4.43
- 1.4.42
- 1.4.41
- 1.4.40
- 1.4.39
- 1.4.38
- 1.4.37
- 1.4.36
- 1.4.35
- 1.4.34
- 1.4.33
- 1.4.32
- 1.4.31
- 1.4.30
- 1.4.29
- 1.4.28
- 1.4.27
- 1.4.26
- 1.4.25
- 1.4.24
- 1.4.23
- 1.4.22
- 1.4.21
- 1.4.20
- 1.4.19
- 1.4.18
- 1.4.17
- 1.4.16
- 1.4.15
- 1.4.14
- 1.4.13
- 1.4.12
- 1.4.11
- 1.4.10
- 1.4.9
- 1.4.8
- 1.4.7
- 1.4.6
- 1.4.5
- 1.4.4
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.4.0b3
- 1.4.0b2
- 1.4.0b1
1.4 更新日志¶
本文档详细介绍了 1.4 版本发布过程中的各个问题级别的更改。 有关 1.4 版本新特性的叙述性概述,请参阅 SQLAlchemy 1.4 的新特性?。
1.4.55¶
无发布日期1.4.54¶
发布日期:2024年9月5日通用¶
[通用] [变更] ¶
已移除
pyproject.toml
中setuptools<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¶
PostgreSQL¶
1.4.53¶
发布日期:2024年7月29日通用¶
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¶
[SQL] [错误] ¶
修复了缓存问题,其中使用
TextualSelect.add_cte()
方法的TextualSelect
构造不会设置正确的缓存键,该缓存键区分不同的 CTE 表达式。参考: #11471
[SQL] [错误] ¶
修复了缓存问题,其中
Select.with_for_update.key_share
元素Select.with_for_update()
未被视为缓存键的一部分,如果将此参数的不同变体与原本相同的语句一起使用,则会导致错误的缓存。参考: #11544
mypy¶
[mypy] [错误] ¶
已弃用的 mypy 插件不再与最新的 mypy 1.11.0 系列完全兼容,因为 mypy 解释器中的更改不再与插件使用的方法兼容。 如果代码依赖于带有 sqlalchemy2-stubs 的 mypy 插件,建议将 mypy pin 限制为低于 1.11.0 系列。 寻求升级到 SQLAlchemy 2.0 系列并迁移到现代类型注释。
SQLite¶
MSSQL¶
1.4.52¶
发布日期:2024年3月4日ORM¶
[ORM] [错误] ¶
修复了 ORM
with_loader_criteria()
不会将自身应用于Select.join()
的错误,其中 ON 子句以纯 SQL 比较而不是关系目标或类似形式给出。这是为 2.0.22 版本在 2.0 版本中修复的同一问题的向后移植。
更新 - 发现这也修复了单继承条件无法正确应用于仅出现在
select_from()
列表中的子类实体的问题,请参阅 #11412
1.4.51¶
发布日期:2024年1月2日ORM¶
asyncio¶
[asyncio] [错误] ¶
修复了 asyncio 版本连接池中的严重问题,其中调用
AsyncEngine.dispose()
会生成一个新的连接池,该连接池未完全重新建立 asyncio 兼容互斥锁的使用,从而导致使用普通的threading.Lock()
,然后在 asyncio 上下文中使用并发功能(如asyncio.gather()
)时会导致死锁。参考: #10813
MySQL¶
1.4.50¶
发布日期:2023年10月29日ORM¶
[ORM] [错误] ¶
修复了阻止某些形式的 ORM “注释”对使用
Select.join()
对关系目标进行子查询的基本问题。 每当在特殊情况下使用子查询时,例如在PropComparator.and_()
和其他 ORM 特定场景中使用子查询时,都会使用这些注释。参考: #10223
SQL¶
Schema¶
[Schema] [错误] ¶
修改了仅 Oracle 的
Identity.order
参数的呈现方式,该参数是Sequence
和Identity
的一部分,使其仅对 Oracle 后端生效,而不对其他后端(如 PostgreSQL)生效。 未来的版本将把Identity.order
、Sequence.order
和Identity.on_null
参数重命名为 Oracle 特定的名称,并弃用旧名称,因为这些参数仅适用于 Oracle。参考: #10207
MySQL¶
[MySQL] [用例] ¶
更新了 aiomysql 方言,因为该方言似乎再次得到维护。 使用版本 0.2.0 重新添加到 ci 测试中。
[MySQL] [错误] ¶
修复了 MySQL “预先 ping” 例程中的新不兼容性,其中传递给
connection.ping()
的False
参数(旨在禁用不需要的“自动重新连接”功能)在 MySQL 驱动程序和后端中已弃用,并且对于某些版本的 MySQL 本机客户端驱动程序会产生警告。 它已从 mysqlclient 中移除,而对于 PyMySQL 和基于 PyMySQL 的驱动程序,该参数将在某个时候被弃用和移除,因此使用 API 内省来面向未来,以应对这些不同的移除阶段。参考: #10492
MSSQL¶
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.flags
和ColumnOperators.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_load
、ORMExecuteState.is_relationship_load
、ORMExecuteState.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
实例构建的语句,但如果使用Session
或Connection
调用该语句,则会发生这种情况。Update
部分的问题同时存在于 2.0 和 1.4 版本中,并且已向后移植到 1.4 版本。参考: #9075
[SQL] [错误] ¶
修复了
CreateSchema
和DropSchema
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¶
MySQL¶
MSSQL¶
[MSSQL] [错误] ¶
修复了当模式名称使用方括号括起来,但名称内部没有点号时,对于诸如
Table.schema
等参数,在 SQL Server 方言的文档化行为(将显式方括号解释为标记分隔符,首次在 1.2 版本中为 #2626 添加)的上下文中无法被解释的问题,尤其是在反射操作中引用模式名称时。最初对 #2626 行为的假设是,只有当存在点号时,方括号的特殊解释才重要,但实际上,方括号不包含在所有 SQL 渲染操作的标识符名称中,因为这些不是常规或分隔标识符中的有效字符。感谢 Shan 提交的 Pull request。参考链接: #9133
oracle¶
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¶
engine¶
[engine] [bug] ¶
修复了连接池中的一个长期存在的竞争条件,该条件可能在 eventlet/gevent monkeypatching 方案中与 eventlet/gevent
Timeout
条件结合使用时发生。在这种情况下,由于超时而中断的连接池检出将无法清理失败状态,从而导致底层连接记录,有时甚至是数据库连接本身“泄漏”,使连接池处于无效状态,其中包含无法访问的条目。此问题最初在 SQLAlchemy 1.2 中为 #4225 识别和修复,但是该修复中检测到的故障模式未能容纳BaseException
,而不是Exception
,这阻止了 eventlet/geventTimeout
被捕获。此外,初始池连接中的一个块也被识别出来,并通过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¶
tests¶
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¶
[engine] [bug] ¶
修复了
Result.freeze()
方法不适用于使用text()
或Connection.exec_driver_sql()
的文本 SQL 的问题。参考链接: #8963
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¶
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¶
1.4.44¶
发布日期:2022 年 11 月 12 日sql¶
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¶
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
属性,包括ScalarResult
和MappingResult
。参考链接:#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
构造,而实际发出的查询是Delete
或Update
。 这会干扰 “路由会话” 的方案。参考链接:#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¶
asyncio¶
postgresql¶
[postgresql] [usecase] ¶
aggregate_order_by
现在支持缓存生成。参考链接:#8574
mysql¶
mssql¶
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¶
mssql¶
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¶
[engine] [usecase] ¶
为 Core 中的
Connection
实现了新的Connection.execution_options.yield_per
执行选项,以镜像 ORM 中可用的相同 yield_per 选项。 该选项同时设置Connection.execution_options.stream_results
选项,并调用Result.yield_per()
,以提供最常见的流式结果配置,这也镜像了 ORM 用例中的使用模式。另请参阅
使用服务器端游标(又名流式结果) - 修订文档
[engine] [bug] ¶
修复了
Result
中的一个 bug,当使用的方言不支持显式的 “服务器端游标” 设置时,如果使用Connection.execution_options.stream_results
,则不会使用缓冲结果策略。 这是错误的,因为 SQLite 和 Oracle 等 DBAPI 已经使用了非缓冲结果获取方案,该方案仍然受益于部分结果获取。“缓冲” 策略现在用于设置Connection.execution_options.stream_results
的所有情况。[engine] [bug] ¶
添加了
FilterResult.yield_per()
方法,以便结果实现(如MappingResult
、ScalarResult
和AsyncResult
)可以访问此方法。参考链接: #8199
sql¶
mypy¶
asyncio¶
[asyncio] [错误] ¶
在使用
AsyncConnection
或AsyncSession
作为上下文管理器,并在上下文管理器完成时释放对象的情况下,在__aexit__()
上下文管理器退出时,特别是在连接和会话释放过程中添加了asyncio.shield()
。这似乎有助于在使用其他并发库(如anyio
、uvloop
)进行任务取消时,连接池无法在任务取消期间正确释放连接的问题。参考链接: #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¶
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_columns
和Table.resolve_fks
参数在Table
上的错误;这些很少使用的参数显然不适用于引用外键约束的列。在第一种情况下,引用外键的未包含列仍然会尝试创建
ForeignKey
对象,在反射中尝试解析外键约束的列时产生错误;引用跳过列的外键约束现在从表反射过程中省略,方式与Index
和UniqueConstraint
对象在相同条件下发生的情况相同。但是,不会产生警告,因为我们可能希望在 2.0 中删除所有约束的 include_columns 警告。在后一种情况下,尽管存在
resolve_fks=False
,但在找不到 FK 相关表的情况下,表别名或子查询的生成将失败;逻辑已修复,以便在找不到相关表时,ForeignKey
对象仍然代理到别名表或子查询(这些ForeignKey
对象通常用于生成连接条件),但它会发送一个标志,表明它不可解析。然后,别名表/子查询将正常工作,但例外情况是它不能用于自动生成连接条件,因为外键信息丢失。这已经是使用非反射方法(例如,连接来自不同MetaData
集合的Table
对象)生成的此类外键约束的行为。[schema] [错误] [mssql] ¶
修复了使用
Numeric
数据类型的 IDENTITY 列的Table
对象在尝试协调“自动递增”列时会产生错误的问题,从而阻止了使用Column.autoincrement
参数构造Column
,以及在尝试调用Insert
构造时发出错误。参考链接: #8111
extensions¶
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¶
sql¶
[sql] [错误] [postgresql] [sqlite] ¶
修复了 PostgreSQL
Insert.on_conflict_do_update()
方法和 SQLiteInsert.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¶
mssql¶
oracle¶
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¶
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¶
postgresql¶
[postgresql] [bug] ¶
修复了 PostgreSQL 上
ARRAY
数据类型与Enum
结合使用的 bug,其中使用.any()
或.all()
方法渲染 SQL ANY() 或 ALL(),给定 Python 枚举的成员作为参数,将在所有驱动程序上产生类型适配失败。参考: #6515
[postgresql] [bug] ¶
为 PostgreSQL
UUID
类型对象实现了UUID.python_type
属性。该属性将根据UUID.as_uuid
参数设置返回str
或uuid.UUID
。以前,此属性未实现。拉取请求由 Alex Grönholm 提供。参考: #7943
[postgresql] [bug] ¶
修复了 psycopg2 方言中使用
create_engine.pool_pre_ping
参数时的一个问题,该问题会导致用户配置的AUTOCOMMIT
隔离级别被 “ping” 处理程序意外重置。参考: #7930
mysql¶
tests¶
1.4.35¶
发布日期:2022 年 4 月 6 日sql¶
[sql] [bug] ¶
修复了新实现的
FunctionElement.table_valued.joins_implicitly
功能中的 bug,其中参数不会从原始TableValuedAlias
对象自动传播到调用TableValuedAlias.render_derived()
或TableValuedAlias.alias()
时生成的辅助对象。此外,修复了
TableValuedAlias
中的这些问题修复了重复对同一对象的连续副本调用
TableValuedAlias.render_derived()
时可能发生的潜在内存问题(对于 .alias(),我们目前仍然必须从前一个元素继续链接。不确定是否可以改进,但这是 .alias() 在其他地方的标准行为)修复了在调用
TableValuedAlias.render_derived()
或TableValuedAlias.alias()
时,单个元素类型会丢失的问题。
参考: #7890
[sql] [bug] [regression] ¶
修复了由 #7823 引起的回归,该回归影响了缓存系统,使得在 ORM 操作(例如多态加载)中 “克隆” 的绑定参数在某些情况下无法获得其正确的执行时值,从而导致渲染不正确的绑定值。
参考: #7903
1.4.34¶
发布日期:2022 年 3 月 31 日orm¶
[orm] [bug] [regression] ¶
修复了由 #7861 引起的回归,其中直接通过
Session.execute()
调用包含 ORM 实体的Insert
构造将失败。参考: #7878
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_descriptions
和UpdateBase.entity_description
,以允许检查作为Insert
,Update
或Delete
构造的一部分安装的 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 时,引擎处置完全不触及旧池中的连接,而只是删除池并替换它。此用例是为了当原始池从父进程传输时,父进程可以继续使用这些连接。另请参阅
将连接池与多进程或 os.fork() 一起使用 - 修订文档
[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¶
[schema] [usecase] ¶
添加了支持,以便传递给
Table.to_metadata()
的Table.to_metadata.referred_schema_fn
可调用对象可以返回值BLANK_SCHEMA
,以指示应将被引用的外键重置为 None。RETAIN_SCHEMA
符号也可以从此函数返回以指示 “无更改”,这将与当前也指示无更改的None
行为相同。参考: #7860
sqlite¶
mssql¶
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 日志记录标记funcName
和lineno
时,将报告正确的信息,这在过滤日志输出时可能很有用;在 Python 3.8 及更高版本上受支持。拉取请求由 Markus Gerstel 提供。参考: #7612
sql¶
[sql] [bug] ¶
修复了与类型相关的错误消息,这些消息对于元组值会失败,原因是字符串格式化语法,包括不支持的文字值和无效的布尔值的编译。
参考: #7721
[sql] [bug] [mysql] ¶
修复了 MySQL
SET
数据类型以及通用Enum
数据类型中的问题,其中__repr__()
方法不会在字符串输出中渲染所有可选参数,从而影响这些类型在 Alembic autogenerate 中的使用。MySQL 的拉取请求由 Yuki Nishimine 提供。[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¶
[postgresql] [usecase] ¶
添加了编译器支持,用于在为
CheckConstraint
、ForeignKeyConstraint
和ForeignKey
模式构造渲染 DDL 时,使用 PostgreSQLNOT VALID
短语。感谢 Gilbert Gilb’s 的 pull request。另请参阅
参考文献: #7600
mysql¶
mariadb¶
[mariadb] [bug] [regression] ¶
修复了 mariadbconnector 方言自 mariadb connector 1.0.10 以来的回归问题,其中 DBAPI 不再预缓冲 cursor.lastrowid,导致使用 ORM 插入对象时出错,并导致
CursorResult.inserted_primary_key
属性不可用。现在,该方言会主动获取此值,以适用于它的情况。参考文献: #7738
sqlite¶
oracle¶
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¶
mysql¶
mssql¶
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¶
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¶
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。[orm] [bug] [regression] ¶
修复了与缓存相关的问题,其中使用
lazyload(aliased(A).bs).joinedload(B.cs)
形式的加载程序选项将无法导致为查询缓存后的运行调用 joinedload,原因是应用于为使用aliased()
的引导实体查询加载的对象的选项/对象路径不匹配。参考文献: #7447
engine¶
mypy¶
asyncio¶
[asyncio] [usecase] ¶
添加了
async_engine_config()
函数以从配置字典创建异步引擎。这在其他方面与engine_from_config()
的行为相同。参考文献: #7301
mariadb¶
tests¶
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 中添加的 “在未过期时运行急切加载器” 的新行为会导致加载器选项错误被不适当地引发,对于使用单个
Query
或Select
加载多种实体类型的情况,以及仅适用于其中一种实体类型的加载器选项(如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
引擎¶
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 数据类型中观察到的,该数据类型目前不可缓存。参考: #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¶
测试¶
[测试] [缺陷] ¶
实现了对在 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_results
或yield_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
但不是str
或bytes
的值检测到元组值,就像在测试Sequence
时始终一样。参考: #7292
[SQL] [缺陷] ¶
修复了在 Ordering or Grouping by a Label 中描述的为排序或分组使用字符串标签的功能在
CTE
构造上使用时无法正常工作的问题,当 CTE 嵌入在封闭的Select
语句(该语句本身设置为标量子查询)内部时。参考: #7269
[SQL] [缺陷] [回归] ¶
修复了回归问题,其中
text()
构造不再被接受为case()
构造中 “whens” 列表中的目标案例。此回归似乎与试图防止某些形式的文字值(当在此处传递时被认为是模棱两可的)有关;但是,没有理由不应该像其他任何地方一样将目标案例解释为开放式 SQL 表达式,并且文字字符串或元组将转换为绑定参数,就像在其他地方一样。参考: #7287
schema¶
[schema] [缺陷] ¶
修复了
Table
中的问题,其中当Table.extend_existing
用于扩充现有Table
时,Table.implicit_returning
参数无法正确适应。参考: #7295
postgresql¶
[postgresql] [用例] [asyncpg] ¶
添加了可覆盖的方法
PGDialect_asyncpg.setup_asyncpg_json_codec
和PGDialect_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_session
和async_scoped_session()
。参考:#7103
[orm] [bug] ¶
为
Query.join()
和 ORM 版本的Select.join()
的功能添加了一个额外的警告消息层,其中一些继续发生 “自动别名” 的地方现在将被指出是应避免的模式,主要特定于连接表继承的区域,其中共享公共基表的类在没有使用显式别名的情况下连接在一起。一种情况为不推荐的模式发出旧版警告,另一种情况已完全弃用。ORM join() 中针对重叠映射表发生的自动别名与所有 API(如
contains_eager()
)不一致地工作,并且与其继续尝试使这些用例在任何地方都起作用,不如用更用户显式的模式替换,这样更清晰,更不容易出错,并进一步简化了 SQLAlchemy 的内部结构。警告包括指向 errors.rst 页面的链接,其中演示了每种模式以及推荐的修复模式。
[orm] [bug] ¶
修复了在
Session
关闭后迭代来自Session
的Result
会将对象部分附加到该会话中,使其处于基本上无效的状态的错误。如果从已关闭或以其他方式调用了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¶
[examples] [bug] ¶
修复了 examples/versioned_rows 中的示例,以正确使用 SQLAlchemy 1.4 API;当像从
Session.is_modified()
中删除 “passive” 以及添加SessionEvents.do_orm_execute()
事件钩子等 API 更改时,这些示例被遗漏了。参考:#7169
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¶
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
[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¶
1.4.24¶
发布日期:2021 年 9 月 22 日platform¶
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()
方法中的问题,该问题导致用于确定传统 ORMQuery
对象自动去重的标志在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¶
asyncio¶
[asyncio] [feature] [mysql] ¶
为 MySQL 和 MariaDB 添加了对
asyncmy
asyncio 数据库驱动程序的初始支持。这个驱动程序非常新,但似乎是aiomysql
驱动程序的唯一当前替代方案,aiomysql
驱动程序目前似乎无人维护,并且无法与当前的 Python 版本一起工作。非常感谢 long2ice 为这个方言提供的拉取请求。另请参阅
参考: #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¶
sqlite¶
[sqlite] [bug] ¶
修复了 pysqlite 驱动程序上 SQLite 无效隔离级别的错误消息未能指示 “AUTOCOMMIT” 是有效隔离级别之一的错误。
mssql¶
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 中指出的问题,通过在内部移除此功能而大大简化。
[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¶
mypy¶
postgresql¶
mssql¶
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()
方法与包含具有不可哈希类型的列表达式(例如使用非元组的JSON
或ARRAY
)的 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
)时,会注意到这一点,因为它们无法将 PythonNone
值编码为 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 版本中由于 #6503 和
Query.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
数据类型中的 PostgreSQLENUM
数据类型在 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¶
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
,而不仅仅是之前任意应用于Sequence
的StatementRole
。此修复使得Sequence
可以在所有.execute()
方法中工作,包括与Session.execute()
一起使用,而在建立了SessionEvents.do_orm_execute()
处理程序的情况下,之前是无法工作的。参考链接: #6668
schema¶
[schema] [bug] ¶
修复了当为
Table.prefixes
传递None
值时,不会存储空列表,而是存储常量None
的问题,这对于第三方方言来说可能是意外的。Alembic 的最新版本中使用了此功能,并为其传递了None
值,从而暴露了此问题。此拉取请求由 Kai Mueller 提供。参考链接: #6685
mysql¶
misc¶
[bug] [ext] [regression] ¶
修复了
sqlalchemy.ext.automap
扩展中的回归问题,即当显式映射的类指向的表同时也是 automap 将要生成的relationship()
的relationship.secondary
元素时,会发出 “overlaps” 警告,该警告在 1.4 版本中引入,并在 relationship X will copy column Q to column P, which conflicts with relationship(s): ‘Y’ 中讨论过。虽然从 automap 生成这种情况仍然受到 ‘overlaps’ 警告中提到的相同注意事项的约束,但由于 automap 主要用于更临时的用例,因此当生成具有此特定模式的多对多关系时,触发警告的条件将被禁用。参考链接: #6679
1.4.19¶
发布日期: 2021年6月22日orm¶
[orm] [bug] [regression] ¶
修复了与 #6052 相同区域的进一步回归问题,即当选项/连接所依赖的语句的左侧部分被
Query.with_entities()
方法替换,或者在使用 2.0 风格的查询时使用Select.with_only_columns()
方法时,加载器选项以及诸如Query.join()
之类的方法调用将失败。已向对象添加了一组新的状态,用于跟踪选项/连接所针对的“左侧”实体,并在主导实体更改时进行记忆化。[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¶
mypy¶
asyncio¶
[asyncio] [usecase] ¶
实现了
async_scoped_session
,以解决scoped_session
和AsyncSession
之间的一些与 asyncio 相关的不兼容性,其中某些方法(特别是async_scoped_session.remove()
方法)应与await
关键字一起使用。另请参阅
参考链接: #6583
[asyncio] [bug] [postgresql] ¶
修复了 asyncio 实现中的一个错误,即 greenlet 适配系统无法将
BaseException
子类(最值得注意的是包括asyncio.CancelledError
)传播到引擎用于使连接无效并清理连接的异常处理逻辑,从而阻止在任务取消时正确处置连接。参考链接: #6652
postgresql¶
mysql¶
mssql¶
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
将从使用中删除此缓存,但在这种情况下,没有任何特定的性能提升,因为不使用缓存与使用需要经常刷新的缓存相比,可能仍然在使用缓存的一侧胜出。[orm] [bug] [regression] ¶
调整了从基本
Session
类生成诸如scoped_session
和AsyncSession
之类的类的方式,这样,诸如 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” 对象(即
Session
,Connection
)的情况下,找到对象的Async
版本,例如AsyncSession
,AsyncConnection
等。以前,如果使用此类查找函数,则每次都会重新创建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] ¶
修复了在使用
NullPool
或StaticPool
与异步引擎一起使用时出现的问题。这主要影响 aiosqlite 方言。参考链接: #6575
[asyncio] [bug] ¶
添加了
asyncio.exceptions.TimeoutError
,asyncio.exceptions.CancelledError
作为所谓的 “退出异常”,这是一类异常,包括诸如GreenletExit
和KeyboardInterrupt
之类的事件,这些事件被认为是保证 DBAPI 连接处于不可用状态的事件,应回收该连接。参考链接: #6592
postgresql¶
sqlite¶
1.4.17¶
发布日期: 2021年5月29日orm¶
1.4.16¶
发布日期: 2021年5月28日general¶
orm¶
[orm] [bug] ¶
修复了当
relationship.cascade_backrefs
参数设置为False
时出现的问题,根据 cascade_backrefs behavior deprecated for removal in 2.0,该参数将在 SQLAlchemy 2.0 中成为标准行为,其中如果对象已通过反向引用与该集合关联,则将项目添加到唯一化集合(如set
或dict
)将无法触发级联事件。此修复代表了集合机制的根本性变化,通过引入新的事件状态,即使集合上没有净更改,也可以触发集合突变;现在可以使用新的事件钩子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¶
sql¶
[sql] [bug] [regression] ¶
修复了动态加载器策略和
relationship()
的回归问题,其中relationship.order_by
参数被存储为可变列表,当与动态查询对象一起使用的其他 “order_by” 方法结合使用时,可能会发生突变,导致 ORDER BY 标准持续重复增长。参考链接: #6549
mssql¶
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¶
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¶
1.4.14¶
发布日期: 2021年5月6日orm¶
engine¶
[engine] [usecase] [orm] ¶
对在现有
.begin()
上下文管理器内部调用.commit()
或.rollback()
的用例应用了一致的行为,并在 commit 或 rollback 之后在块内添加了可能发出 SQL 的功能。此更改延续了最初在 #6155 中添加的更改,其中提出了在.begin()
上下文管理器块内调用 “rollback” 的用例现在允许在所有范围内(包括传统和未来的
Engine
、ORMSession
、asyncioAsyncEngine
)无错误或警告地调用.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
标志设置为True
或False
,否则现在会发出警告。可以设置新的类级别属性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¶
postgresql¶
[postgresql] [usecase] ¶
在 pg8000 方言中为 PostgreSQL 添加了对服务器端游标的支持。这允许使用
Connection.execution_options.stream_results
选项。参考链接: #6198
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()
方法始终有一个事务要回滚,并且每次都会过期。[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¶
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)
方法,后者仍然保留。[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¶
postgresql¶
[postgresql] [bug] ¶
修复了一个非常古老的问题,即
Enum
数据类型不会继承MetaData.schema
参数,当MetaData
对象通过Enum
使用Enum.metadata
传递给Enum
时。参考链接:#6373
sqlite¶
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¶
engine¶
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¶
1.4.9¶
发布日期:2021 年 4 月 17 日orm¶
[orm] [usecase] ¶
建立了对
synoynm()
结合混合属性的支持,完全设置了 associationproxy,包括可以建立链接到这些构造的同义词,并且可以完全正常工作。这是一种以前半显式地不允许的行为,但是由于它并非在所有情况下都失败,因此已添加对 assoc proxy 和混合属性的显式支持。参考链接:#6267
[orm] [bug] [performance] [regression] [sql] ¶
修复了一个严重的性能问题,其中
select()
构造的遍历会遍历作为 columns 子句中列引用的每个 FROM 子句的重复乘积;对于一系列具有大量列的嵌套子查询,这可能会导致大量延迟和显着的内存增长。这种遍历被各种 SQL 和 ORM 函数使用,包括 ORMSession
在配置为具有 “table-per-bind” 时使用,虽然这不是常见的用例,但这似乎是 Flask-SQLAlchemy 硬编码为使用的,因此该问题会影响 Flask-SQLAlchemy 用户。遍历已修复为唯一化 FROM 子句,这实际上是 1.4 之前的架构隐式发生的情况。参考链接:#6304
[orm] [bug] [regression] ¶
修复了回归问题,其中映射到
synonym()
的属性不能在列加载器选项(例如load_only()
)中使用。参考链接:#6272
sql¶
postgresql¶
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 时)时也没有正确地进行调整。此修复程序确保像NULL
和true
这样的 “单例” 表达式不会 “适应” 以引用 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¶
asyncio¶
[asyncio] [bug] ¶
修复了阻止将
AsyncSession
的bind
属性设置为正确值的拼写错误。参考: #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
的更严格行为,LegacyRow
和Row
都提供了字符串键访问以及对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
派生的子类的列推断正确的类型,特别是TypeDecorator
和UserDefinedType
的列。
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.name
和Table.metadata
参数,则现在会引发信息性错误消息。 以前,如果将这些参数作为关键字参数传递,则对象将静默地初始化失败。此更改也反向移植到:1.3.25
参考: #6135
mypy¶
[mypy] [bug] ¶
应用了一系列重构和修复,以适应跨多个文件的 Mypy “增量” 模式,以前未考虑此模式。 在此模式下,Mypy 插件必须适应从其他文件中传入的 Python 数据类型,这些数据类型的信息少于直接运行时的信息。
此外,添加了一个新的装饰器
declarative_mixin()
,这对于 Mypy 插件能够明确识别声明性混合类是必要的,否则该类不会在特定的 Python 文件中使用。参考: #6147
[mypy] [bug] ¶
修复了 Mypy 插件在关系的 “collection_class” 是可调用对象而不是类时无法解释它的问题。 还改进了面向集合的关系的类型匹配和错误报告。
参考: #6205
asyncio¶
1.4.5¶
发布日期:2021 年 4 月 2 日orm¶
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
名称。
asyncio¶
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¶
mssql¶
oracle¶
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¶
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¶
engine¶
schema¶
mypy¶
[mypy] [bug] ¶
添加了对 Mypy 扩展的支持,以正确解释使用
as_declarative()
函数以及registry.as_declarative_base()
方法生成的声明性基类。[mypy] [bug] ¶
修复了 Mypy 插件中的错误,其中
Boolean
列类型的 Python 类型检测会产生异常;此外,还实现了对Enum
的支持,包括检测基于字符串的枚举与使用 Pythonenum.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¶
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¶
sql¶
mypy¶
postgresql¶
1.4.1¶
发布日期:2021 年 3 月 17 日orm¶
[orm] [bug] [回归] ¶
修复了以下回归:使用 ORM 实体生成 Core 表达式构造(例如
select()
)会急切地配置映射器,以努力保持与Query
对象的兼容性,后者为了支持许多 backref 相关的旧版用例而必然会这样做。但是,coreselect()
构造也用于映射器配置等,并且在某种程度上,这种急切配置更像是一种不便,因此在缺少 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¶
engine¶
mssql¶
[mssql] [bug] [回归] ¶
修复了以下回归:启用了 pyodbc 可用的新 setinputsizes() API,这显然与 pyodbc 的 fast_executemany() 模式不兼容,在缺少更准确的类型信息的情况下,而更准确的类型信息尚未完全实现或测试。pyodbc 方言和连接器已修改,以便除非将参数
use_setinputsizes
传递给方言(例如通过create_engine()
),否则根本不使用 setinputsizes(),此时可以使用DialectEvents.do_setinputsizes()
hook 自定义其行为。另请参阅
参考: #6058
misc¶
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] ¶
修复了由
Boolean
或Enum
生成的 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¶
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¶
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] ¶
增强
OnConflictDoUpdate
的set_
关键字以接受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¶
orm¶
[orm] [usecase] ¶
将
ORMExecuteState.bind_mapper
和ORMExecuteState.all_mappers
访问器添加到ORMExecuteState
事件对象,以便处理程序可以响应 ORM 语句执行中涉及的目标 mapper 和/或映射类或类。[orm] [usecase] [asyncio] ¶
添加了
AsyncSession.scalar()
,AsyncSession.get()
以及对sessionmaker.begin()
的支持,使其可以用作AsyncSession
的异步上下文管理器。 还添加了AsyncSession.in_transaction()
访问器。[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]
[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¶
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
参数影响),因此适用于临时连接使用,而不会产生创建许多新记录器的副作用。 该选项可以在Connection
或Engine
级别设置。另请参阅
参考链接: #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 = true
或sqlalchemy.future = false
之类的键时,可以将值 “true” 和 “false” 配置为 “boolean” 值。
sql¶
[sql] [feature] ¶
实现了对 “表值函数” 的支持,以及 PostgreSQL 支持的其他语法,这是最常见的功能请求之一。 表值函数是返回值列表或行的 SQL 函数,在 PostgreSQL 的 JSON 函数领域中很普遍,其中 “表值” 通常称为 “record” 数据类型。 表值函数也受 Oracle 和 SQL Server 支持。
添加的功能包括
FunctionElement.table_valued()
修饰符,它从 SQL 函数创建类似表的可选对象TableValuedAlias
构造,将 SQL 函数呈现为命名表支持 PostgreSQL 的特殊 “派生列” 语法,该语法包括列名,有时还包括数据类型,例如
json_to_recordset
函数,使用TableValuedAlias.render_derived()
方法。支持 PostgreSQL 的 “WITH ORDINALITY” 构造,使用
FunctionElement.table_valued.with_ordinality
参数支持从 SQL 函数中选择作为列值标量,这是 PostgreSQL 和 Oracle 支持的语法,通过
FunctionElement.column_valued()
方法一种无需使用 FROM 子句即可从表值表达式中选择单列的方法,通过
FunctionElement.scalar_table_valued()
方法。
另请参阅
表值函数 - 在 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]
[sql] [bug] [mysql] [postgresql] [sqlite] ¶
现在,如果再次调用一组选定的 DML 方法(当前都是
Insert
构造的一部分),则会引发信息丰富的错误消息,这将隐式取消先前的设置。 更改的方法包括:on_conflict_do_update
、on_conflict_do_nothing
(SQLite)、on_conflict_do_update
、on_conflict_do_nothing
(PostgreSQL)、on_duplicate_key_update
(MySQL)参考链接: #5169
[sql] [bug] ¶
修复了新的
Values
构造中的问题,其中传递对象元组会回退到每个值的类型检测,而不是利用直接传递给Values
的Column
对象,该对象告诉 SQLAlchemy 期望的类型。 这将导致枚举和 numpy 字符串等对象出现问题,但这实际上是不必要的,因为已给出期望的类型。参考链接: #5785
[sql] [bug] ¶
修复了当在对象上内部访问
.bind
属性时(尤其是在字符串化 SQL 构造时)会错误地发出RemovedIn20Warning
的问题。参考链接: #5717
[sql] [bug] ¶
在
Sequence
和Identity
对象中正确呈现cycle=False
和order=False
为NO CYCLE
和NO ORDER
。参考链接: #5722
[sql] ¶
用显式的 getter 和 setter
GenerativeSelect.get_label_style()
和GenerativeSelect.set_label_style()
替换Query.with_labels()
和GenerativeSelect.apply_labels()
,以适应三种受支持的标签样式:LABEL_STYLE_DISAMBIGUATE_ONLY
、LABEL_STYLE_TABLENAME_PLUS_COL
和LABEL_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¶
[schema] [feature] ¶
添加了
TypeEngine.as_generic()
以将方言特定的类型(例如sqlalchemy.dialects.mysql.INTEGER
)与 “最佳匹配” 的通用 SQLAlchemy 类型(在本例中为Integer
)进行映射。 拉取请求由 Andrew Hannigan 提供。另请参阅
使用数据库无关类型进行反射 - 示例用法
参考链接: #5659
[schema] [usecase] ¶
DDLEvents.column_reflect()
事件现在可以应用于MetaData
对象,在该对象中,它将对该集合本地的Table
对象生效。参考链接: #5712
[schema] [usecase] ¶
为
CreateTable
、DropTable
、CreateIndex
和DropIndex
构造添加了参数CreateTable.if_not_exists
、CreateIndex.if_not_exists
、DropTable.if_exists
和DropIndex.if_exists
,这些参数导致 “IF NOT EXISTS” / “IF EXISTS” DDL 被添加到 CREATE/DROP 中。 并非所有数据库都接受这些短语,并且操作将在不支持它的数据库上失败,因为在单个 DDL 语句的范围内没有类似的兼容回退。 拉取请求由 Ramon Williams 提供。参考链接: #2843
[schema] [changed] ¶
更改了
Identity
构造的行为,使其在应用于Column
时,将自动暗示Column.nullable
的值应默认为False
,类似于Column.primary_key
参数设置为True
时的方式。 这与所有支持数据库的默认行为相匹配,其中IDENTITY
意味着NOT NULL
。 PostgreSQL 后端是唯一支持向IDENTITY
列添加NULL
的后端,此处通过同时为Column.nullable
参数传递True
值来支持它。参考链接: #5775
asyncio¶
[asyncio] [usecase] ¶
The
AsyncEngine
,AsyncConnection
和AsyncTransaction
对象可以使用 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¶
sqlite¶
mssql¶
[mssql] [bug] [datatypes] [mysql] ¶
当使用
Comparator.as_float()
方法从 JSON 字符串中提取浮点和/或十进制值时,小数精度和行为得到了改进,当 JSON 字符串中的数值具有许多有效数字时;以前,MySQL 后端会截断具有许多有效数字的值,而 SQL Server 后端会由于 DECIMAL 强制转换的有效数字不足而引发异常。现在,这两个后端都使用与 FLOAT 兼容的方法,该方法不为浮点值硬编码有效数字。对于精度数值,添加了一个新的方法Comparator.as_numeric()
,它接受精度和小数位数的参数,并将返回值作为 PythonDecimal
对象返回,且不进行浮点转换,假设 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¶
misc¶
[usecase] [pool] ¶
引擎连接例程的内部机制已更改,因此现在可以保证,当使用
insert=True
建立PoolEvents.connect()
处理程序的用户定义事件处理程序时,将允许运行一个事件处理程序,该处理程序肯定在任何特定于方言的初始化启动之前被调用,最值得注意的是,当它执行检测默认模式名称之类的操作时。以前,这在大多数情况下会发生,但不是无条件地发生。模式文档中添加了一个新示例,说明如何在连接时事件中建立“默认模式名称”。[bug] [reflection] ¶
修复了当反射相关表时,内部调用现已弃用的
autoload
参数的错误。参考文献: #5684
[bug] [pool] ¶
修复了当使用关键字(最值得注意的是
insert=True
)指定连接池事件时,事件在设置时会丢失的回归。这将阻止需要在方言级事件之前触发的启动事件正常工作。参考文献: #5708
[bug] [pool] [pypy] ¶
修复了在 pypy 下,如果检出的连接在未关闭的情况下超出范围,连接池将不会将连接返回到池或在垃圾回收时以其他方式完成的问题。这是一个长期存在的问题,由于 pypy 在 GC 行为上的差异,如果弱引用终结器相对于另一个也正在被垃圾回收的对象,则不会调用它们。现在维护对相关记录的强引用,以便弱引用具有强引用的“基础”来触发。
参考文献: #5842
1.4.0b1¶
发布日期: 2020 年 11 月 2 日general¶
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 “插件”可以在 CoreSelect
中建立自身,允许以前在Query
内部的大部分查询构建逻辑现在发生在Select
的编译级扩展中。对于Update
和Delete
构造也进行了类似的更改。当使用Session.execute()
调用构造时,现在在方法中执行 ORM 相关的工作。对于Select
,返回的Result
对象现在包含 ORM 级别的实体和结果。参考文献: #5159
[orm] [feature] ¶
添加了在查询中为关系属性生成的 ON 子句添加任意条件的功能,这适用于诸如
Query.join()
之类的方法以及加载器选项(如joinedload()
)。此外,选项的“全局”版本允许将限制条件全局应用于查询中的特定实体。参考文献: #4472
[orm] [feature] ¶
ORM Declarative 系统现在已统一到 ORM 本身中,在
sqlalchemy.orm
下有新的导入空间和新的映射种类。现在支持基于装饰器的映射(无需使用基类)、对可以访问声明式类注册表以进行关系映射的经典样式 mapper() 调用的支持,以及 Declarative 与第三方类属性系统(如dataclasses
和attrs
)的完全集成。参考文献: #5508
[orm] [feature] ¶
当在映射器上或通过查询选项配置时,急切加载器(例如 joined loading、SELECT IN loading 等)现在将在过期对象上的刷新期间被调用;在 selectinload 和 subqueryload 的情况下,由于额外的加载仅针对单个对象,因此在这些情况下使用“immediateload”方案,该方案类似于延迟加载发出的单父查询。
另请参阅
参考文献: #1763
[orm] [feature] ¶
添加了对直接映射使用 Python
dataclasses
装饰器定义的 Python 类的支持。此拉取请求由 Václav Klusák 提供。这项新功能集成到声明式级别的新支持中,以支持诸如dataclasses
和attrs
之类的系统。参考链接: #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()
方法以及Update
和Delete
构造函数(用于 2.0 风格 执行)提供,现在将自动适应单表继承鉴别器所需的额外 WHERE 条件,以便将语句限制为引用特定子类型的行。新的with_loader_criteria()
构造函数也支持批量更新/删除操作。[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()
中,selectable
和flat
参数都设置为 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.autoflush
和Session.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 对象。但是,为了使其正确工作,存在从 SQLAlchemyResultProxy
传递的基本元数据,该元数据是从映射的列表达式派生的,最初来自QueryContext
。要从任意 SELECT 语句检索 ORM 结果,应使用Query.from_statement()
方法。参考链接: #4719
[orm] [deprecated] ¶
在 ORM 操作(如
Query.join()
)中使用字符串表示关系名称,以及在加载器选项(如selectinload()
)中使用字符串表示所有 ORM 属性名称已被弃用,并将在 SQLAlchemy 2.0 中移除。应传递类绑定的属性。这为给定的方法提供了更好的特异性,允许诸如of_type()
之类的修饰符,并降低了内部复杂性。此外,
aliased
和from_joinpoint
参数在Query.join()
中也已被弃用。aliased()
构造现在提供了极大的灵活性和功能,应直接使用。[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 模式、去重以及可用于从内存结构创建数据库结果的各种实现。另请参阅
[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
对象,以及之前的任何Engine
或Connection
。参考链接: #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_CONDITIONAL
或String.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
对象现在不会清除已回滚的事务。这本质上与 ORMSession
长期以来的行为相同,其中需要对所有封闭事务显式调用.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] [已移除] ¶
移除
Dialect
和Inspector
类中已弃用的方法get_primary_keys
。请参考Dialect.get_pk_constraint()
和Inspector.get_primary_keys()
方法。移除已弃用的事件
dbapi_error
和方法ConnectionEvents.dbapi_error
。请参考ConnectionEvents.handle_error()
事件。此更改还移除了属性ExecutionContext.is_disconnect
和ExecutionContext.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] ¶
在受支持的后端添加了正则表达式支持。已定义两个操作:
ColumnOperators.regexp_match()
,实现类似正则表达式匹配的功能。ColumnOperators.regexp_replace()
,实现正则表达式字符串替换功能。
支持的后端包括 SQLite、PostgreSQL、MySQL / MariaDB 和 Oracle。
另请参阅
参考:#1390
[sql] [feature] ¶
select()
构造及相关构造现在允许在 columns 子句中复制列标签和列本身,完全镜像列表达式的传入方式。这允许执行结果返回的元组与最初 SELECT 的内容相匹配,这与 ORMQuery
的工作方式相同,因此这在两个构造之间建立了更好的交叉兼容性。此外,它允许在某些情况下更直观地构造对列位置敏感的结构,例如 UNION(即_selectable.CompoundSelect
),其中特定列可能出现在多个位置。为了支持此更改,ColumnCollection
已被修订为支持重复列以及允许整数索引访问。参考:#4753
[sql] [feature] ¶
增强了
select()
构造的消除歧义标签功能,以便当在子查询中使用 select 语句时,来自不同表的重复列名现在会自动标记为唯一标签名,而无需使用结合表名和列名的完整“apply_labels()”功能。消除歧义的标签在子查询的 .c 集合中以纯字符串键的形式提供,最重要的是,此功能允许针对实体和任意子查询的组合使用 ORMaliased()
构造正确工作,即使源表中的列名相同,也能定位到正确的列,而无需“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
,与Table
和Sequence
的方式相同,启用后,将使操作在执行创建或删除操作之前检测索引是否存在(或不存在)。参考:#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
对象创建命名子查询时,它将取代Alias
。Subquery
的行为方式与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
对象,但也包括UniqueConstraint
、CheckConstraint
等)构造约束时,ORM 级别的InstrumentedAttribute
完全被丢弃的问题,并且从列中删除了所有 ORM 级别的注释;这是为了使约束仍然可以完全 pickle 化,而不会引入 ORM 级别的实体。这些注释不是必须存在于模式/元数据级别的。参考:#5001
[sql] [bug] ¶
基于
GenericFunction
注册的函数名称现在在所有情况下都以不区分大小写的方式检索,从而消除了 1.3 中的弃用逻辑,该逻辑暂时允许多个GenericFunction
对象以不同的大小写存在。当GenericFunction
替换另一个同名函数时,无论是否区分大小写,都会在替换对象之前发出警告。[sql] [bug] ¶
创建没有参数或空
*args
的and_()
或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_depthfirst
和sqlalchemy.sql.visitors.traverse_depthfirst
函数。这些函数在 SQLAlchemy 的任何部分都未使用。iterate()
和traverse()
函数通常用于这些函数。 还从剩余的函数中移除了未使用的选项,包括 “column_collections”、“schema_visitor”。[sql] [removed] ¶
从
Compiler
对象中移除了绑定引擎的概念,并从Compiler
中移除了.execute()
和.scalar()
方法。 这些本质上是十多年前被遗忘的方法,没有任何实际用途,并且Compiler
对象本身维护对Engine
的引用是不合适的。[sql] [removed] ¶
移除已弃用的方法
Compiled.compile
、ClauseElement.__and__
和ClauseElement.__or__
以及属性Over.func
。移除已弃用的
FromClause.count
方法。 请使用count
函数,该函数可从func
命名空间获得。参考链接: #4643
[sql] [removed] ¶
移除已弃用的参数
text.bindparams
和text.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 系列中继续存在,但会发出弃用警告。 此外,当在列上下文中评估时,将SelectBase
、Alias
和其他面向 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
因为这些是核心运算符,所以此更改的内部迁移策略是在很长一段时间内(如果不是无限期)支持旧术语,但更新所有文档、教程和内部用法以使用新术语。 新术语用于定义函数,旧术语已弃用为新术语的别名。
[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(具有不同的语法和部分功能)。
schema¶
[schema] [change] ¶
Enum.create_constraint
和Boolean.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(具有不同的语法和部分功能)。
extensions¶
[extensions] [usecase] ¶
当自定义构造被解释为 SELECT 语句的 columns 子句中的元素时,使用
sqlalchemy.ext.compiled
扩展创建的自定义编译器构造将自动向编译器添加上下文信息,这样自定义元素就可以作为结果行映射中的键进行定位,这是 ORM 为了将列元素匹配到结果元组中而使用的定位类型。参考:#4887
[extensions] [change] ¶
添加了新的参数
AutomapBase.prepare.autoload_with
,它取代了AutomapBase.prepare.reflect
和AutomapBase.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
方言的ENUM
和SET
中移除已弃用的参数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_start
和mssql_identity_increment
来执行此操作,如 自增行为 / IDENTITY 列 中所述。 此更改包括一个新的参数Sequence.data_type
,以适应 SQL Server 的数据类型选择,对于该后端,包括 INTEGER、BIGINT 和 DECIMAL(n, 0)。 SQL Server 版本的Sequence
的默认起始值已设置为 1;现在所有后端都会在 CREATE SEQUENCE DDL 中发出此默认值。[mssql] [usecase] [postgresql] [reflection] [schema] ¶
改进了对覆盖索引(带有 INCLUDE 列)的支持。 添加了 postgresql 从 Core 渲染带有 INCLUDE 子句的 CREATE INDEX 语句的能力。 索引反射还为 mssql 和 postgresql (11+) 分别报告 INCLUDE 列。
参考链接: #4458
[mssql] [usecase] [postgresql] ¶
添加了对部分索引/过滤索引(即使用
mssql_where
或postgresql_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_start
和mssql_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] ¶
正确渲染
Sequence
和Identity
列选项nominvalue
和nomaxvalue
作为 oracle 数据库上的NOMAXVALUE` 和 ``NOMINVALUE
。[oracle] [bug] ¶
Oracle 方言的
INTERVAL
类现在正确地是Interval
的抽象版本以及正确的“模拟”基类的子类,这允许在原生和非原生模式下都能正确行为; 以前它仅基于TypeEngine
。参考链接: #4971
misc¶
flambé! 龙和 The Alchemist 图像设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。 文档最后生成时间:周二 2025年3月11日 02:40:17 PM EDT