SQLAlchemy 2.0 文档
变更和迁移
- SQLAlchemy 2.0 - 主要迁移指南
- SQLAlchemy 2.0 的新特性?
- 2.0 更新日志
- 1.4 更新日志
- 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 的新特性?
项目版本
1.2 更新日志¶
1.2.19¶
发布日期: 2019年4月15日orm¶
示例¶
引擎¶
mssql¶
oracle¶
1.2.18¶
发布日期: 2019年2月15日orm¶
[orm] [bug] ¶
修复了 1.2 版本中的一个回归错误,其中通配符/load_only 加载器选项无法针对使用了 of_type() 来限制特定子类的加载器路径正确工作。该修复目前仅适用于简单子类的 of_type(),不适用于 with_polymorphic 实体,后者将在单独的问题中解决;后一种情况以前不太可能工作。
参考: #4468
[orm] [bug] ¶
修复了一个相当简单但关键的问题,即
SessionEvents.pending_to_persistent()
事件不仅在对象从 pending 移动到 persistent 时被调用,而且在对象已经 persistent 并且只是被更新时也被调用,因此导致事件在每次更新时为所有对象调用。参考: #4489
sql¶
[sql] [bug] ¶
修复了
JSON
类型具有只读JSON.should_evaluate_none
属性的问题,这会在结合此类型使用TypeEngine.evaluates_none()
方法时导致失败。感谢 Sanjana S. 提供的 pull request。参考: #4485
mysql¶
sqlite¶
mssql¶
[mssql] [bug] ¶
修复了 SQL Server “IDENTITY_INSERT” 逻辑中的一个错误,该逻辑允许对 IDENTITY 列使用显式值继续 INSERT,但未检测到
Insert.values()
与包含Column
作为键和 SQL 表达式作为值的字典一起使用的情况。参考: #4499
1.2.17¶
发布日期: 2019年1月25日orm¶
[orm] [feature] ¶
添加了新的事件钩子
QueryEvents.before_compile_update()
和QueryEvents.before_compile_delete()
,它们补充了QueryEvents.before_compile()
,用于Query.update()
和Query.delete()
方法的情况。参考: #4461
[orm] [bug] ¶
修复了当单表继承与使用 “with polymorphic” 加载的连接继承层次结构结合使用时,该单表实体的 “单表条件” 可能会与同一查询中使用的同一层次结构中的其他实体的条件混淆的问题。对 “单表条件” 的调整更具体地针对目标实体,以避免其意外地适应查询中的其他表。
参考: #4454
postgresql¶
oracle¶
1.2.16¶
发布日期: 2019年1月11日引擎¶
[引擎] [bug] ¶
修复了版本 1.2 中引入的回归错误,其中
SQLAlchemyError
基异常类的重构在 python 2k 下引入了将纯字符串消息不适当地强制转换为 Unicode,Python 解释器无法处理平台编码(通常为 ascii)之外的字符。SQLAlchemyError
类现在在 Py2K 下为__str__()
传递一个字节字符串,这与 Py2K 下的异常对象的行为一致,对__unicode__()
进行到 unicode utf-8 的安全强制转换,并使用反斜杠回退。对于 Py3K,消息通常已经是 unicode,但如果不是,则再次使用 utf-8 和反斜杠回退对__str__()
方法进行安全强制转换。参考: #4429
sql¶
postgresql¶
sqlite¶
misc¶
1.2.15¶
发布日期: 2018年12月11日orm¶
[orm] [bug] ¶
修复了当在声明性映射中使用
ForeignKey(SomeClass.id)
模式时,ORM 注释对于 primaryjoin/secondaryjoin 关系可能不正确的问题。此模式会将不需要的注释泄漏到连接条件中,这可能会破坏Query
中完成的别名操作,这些操作不应影响该连接条件中的元素。如果存在这些注释,现在会预先删除它们。参考: #4367
[orm] [bug] ¶
继续最近的 #4349 的类似主题,修复了
Comparator.any()
和Comparator.has()
的问题,其中 “secondary” 可选对象需要显式地成为 EXISTS 子句中 FROM 子句的一部分,以适应此 “secondary” 是Join
对象的情况。参考: #4366
[orm] [bug] ¶
修复了由 #4349 引起的回归错误,其中将 “secondary” 表添加到动态加载器的 FROM 子句会影响
Query
后续连接到另一个实体的能力。此修复将主实体添加为 FROM 列表的第一个元素,因为Query.join()
想要从那里跳跃。版本 1.3 也将对此问题有一个更全面的解决方案 (#4365)。参考: #4363
[orm] [bug] ¶
修复了使用
RelationshipProperty.of_type()
链接映射器选项与仅通过字符串引用属性名称的链接选项结合使用时,将无法找到属性的错误。参考: #4400
orm declarative¶
misc¶
1.2.14¶
发布日期: 2018年11月10日orm¶
[orm] [bug] ¶
修复了
Session.bulk_update_mappings()
中的错误,其中备用映射属性名称将导致 UPDATE 语句的主键列包含在 SET 子句以及 WHERE 子句中;虽然通常是无害的,但对于 SQL Server 来说,这可能会由于 IDENTITY 列而引发错误。这是 #3849 中修复的同一个错误的延续,其中测试不足以捕获此附加缺陷。参考: #4357
[orm] [bug] ¶
修复了一个小的性能问题,在某些情况下,该问题可能会给结果获取增加不必要的开销,其中涉及在查询中同时使用 ORM 列和包含这些相同列的实体。该问题与以不同方式引用列时的哈希/eq 开销有关。
参考: #4347
mysql¶
1.2.13¶
发布日期: 2018年10月31日orm¶
orm declarative¶
[orm] [declarative] [bug] ¶
修复了由版本 1.2.12 中的 #4326 引起的回归错误,其中将
declared_attr
与 mixin 结合synonym()
一起使用将无法将同义词正确映射到继承的子类。参考: #4350
[orm] [declarative] [bug] ¶
使用 use_existing_column 解决列冲突 中讨论的列冲突解决技术现在可用于
Column
,它也是主键列。以前,在允许列复制通过之前,会对在单继承子类上声明的主键列进行检查。参考: #4352
sql¶
[sql] [feature] ¶
重构了
SQLCompiler
以暴露一个类似于SQLCompiler.order_by_clause()
和SQLCompiler.limit_clause()
方法的SQLCompiler.group_by_clause()
方法,方言可以通过重写此方法来自定义 GROUP BY 的渲染方式。感谢 Samuel Chou 的 pull request。[sql] [bug] ¶
修复了
Enum
数据类型上的Enum.create_constraint
标志不会传播到类型副本的错误,这会影响声明式 mixin 和抽象基类等用例。参考:#4341
postgresql¶
[postgresql] [bug] ¶
添加了对
aggregate_order_by
函数接收多个 ORDER BY 元素的支持,之前只接受单个元素。参考:#4337
mysql¶
misc¶
[misc] [bug] ¶
修复了实用工具语言助手内部的部分代码向 Python
__import__
内置函数传递了错误类型的参数作为要导入的模块列表的问题。此问题在核心库中未产生任何症状,但可能会导致重新定义__import__
内置函数或以其他方式对其进行检测的外部应用程序出现问题。感谢 Joe Urciuoli 的 pull request。[misc] [bug] [py3k] ¶
修复了 Python 3.7 由于 Python
collections
和collections.abc
包的组织结构更改而生成的其他警告。之前的collections
警告已在 1.2.11 版本中修复。感谢 xtreak 的 pull request。参考:#4339
[bug] [ext] ¶
在关联代理扩展中的基于列表的关联集合中添加了缺失的
.index()
方法。
1.2.12¶
发布日期:2018 年 9 月 19 日orm¶
[orm] [bug] ¶
在
InstanceState
对象的弱引用清理中添加了一个检查,以检查是否存在dict
内置函数,以努力减少在解释器关闭期间发生这些清理时生成的错误消息。感谢 Romuald Brunet 的 pull request。[orm] [bug] ¶
修复了将
Lateral
构造与Query.join()
以及Query.select_entity_from()
结合使用时,不会将子句适配应用于 join 右侧的错误。“lateral” 引入了 join 右侧可关联的用例。之前,未考虑对此子句进行适配。请注意,仅在 1.2 版本中,由Query.subquery()
引入的可选对象仍然未被适配,这是因为 #4304;可选对象需要由select()
函数生成,才能作为 “lateral” join 的右侧。参考:#4334
[orm] [bug] ¶
修复了由 #3472 引起的 1.2 回归错误,其中在 post-update 操作上下文中处理 “updated_at” 样式列时,也会针对在更新后要删除的行发生,这意味着具有 Python 端值生成器的列将显示在 DELETE 之前为 UPDATE 发出的现已删除的值(这不是之前的行为),并且 SQL 发出的值生成器将使属性过期,这意味着由于行已被删除且对象已从会话中分离,因此无法访问先前的值。作为 #3472 的一部分添加的 “postfetch” 逻辑现在完全跳过最终要删除的对象。
参考:#4327
orm declarative¶
[orm] [declarative] [bug] ¶
修复了声明式属性扫描在接收通过混合属性传递的表达式代理(在类级别)而不是混合属性本身时(当通过已映射类的子类上的
@declared_attr
可调用对象接收描述符时)的错误。 这将导致在Mapper.all_orm_descriptors
中查看时,属性未报告自身为混合属性。参考:#4326
postgresql¶
[postgresql] [bug] ¶
修复了 PostgreSQL 方言中的错误,其中编译器关键字参数(例如
literal_binds=True
)未传播到 DISTINCT ON 表达式。参考:#4325
[postgresql] [bug] ¶
修复了
array_agg()
函数,它是通常的array_agg()
函数的略微修改版本,以接受传入的 “type” 参数,而无需强制在其周围添加 ARRAY,这本质上与 1.1 版本中在 #4107 中为通用函数修复的内容相同。参考:#4324
[postgresql] [bug] ¶
修复了 PostgreSQL ENUM 反射中的错误,其中区分大小写的带引号的名称将由包含引号的查询报告,这与表反射期间的目标列不匹配,因为需要去除引号。
参考:#4323
oracle¶
misc¶
[bug] [ext] ¶
修复了
BakedQuery
未将Session
使用的特定查询类作为缓存键的一部分,导致在使用自定义查询类时出现不兼容性,特别是ShardedQuery
,它具有一些不同的参数签名。参考:#4328
1.2.11¶
发布日期:2018 年 8 月 20 日orm declarative¶
sql¶
[sql] [bug] ¶
修复了与 #3639 密切相关的问题,其中在非原生布尔后端上的布尔上下文中呈现的表达式即使已经是隐式布尔表达式,也会与 1/0 进行比较,当使用
ColumnElement.self_group()
时。虽然这不会影响用户友好的后端(MySQL、SQLite),但 Oracle(以及可能的 SQL Server)无法处理。现在,表达式在任何数据库上是否隐式为布尔值都预先确定为附加检查,以避免在语句编译中生成整数比较。参考:#4320
[sql] [bug] ¶
为
WithinGroup.over()
和FunctionFilter.over()
方法添加了缺失的窗口函数参数WithinGroup.over.range_
和WithinGroup.over.rows
参数,以对应于作为 1.1 版本中 #3049 的一部分添加到 SQL 函数的 “over” 方法的 range/rows 功能。参考:#4322
[sql] [bug] ¶
修复了 UPDATE 和 DELETE 语句的多表支持未将额外的 FROM 元素视为关联目标的问题,当关联的 SELECT 也与该语句组合时。此更改现在包括,对于此类语句的 WHERE 子句中的 SELECT 语句,将尝试自动关联回父 UPDATE/DELETE 中的这些附加表,或者如果使用
Select.correlate()
,则无条件关联。请注意,如果 SELECT 语句因此没有 FROM 子句,则自动关联会引发错误,如果父 UPDATE/DELETE 在其附加表集中指定了相同的表,则现在可能会发生这种情况;显式指定Select.correlate()
以解决此问题。参考:#4313
oracle¶
misc¶
1.2.10¶
发布日期:2018 年 7 月 13 日orm¶
sql¶
[sql] [bug] ¶
修复了在任何引用它的
Table
之前显式删除Sequence
的错误,当序列也参与该表的服务器端默认值时,使用MetaData.drop_all()
时会中断。 现在在表本身被删除后调用通过非服务器端列默认函数处理要删除的序列的步骤。参考:#4300
1.2.9¶
发布日期:2018 年 6 月 29 日orm¶
[orm] [bug] ¶
修复了在
Query.join()
内部链接多个 join 元素时,当链接共享相同基类的 joined inheritance 类时,可能无法正确适配到之前的左侧的问题。参考:#3505
[orm] [bug] ¶
修复了 baked queries 的缓存键生成中的错误,该错误可能导致为跨子类的 eager loads 生成过短的缓存键。这反过来可能导致 eagerload 查询被缓存以代替非 eagerload 查询,反之亦然,对于多态 “selectin” 加载,或者也可能对于延迟加载或 selectin 加载。
参考:#4287
[orm] [bug] ¶
修复了新的多态 selectin 加载中的错误,其中内部使用的 BakedQuery 会被给定的加载器选项修改,这既会不恰当地修改子类查询,也会将效果延续到后续查询。
参考:#4286
[orm] [bug] ¶
修复了由 #4256 引起的回归错误(其本身是 #4228 的回归修复),该错误破坏了一个未文档化的行为,该行为将直接传递给
Query
构造函数的非实体序列转换为单元素序列。虽然从未支持或记录此行为,但它已在使用中,因此已作为行为约定添加到Query
。参考:#4269
[orm] [bug] ¶
修复了一个问题,该问题既是 1.2 中的性能回归,也是关于 “baked” 延迟加载器的不正确结果,涉及从原始
Query
对象的加载器选项生成缓存键。如果加载器选项以 “branched” 样式构建,并为多个选项使用公共基本元素,则相同的选项将重复渲染到缓存键中,从而导致性能问题以及生成错误的缓存键。这已修复,同时还改进了通过Query.options()
应用此类 “branched” 选项时的性能,以防止重复应用相同的选项对象。参考:#4270
sql¶
[sql] [bug] ¶
修复了由于 #4147 导致的 1.2 回归错误,其中
Table
的某些索引列已使用新列重新定义,这将在反射期间覆盖列或使用Table.extend_existing
时发生,这样当尝试复制这些索引时,Table.tometadata()
方法将失败,因为它们仍然引用替换的列。复制逻辑现在适应这种情况。参考:#4279
mysql¶
[mysql] [bug] ¶
修复了 mysql-connector-python 方言中百分号加倍的问题,该方言不需要去除百分号。此外,mysql-connector-python 驱动程序在 cursor.description 中传递列名称的方式不一致,因此添加了一个解决方法解码器,以仅在需要时有条件地将这些随机有时是字节值的值解码为 unicode。还改进了对 mysql-connector-python 的测试支持,但应注意,此驱动程序在 unicode 方面仍然存在问题,这些问题尚未解决。
[mysql] [bug] ¶
修复了索引反射中的错误,其中在 MySQL 8.0 上,在索引列规范中包含 ASC 或 DESC 的索引将无法正确反射,因为 MySQL 8.0 引入了对在表定义字符串中返回此信息的支持。
参考:#4293
[mysql] [bug] ¶
修复了 MySQLdb 方言和 PyMySQL 等变体中的错误,其中连接时额外的 “unicode returns” 检查显式使用了 “utf8” 字符集,这在 MySQL 8.0 中发出警告,应使用 utf8mb4。现在已将其替换为 utf8mb4 等效项。文档也已更新,MySQL 方言在所有示例中都指定了 utf8mb4。测试套件也进行了一些其他更改,以使用 utf8mb3 字符集和数据库(utf8mb4 在某些边缘情况下似乎存在排序规则问题),并支持 MySQL 8.0 中所做的配置默认更改,例如 explicit_defaults_for_timestamp 以及为无效 MyISAM 索引引发的新错误。
参考:#4283
[mysql] [bug] ¶
Update
构造现在可以容纳Join
对象,MySQL 支持 UPDATE..FROM。由于该构造已经接受了别名对象用于类似目的,因此已经暗示了针对非表的 UPDATE 功能,因此已添加此功能。参考:#3645
sqlite¶
[sqlite] [bug] ¶
修复了测试套件中的问题,其中 SQLite 3.24 添加了一个新的保留字,该保留字与 TypeReflectionTest 中的用法冲突。感谢 Nils Philippsen 的 pull request。
mssql¶
[mssql] [bug] ¶
修复了 MSSQL 反射中的错误,其中当不同 schema 中两个同名表具有同名主键约束时,引用其中一个表的外键约束的列将被加倍,从而导致错误。感谢 Sean Dunn 的 pull request。
参考:#4288
[mssql] [bug] [py3k] ¶
修复了 Python 3 下 SQL Server 方言中的问题,其中在针对不包含 “sys.dm_exec_sessions” 或 “sys.dm_pdw_nodes_exec_sessions” 视图的非标准 SQL server 数据库运行时,导致无法获取隔离级别,由于 UnboundLocalError,错误引发将失败。
参考:#4273
oracle¶
[oracle] [feature] ¶
添加了一个新的事件,目前仅由 cx_Oracle 方言使用,
DialectEvents.setiputsizes()
。该事件将BindParameter
对象的字典传递给 DBAPI 特定的类型对象,这些类型对象将在转换为参数名称后传递给 cx_Oraclecursor.setinputsizes()
方法。 这允许查看 setinputsizes 过程,以及更改传递给此方法的数据类型行为的能力。参考:#4290
[oracle] [bug] [mysql] ¶
修复了 Oracle 和 MySQL 方言的带有 CTE 的 INSERT FROM SELECT,其中 CTE 被放置在整个语句的上方,这与其他数据库中的典型做法一样,但是 Oracle 和 MariaDB 10.2 希望 CTE 位于 “INSERT” 段下方。 请注意,当 CTE 应用于 UPDATE 或 DELETE 语句内部的子查询时,Oracle 和 MySQL 方言尚不适用,因为 CTE 仍应用于顶部而不是子查询内部。
参考:#4275
misc¶
[feature] [ext] ¶
添加了新的属性
Query.lazy_loaded_from
,它填充了一个InstanceState
,该InstanceState
使用此Query
以便延迟加载关系。 这样做的理由是,它可以作为水平分片功能使用的提示,以便状态的身份令牌可以用作 id_chooser() 中查询的默认身份令牌。参考:#4243
[bug] [py3k] ¶
将 inspect.formatargspec() 的用法替换为从 Python 标准库复制的 vendored 版本,因为 inspect.formatargspec() 已弃用,并且从 Python 3.7.0 开始发出警告。
参考:#4291
1.2.8¶
发布日期:2018 年 5 月 28 日orm¶
[orm] [bug] ¶
修复了由 #4228 引起的 1.2.7 回归错误,#4228 本身是在修复 1.2 级别的回归,其中传递给
Session
的query_cls
可调用对象被假定为Query
的子类,并且具有类方法可用性,而不是任意可调用对象。 特别是,dogpile 缓存示例将query_cls
说明为函数而不是Query
子类。参考:#4256
[orm] [bug] ¶
修复了 1.0 版本中存在的长期回归问题,该问题阻止了自定义
MapperOption
的使用,该选项会更改延迟加载的Query
对象的 _params,因为延迟加载器本身会覆盖这些参数。这适用于 wiki 上的“temporal range”示例。 但请注意,现在需要使用Query.populate_existing()
方法,以便重写与已加载到 identity map 中的对象关联的 mapper 选项。作为此更改的一部分,自定义定义的
MapperOption
现在将导致与目标对象相关的延迟加载器默认使用非 baked 查询,除非实现了MapperOption._generate_cache_key()
方法。 特别是,这修复了使用 dogpile.cache “advanced” 示例时发生的一个回归问题,该问题由于与 baked 查询加载器不兼容而未返回缓存结果,而是发出了 SQL; 通过此更改,dogpile 示例中包含在许多版本中的RelationshipCache
选项将完全禁用 “baked” 查询。 请注意,dogpile 示例也已现代化,以避免作为 issue #4258 的一部分出现的这两个问题。参考链接: #4128
[orm] [bug] ¶
修复了新
Result.with_post_criteria()
方法无法与子查询 eager loader 正确交互的 bug,即 “post criteria” 不会应用于嵌入式子查询 eager loader。 这与 #4128 相关,因为 post criteria 功能现在由延迟加载器使用。[orm] [bug] ¶
更新了 dogpile.caching 示例,以包含新的结构,这些结构适用于 “baked” 查询系统,该系统默认在延迟加载器和某些 eager relationship loader 中使用。 由于 #4256,dogpile.caching 的 “relationship_caching” 和 “advanced” 示例也被破坏。 此处的问题也通过 #4128 中的修复程序得到解决。
参考链接: #4258
engine¶
[engine] [bug] ¶
修复了连接池问题,即如果在连接池的 “reset on return” 序列期间引发断开连接错误,并且显式事务针对封闭的
Connection
对象打开(例如从调用Session.close()
而不进行回滚或提交,或调用Connection.close()
而不先关闭使用Connection.begin()
声明的事务),则会导致双重签入,这可能会导致并发签出同一连接。 现在,通过断言整体上阻止了双重签入条件,并且特定的双重签入场景也已得到修复。参考链接: #4252
[engine] [bug] ¶
修复了引用泄漏问题,其中语句执行中使用的参数字典的值将保留在 “compiled cache” 中,这是由于存储了 Python 3 dictionary keys() 使用的键视图所致。 此 pull request 由 Olivier Grisel 提供。
sql¶
[sql] [bug] ¶
修复了将字面值解释为 SQL 表达式值时使用的 “ambiguous literal” 错误消息遇到元组值,并且无法正确格式化消息的问题。 此 pull request 由 Miguel Ventura 提供。
mssql¶
oracle¶
[oracle] [bug] ¶
Oracle BINARY_FLOAT 和 BINARY_DOUBLE 数据类型现在参与 cx_Oracle.setinputsizes(),传递 NATIVE_FLOAT,以便支持 NaN 值。 此外,
BINARY_FLOAT
,BINARY_DOUBLE
和DOUBLE_PRECISION
现在是Float
的子类,因为这些是浮点数据类型,而不是十进制。 这些数据类型已经默认将Float.asdecimal
标志设置为 False,这与Float
已有的行为一致。参考链接: #4264
[oracle] [bug] ¶
为
BINARY_FLOAT
,BINARY_DOUBLE
数据类型添加了反射功能。[oracle] [bug] ¶
更改了 Oracle 方言,以便在使用
Integer
类型时,为 cx_Oracle.NUMERIC 类型设置 setinputsizes()。 在 SQLAlchemy 1.1 及更早版本中,cx_Oracle.NUMERIC 无条件地传递给所有数字类型,而在 1.2 中,为了获得更好的数字精度而移除了此功能。 但是,对于整数,某些数据库/客户端设置将无法强制将布尔值 True/False 转换为整数,这会在使用 SQLAlchemy 1.2 时引入回归行为。 总体而言,setinputsizes 逻辑似乎需要更大的灵活性,这只是一个开始。参考链接: #4259
tests¶
misc¶
[bug] [ext] ¶
水平分片扩展现在利用了作为 #4137 一部分添加到 ORM 标识键的 identity token,当对象刷新或基于列的延迟加载或未过期操作发生时。 由于我们知道对象来自的 “shard”,因此我们在刷新时利用此值,从而避免了针对不匹配此对象标识的任何其他 shard 的查询。
参考链接: #4247
[bug] [ext] ¶
修复了在多线程上下文中针对可能调用
configure_mappers()
的其他线程使用 automapAutomapBase.prepare()
时可能发生的竞争条件,原因是使用了其他 mapper。 automap 未完成的映射工作尤其容易受到configure_mappers()
步骤的影响,从而导致错误。参考链接: #4266
1.2.7¶
发布日期: 2018 年 4 月 20 日orm¶
[orm] [bug] ¶
修复了 1.2 版本中分片查询功能中的回归问题,其中在 identity map 中搜索相关的多对一元素时,新的 “identity_token” 元素未在延迟加载操作的范围内正确考虑。 新的行为将允许使用 “id_chooser” 以确定要从 identity map 中检索的最佳标识键。 为了实现这一点,1.2 的 “identity_token” 方法的一些重构对
ShardedQuery
的实现进行了一些细微的更改,其他此类派生类应注意。参考链接: #4228
[orm] [bug] ¶
修复了单继承加载中的问题,其中对单继承子类使用别名实体,并结合
Query.select_from()
方法会导致 SQL 呈现时,未别名的表混合到查询中,从而导致笛卡尔积。 特别是,当针对单继承子类使用新的 “selectin” 加载器时,会受到影响。参考链接: #4241
sql¶
postgresql¶
mssql¶
oracle¶
[oracle] [bug] ¶
如果精度为 NULL 且 scale 为零,则 Oracle NUMBER 数据类型反射为 INTEGER,因为这是从 Oracle 表中反射 INTEGER 值时返回的方式。 此 pull request 由 Kent Bower 提供。
1.2.6¶
发布日期: 2018 年 3 月 30 日orm¶
[orm] [bug] ¶
修复了在具有使用备用名称属性设置的非主 mapper 的类中,将
Mutable.associate_with()
或Mutable.as_mutable()
与之结合使用时,会产生属性错误的 bug。 由于非主 mapper 不用于持久化,因此 mutable 扩展现在从其检测步骤中排除非主 mapper。参考链接: #4215
engine¶
sql¶
[sql] [bug] ¶
修复了版本 1.2.5 中对 #4204 的先前修复程序引起的回归问题,其中在调用
CTE.alias()
方法后引用自身的 CTE 将无法正确引用自身。参考链接: #4204
postgresql¶
[postgresql] [feature] ¶
在使用 “postgresql_partition_by” 的 PostgreSQL 表定义中添加了对 “PARTITION BY” 的支持。 此 pull request 由 Vsevolod Solovyov 提供。
mssql¶
oracle¶
misc¶
1.2.5¶
发布日期: 2018 年 3 月 6 日orm¶
[orm] [feature] ¶
添加了新功能
Query.only_return_tuples()
。 即使查询针对单个实体,也使Query
对象无条件地返回键控元组对象。 此 pull request 由 Eric Atkin 提供。[orm] [bug] ¶
修复了新的 “polymorphic selectin” 加载在要从关系延迟加载器部分加载多态对象选择时出现的 bug,从而导致加载中出现 “empty IN” 条件,从而为 “IN” 的 “inline” 形式引发错误。
参考链接: #4199
[orm] [bug] ¶
修复了 1.2 回归问题,其中包含
AliasedClass
对象的 mapper 选项(使用QueryableAttribute.of_type()
方法时很典型)无法被 pickle 序列化。 1.1 的行为是从路径中省略别名类对象,因此恢复了此行为。参考链接: #4209
sql¶
[sql] [bug] ¶
修复了 :class:.`CTE` 构造中的 bug,与 #4204 的 bug 类似,其中别名化的
CTE
在 “clone” 操作期间(ORM 中以及使用ClauseElement.params()
方法时很常见)无法正确复制自身。参考链接: #4210
[sql] [bug] ¶
修复了 CTE 呈现中的 bug,其中如果 FROM 子句中存在对 CTE 的多个引用,则也被转换为
Alias
的CTE
将无法正确呈现其 “ctename AS aliasname” 子句。参考链接: #4204
[sql] [bug] ¶
修复了新的 “expanding IN parameter” 功能中的 bug,其中值的 bind 参数处理器根本无法工作,测试未能涵盖这个非常基本的情况,其中包括 ENUM 值无法工作。
参考链接: #4198
postgresql¶
mysql¶
1.2.4¶
发布日期: 2018 年 2 月 22 日orm¶
engine¶
sql¶
1.2.3¶
发布日期: 2018 年 2 月 16 日orm¶
[orm] [feature] ¶
为
set_attribute()
函数添加了新参数set_attribute.inititator
,允许将从侦听器函数接收到的事件 token 传播到后续的 set 事件。[orm] [bug] ¶
修复了 post_update 功能中的问题,其中当父对象已被删除但依赖对象未被删除时,会发出 UPDATE。 这个问题已经存在很长时间了,但是由于 1.2 现在断言 post_update 的匹配行,因此引发了错误。
此更改也向后移植到: 1.1.16
参考链接: #4187
[orm] [bug] ¶
修复了由 issue #4116 的修复程序引起的回归问题,该问题影响了 1.2.2 以及 1.1.15 版本,其效果是在某些声明性 mixin/继承情况下以及从非映射类访问 association proxy 时,错误计算了
AssociationProxy
的 “owning class” 为NoneType
类。 “找出所有者” 逻辑已被深入的例程取代,该例程搜索分配给类或子类的完整 mapper 层次结构以确定正确的(我们希望)匹配; 如果找不到匹配项,则不会分配所有者。 如果代理用于非映射实例,则现在会引发异常。此更改也向后移植到: 1.1.16
参考链接: #4185
[orm] [bug] ¶
修复了
Bundle
对象未正确报告 bundle 表示的主Mapper
对象(如果有)的 bug。 此问题的一个直接副作用是,新的 selectinload 加载策略无法与水平分片扩展一起使用。参考链接: #4175
[orm] [bug] ¶
修复了具体继承映射中的 bug,其中用户定义的属性(例如混合属性,这些属性镜像来自同级类的映射属性的名称)将被 mapper 覆盖,在实例级别不可访问。 此外,确保在 mapper 配置阶段不会隐式调用用户绑定的描述符。
参考链接: #4188
[orm] [bug] ¶
修复了如果
reconstructor()
事件帮助程序应用于映射类的__init__()
方法,则无法识别它的 bug。参考链接: #4178
engine¶
[engine] [bug] ¶
修复了当使用
Engine.execution_options()
方法时,与类级别的Engine
关联的事件将被重复的 bug。 为了实现这一点,半私有类OptionEngine
不再直接在类级别接受事件,并将引发错误; 该类仅从其父Engine
传播类级别事件。 实例级别事件继续像以前一样工作。参考链接: #4181
[engine] [bug] ¶
URL
对象现在允许多次指定查询键,其中它们的值将被连接到列表中。 这是为了支持CreateEnginePlugin
中记录的插件功能,该功能文档说明 “plugin” 可以多次传递。 此外,可以使用新的create_engine.plugins
参数将插件名称传递给 URL 外部的create_engine()
。参考: #4170
sql¶
postgresql¶
sqlite¶
[sqlite] [bug] ¶
修复了当平台既未安装 pysqlite2 也未安装 sqlite3 时引发的导入错误,以便引发与 sqlite3 相关的导入错误,而不是 pysqlite2 的错误,因为 pysqlite2 错误不是实际的故障模式。此拉取请求由 Robin 提供。
oracle¶
tests¶
misc¶
[bug] [pool] ¶
修复了一个相当严重的连接池错误,其中在用户定义的
DisconnectionError
导致刷新后或由于 1.2 版本发布的 “pre_ping” 功能而获取的连接,如果连接通过弱引用清理(例如,面向前端的对象被垃圾回收)返回到池中,则不会被正确重置;弱引用仍然会引用先前无效的 DBAPI 连接,重置操作会被错误地调用到该连接上。这将导致日志中出现堆栈跟踪,并且连接在未重置的情况下被检入池中,这可能会导致锁定问题。此更改也向后移植到: 1.1.16
参考: #4184
1.2.2¶
发布日期:2018 年 1 月 24 日orm¶
mysql¶
[mysql] [bug] ¶
为 MySQL 方言添加了更多 MySQL 8.0 保留字,用于引用目的。此拉取请求由 Riccardo Magliocchetti 提供。
mssql¶
oracle¶
1.2.1¶
发布日期:2018 年 1 月 15 日orm¶
[orm] [bug] ¶
修复了在嵌套或子事务回滚期间被驱逐的对象,如果其主键也被修改,则不会从会话中正确删除的错误,从而导致后续使用会话时出现问题。
此更改也向后移植到: 1.1.16
参考: #4151
[orm] [bug] ¶
修复了 Load / _UnboundLoad 对象(例如加载器选项)的 pickle 格式发生更改的回退,并且
__setstate__()
会为从旧格式接收的对象引发 UnboundLocalError,即使已尝试这样做。现在添加了测试以确保其正常工作。参考: #4159
[orm] [bug] ¶
修复了由 #3954 中的新 lazyload 缓存方案引起的回退,其中使用带有 of_type 的加载器选项的查询会导致不相关路径的延迟加载因 TypeError 而失败。
参考: #4153
[orm] [bug] ¶
修复了新的 “selectin” 关系加载器中的错误,其中当加载多态对象的集合时,加载器可能会尝试加载不存在的关系,其中只有一些映射器包含该关系,通常在使用
PropComparator.of_type()
时。参考: #4156
sql¶
[sql] [bug] ¶
修复了
Insert.values()
中的错误,其中将 “multi-values” 格式与Column
对象用作键而不是字符串会失败。此拉取请求由 Aubrey Stark-Toller 提供。此更改也向后移植到: 1.1.16
参考: #4162
mssql¶
oracle¶
tests¶
misc¶
1.2.0¶
发布日期:2017 年 12 月 27 日orm¶
[orm] [feature] ¶
为 ORM 的标识映射使用的标识键元组添加了一个新的数据成员,称为 “identity_token”。此令牌默认为 None,但可以由数据库分片方案使用,以区分内存中具有相同主键但来自不同数据库的对象。水平分片扩展集成了此令牌,将分片标识符应用于它,从而允许主键在水平分片后端之间重复。
另请参阅
参考: #4137
[orm] [bug] [ext] ¶
修复了关联代理会无意中将自身链接到
AliasedClass
对象的错误,如果在首次调用时使用了AliasedClass
作为父级,则会在后续使用时导致错误。此更改也已向后移植到:1.1.15
参考: #4116
[orm] [bug] ¶
修复了
contains_eager()
查询选项中的错误,其中使用路径跨多个连接级别使用PropComparator.of_type()
来引用子类,还需要提供具有相同子类型的 “alias” 参数,以避免向查询添加不需要的 FROM 子句;此外,跨子类使用contains_eager()
,这些子类使用子类的aliased()
对象作为PropComparator.of_type()
参数,也将正确呈现。参考: #4130
[orm] [bug] ¶
Query.exists()
方法现在将在呈现查询时禁用急切加载器。以前,joined-eager 加载连接会被不必要地呈现,并且子查询急切加载查询也会被不必要地生成。新行为与Query.subquery()
方法的行为相匹配。参考: #4032
orm declarative¶
[orm] [declarative] [bug] ¶
修复了一个错误,即在基于
AbstractConcreteBase
的层次结构中的描述符(它是映射的列或关系)在刷新操作期间会被引用,从而导致错误,因为该属性未映射为映射器属性。对于AbstractConcreteBase
添加的其他属性(如 “type” 列)也可能出现类似问题,如果类未能在其映射器中包含 “concrete=True”,但此处的检查也应防止该场景引起问题。此更改也已向后移植到:1.1.15
参考: #4124
engine¶
sql¶
[sql] [bug] ¶
修复了如果参数是元组,
ColumnDefault
的__repr__
会失败的错误。此拉取请求由 Nicolas Caniart 提供。此更改也已向后移植到:1.1.15
参考: #4126
[sql] [bug] ¶
重做了 1.2.0b2 中的 startswith(), endswith() 的新 “autoescape” 选项 中引入的新 “autoescape” 功能,使其完全自动化;转义字符现在默认为正斜杠
"/"
,并应用于百分号、下划线以及转义字符本身,以实现完全自动转义。也可以使用 “escape” 参数更改字符。参考: #2694
[sql] [bug] ¶
修复了
Table.tometadata()
方法无法正确容纳不包含简单列表达式的Index
对象的错误,例如针对text()
构造的索引、使用 SQL 表达式或func
等的索引。该例程现在将表达式完全复制到新的Index
对象,同时将所有表绑定的Column
对象替换为目标表的列对象。参考: #4147
[sql] [bug] ¶
将
ColumnElement
的 “visit name” 从 “column” 更改为 “column_element”,以便当此元素用作用户定义的 SQL 元素的基础时,在各种 SQL 遍历实用程序(ORM 常用)处理时,它不会被假定为像表绑定的ColumnClause
一样运行。参考: #4142
[sql] [bug] [ext] ¶
修复了
ARRAY
数据类型中的问题,该问题与 #3832 的问题基本相同,只是不是回归,其中ARRAY
之上的列附加事件无法正确触发,从而干扰了依赖于此的系统。由此导致中断的一个关键用例是使用 mixin 来声明使用MutableList.as_mutable()
的列。参考: #4141
[sql] [bug] ¶
修复了新的 “expanding bind parameter” 功能中的错误,其中如果在一条语句中使用了多个参数,则正则表达式无法正确匹配参数名称。
参考: #4140
[sql] [enhancement] ¶
为 PostgreSQL、MySQL、MS SQL Server(以及不受支持的 Sybase 方言中)实现了 “DELETE..FROM” 语法,其方式类似于 “UPDATE..FROM” 的工作方式。引用多个表的 DELETE 语句将切换到 “multi-table” 模式,并呈现数据库理解的适当 “USING” 或 multi-table “FROM” 子句。此拉取请求由 Pieter Mulder 提供。
另请参阅
参考: #959
postgresql¶
mysql¶
mssql¶
oracle¶
misc¶
[misc] [feature] ¶
在文档中添加了一个新的错误部分,其中包含有关常见错误消息的背景信息。SQLAlchemy 中的选定异常将在其字符串输出中包含指向此页面中相关部分的链接。
[enhancement] [ext] ¶
为 baked 查询系统添加了新方法
Result.with_post_criteria()
,允许在从缓存中提取查询后进行非 SQL 修改的转换。除其他外,此方法可以与ShardedQuery
一起使用以设置分片标识符。ShardedQuery
也已修改,使其ShardedQuery.get()
方法与Result
的方法正确交互。参考: #4135
1.2.0b3¶
发布日期:2017 年 10 月 13 日orm¶
[orm] [bug] ¶
修复了 ORM 关系会警告继承层次结构中兄弟类之间存在冲突的同步目标(例如,两个关系都写入同一列)的错误,其中两个关系在写入期间永远不会实际冲突。
此更改也已向后移植到:1.1.15
参考: #4078
[orm] [bug] ¶
修复了针对单表继承实体使用的相关选择在外部查询中无法正确呈现的错误,这是由于单继承鉴别器条件调整不恰当地将条件重新应用于外部查询。
此更改也已向后移植到:1.1.15
参考: #4103
[orm] [bug] ¶
修复了
Session.merge()
中的错误,该错误与 #4030 的错误类似,其中标识映射中目标对象的内部检查可能会导致错误,如果目标对象在合并例程实际检索对象之前立即被垃圾回收。此更改也已向后移植到:1.1.14
参考文献: #4069
[ORM] [缺陷] ¶
修复了
undefer_group()
选项在从使用 joined eager loading 加载的关系中扩展时无法识别的缺陷。此外,由于该缺陷导致执行了过多的工作,Python 函数调用计数在结果集列的初始计算中也提高了 20%,补充了 #3915 的 joined eager load 改进。此更改也已向后移植到:1.1.14
参考文献: #4048
[ORM] [缺陷] ¶
修复了
Session.merge()
中的缺陷,其中集合中主键属性设置为None
的对象,对于通常是自增键的键,会被认为是数据库持久化的键,作为内部去重过程的一部分,导致实际上只插入一个对象到数据库中。此更改也已向后移植到:1.1.14
参考文献: #4056
[ORM] [缺陷] ¶
当
synonym()
用于非MapperProperty
的属性时(例如关联代理),会引发InvalidRequestError
异常。 以前,会发生递归溢出,试图查找不存在的属性。此更改也已向后移植到:1.1.14
参考文献: #4067
[ORM] [缺陷] ¶
修复了 1.2.0b1 中由于 #3934 引入的回归问题,其中如果回滚失败(目标问题是当 MySQL 丢失 SAVEPOINT 的跟踪时),
Session
将无法“停用”事务。 这将导致后续调用Session.rollback()
第二次引发错误,而不是完成并将Session
带回 ACTIVE 状态。参考文献: #4050
[ORM] [缺陷] ¶
修复了
make_transient_to_detached()
函数会使目标对象上的所有属性(包括“延迟”属性)过期的问题,这会使得属性在下次刷新时被取消延迟,从而导致意外加载属性。参考文献: #4084
[ORM] [缺陷] ¶
修复了涉及 delete-orphan 级联的缺陷,其中在父对象成为会话一部分之前成为孤立项的相关项仍然被跟踪为进入孤立状态,这导致它从会话中被 expunged 而不是被 flushed。
注意
此修复程序在 1.2.0b3 版本发布期间被意外合并,并且在当时未添加到更改日志中。此更改日志注释已追溯添加到 1.2.13 版本。
参考文献: #4040
[ORM] [缺陷] ¶
修复了 “selectin” 多态加载,使用单独的 IN 查询加载子类 中的缺陷,该缺陷阻止了多级类层次结构中的 “selectin” 和 “inline” 设置按预期方式交互。
参考文献: #4026
[ORM] [缺陷] ¶
移除了当映射器和加载器策略使用的 LRU 缓存达到其阈值时发出的警告; 此警告的最初目的是防止生成过多的缓存键,但基本上变成了检查 “创建过多引擎” 的反模式。 虽然这仍然是一种反模式,但同时创建每个测试引擎并在所有警告上引发异常的测试套件的存在将带来不便; 即使为了这个警告而更改此类测试套件的架构也不应该是至关重要的(尽管每个测试套件一个引擎总是更好)。
参考文献: #4071
[ORM] [缺陷] ¶
修复了回归问题,其中在 1.2 中作为 #3954 的一部分添加的 SQL 缓存键生成中存在缺陷,导致将
undefer_group()
选项与延迟加载的关系选项结合使用会导致属性错误。参考文献: #4049
[ORM] [缺陷] ¶
修改了 #3366 中对 ORM update/delete 求值器的更改,使得如果在 update 或 delete 中存在未映射的列表达式,如果求值器可以将其名称与目标类的映射列匹配,则会发出警告,而不是引发 UnevaluatableError。 这本质上是 1.2 之前的行为,是为了允许应用程序迁移到当前依赖此模式的情况。 但是,如果给定的属性名称无法与映射器的列匹配,则仍然会引发 UnevaluatableError,这是在 #3366 中修复的内容。
参考文献: #4073
ORM 声明式¶
引擎¶
[引擎] [功能] ¶
向
ResultProxy
添加了__next__()
和next()
方法,以便next()
内置函数可以直接在对象上工作。ResultProxy
长期以来一直具有__iter__()
方法,该方法已经允许它响应iter()
内置函数。__iter__()
的实现未更改,因为性能测试表明,在 Python 2.7 和 3.6 中,使用带有StopIteration
的__next__()
方法进行迭代的速度都慢大约 20%。参考文献: #4077
[引擎] [缺陷] ¶
对
Pool
和Connection
进行了一些调整,使得恢复逻辑不会在pool.Empty
、AttributeError
的异常捕获下运行,因为当恢复操作本身失败时,Python 3 会创建一个误导性的堆栈跟踪,将Empty
/AttributeError
作为原因,而实际上这些异常捕获是控制流的一部分。参考文献: #4028
SQL¶
[SQL] [缺陷] ¶
修复了最近添加的
ColumnOperators.any_()
和ColumnOperators.all_()
方法在作为方法调用时不起作用的缺陷,与使用独立函数any_()
和all_()
相反。 还为这些相对不直观的 SQL 运算符添加了文档示例。此更改也已向后移植到:1.1.15
参考文献: #4093
[SQL] [缺陷] ¶
添加了一个新方法
DefaultExecutionContext.get_current_parameters()
,在基于函数的默认值生成器中使用,以便检索传递给语句的当前参数。 新函数与DefaultExecutionContext.current_parameters
属性的不同之处在于,它还提供了与多值 “insert” 构造相对应的参数的可选分组。 以前,无法识别与函数调用相关的参数子集。参考文献: #4075
[SQL] [缺陷] ¶
修复了新的 SQL 注释功能中的缺陷,其中在使用
Table.tometadata()
时,表和列注释不会被复制。参考文献: #4087
[SQL] [缺陷] ¶
在 1.1 版本中,
Boolean
类型被破坏,因为对于不具有 “native boolean” 功能的后端,会发生通过bool()
进行的布尔强制转换,但对于 native boolean 后端则不会发生,这意味着字符串"0"
现在表现不一致。 在民意调查之后,达成共识,即非布尔值应引发错误,尤其是在字符串"0"
的歧义情况下; 因此,如果传入值不在None, True, False, 1, 0
范围内,Boolean
数据类型现在将引发ValueError
。参考文献: #4102
[SQL] [缺陷] ¶
改进了
Operators.op()
的行为,使得在所有情况下,如果Operators.op.is_comparison
标志设置为 True,则结果表达式的返回类型将为Boolean
,如果标志为 False,则结果表达式的返回类型将与左侧表达式的类型相同,这是其他运算符的典型默认行为。 还添加了一个新参数Operators.op.return_type
以及一个辅助方法Operators.bool_op()
。另请参阅
参考文献: #4063
[SQL] [缺陷] ¶
对
Enum
、Interval
和Boolean
类型进行了内部改进,这些类型现在扩展了一个通用的 mixinEmulated
,该 mixin 指示提供 DB 本机类型的 Python 端仿真的类型,当使用支持的后端时,切换到 DB 本机类型。 直接使用时,PostgreSQLINTERVAL
类型现在将包括 SQL 表达式的正确类型强制转换规则,这些规则也对Interval
生效(例如,将日期添加到间隔会产生日期时间)。参考文献: #4088
PostgreSQL¶
[PostgreSQL] [功能] ¶
为 psycopg2 方言添加了一个新标志
use_batch_mode
。 当Engine
调用cursor.executemany()
时,此标志启用 psycopg2 的psycopg2.extras.execute_batch
扩展的使用。 此扩展通过将 INSERT 语句批量运行,提供了数量级上的显著性能提升。 该标志默认为 False,因为它目前被认为是实验性的。另请参阅
参考文献: #4109
[PostgreSQL] [缺陷] ¶
进一步修复了
ARRAY
类与 COLLATE 结合使用的问题,因为在 #4006 中进行的修复未能适应多维数组。此更改也已向后移植到:1.1.15
参考文献: #4006
[PostgreSQL] [缺陷] ¶
修复了
array_agg
函数中的缺陷,其中传递一个已经是ARRAY
类型的参数(例如 PostgreSQLarray
构造)会产生ValueError
,原因是该函数尝试嵌套数组。此更改也已向后移植到:1.1.15
参考文献: #4107
[PostgreSQL] [缺陷] ¶
修复了 PostgreSQL
Insert.on_conflict_do_update()
中的缺陷,该缺陷会阻止 insert 语句在另一个语句中用作 CTE(例如通过Insert.cte()
)。此更改也已向后移植到:1.1.15
参考文献: #4074
[PostgreSQL] [缺陷] ¶
修复了如果使用带有架构名称的
MetaData.reflect()
,pg8000 驱动程序会失败的缺陷,因为架构名称将作为字符串子类的 “quoted_name” 对象发送,而 pg8000 无法识别该对象。 quoted_name 类型在连接时添加到 pg8000 的 py_types 集合中。参考文献: #4041
[PostgreSQL] [缺陷] ¶
为 pg8000 驱动程序启用了 UUID 支持,该驱动程序支持此数据类型的本机 Python uuid 往返。 但是,仍然不支持 UUID 数组。
参考文献: #4016
MySQL¶
[MySQL] [缺陷] ¶
当检测到 MariaDB 10.2 系列中的 10.2.8 或更早版本时,会发出警告,因为这些版本中的 CHECK 约束存在重大问题,这些问题在 10.2.9 中已得到解决。
请注意,此更改日志消息未与 SQLAlchemy 1.2.0b3 一起发布,而是追溯添加的。
此更改也已向后移植到:1.1.15
参考文献: #4097
[MySQL] [缺陷] ¶
修复了由于语法更改导致 CURRENT_TIMESTAMP 在 MariaDB 10.2 系列中无法正确反映的问题,其中该函数现在表示为
current_timestamp()
。此更改也已向后移植到:1.1.15
参考文献: #4096
[MySQL] [缺陷] ¶
MariaDB 10.2 现在支持 CHECK 约束(警告:由于 #4097 中提到的上游问题,请使用 10.2.9 或更高版本)。 当 CHECK 约束存在于
SHOW CREATE TABLE
输出中时,反射现在会将这些 CHECK 约束考虑在内。此更改也已向后移植到:1.1.15
参考文献: #4098
[MySQL] [缺陷] ¶
将新的 MySQL INSERT..ON DUPLICATE KEY UPDATE 构造的
.values
属性的名称更改为.inserted
,因为Insert
已经有一个名为Insert.values()
的方法。.inserted
属性最终呈现 MySQLVALUES()
函数。参考文献: #4072
SQLite¶
MSSQL¶
[MSSQL] [功能] ¶
添加了一个新的
TIMESTAMP
数据类型,该数据类型对于 SQL Server 来说,其行为正确地类似于二进制数据类型,而不是日期时间类型,因为 SQL Server 在此违反了 SQL 标准。 还添加了ROWVERSION
,因为 SQL Server 中的 “TIMESTAMP” 类型已被弃用,转而使用 ROWVERSION。参考文献: #4086
[MSSQL] [功能] ¶
为 PyODBC 和 pymssql 方言添加了对 “AUTOCOMMIT” 隔离级别的支持,该隔离级别通过
Connection.execution_options()
建立。 此隔离级别在底层连接对象上设置适当的 DBAPI 特定标志。参考文献: #4058
[MSSQL] [缺陷] ¶
为 SQL Server 的 PyODBC 方言添加了全方位的 “连接关闭” 异常代码,包括 ‘08S01’、‘01002’、‘08003’、‘08007’、‘08S02’、‘08001’、‘HYT00’、‘HY010’。 以前,仅涵盖 ‘08S01’。
此更改也已向后移植到:1.1.15
参考文献: #4095
[MSSQL] [缺陷] ¶
SQL Server 通过其 BIT 类型支持 SQLAlchemy 称之为 “native boolean” 的功能,因为此类型仅接受 0 或 1,并且 DBAPI 将其值作为 True/False 返回。 因此,SQL Server 方言现在启用 “native boolean” 支持,即不会为
Boolean
数据类型生成 CHECK 约束。 与其他 native boolean 的唯一区别在于没有 “true” / “false” 常量,因此此处仍然呈现 “1” 和 “0”。参考文献: #4061
[MSSQL] [缺陷] ¶
修复了 pymssql 方言,使得 SQL 文本中的百分号(例如在模数表达式或文字文本值中使用)不会加倍,这似乎是 pymssql 所期望的。 尽管 pymssql DBAPI 使用 “pyformat” 参数样式,但它本身认为百分号很重要。
参考文献: #4057
[MSSQL] [缺陷] ¶
修复了当反射自引用外键约束时,如果多个架构包含针对同名表的同名约束,SQL Server 方言可能会从多个架构中拉取列的缺陷。
参考文献: #4060
[MSSQL] [缺陷] [ORM] ¶
为方言添加了一种新的 “rowcount 支持” 类,该类特定于何时使用 “RETURNING”(在 SQL Server 上看起来像 “OUTPUT inserted”),因为当 OUTPUT 生效时,PyODBC 后端无法为我们提供 UPDATE 或 DELETE 语句的 rowcount。 这主要影响 ORM,当 flush 正在更新包含服务器计算值的一行时,如果后端未返回预期的行计数,则会引发错误。 PyODBC 现在声明它支持 rowcount,除非存在 OUTPUT.inserted,ORM 在 flush 期间会考虑这一点,以确定是否查找 rowcount。
参考文献: #4062
[MSSQL] [缺陷] [ORM] ¶
为 pymssql 方言启用了 “sane_rowcount” 标志,表明 DBAPI 现在报告来自 UPDATE 或 DELETE 语句的受影响行的正确数量。 这主要影响 ORM 版本控制功能,因为它现在可以验证目标版本上受影响的行数。
[MSSQL] [缺陷] ¶
向 SQL Server 索引反射添加了一个规则,以忽略所谓的 “堆” 索引,该索引隐式地存在于未指定聚集索引的表上。
参考文献: #4059
Oracle¶
[Oracle] [缺陷] [性能] [Py2k] ¶
修复了由 #3937 的修复程序引起的性能回归问题,其中 cx_Oracle 从 5.3 版本开始,从其命名空间中删除了
.UNICODE
符号,这被解释为 cx_Oracle 的 “WITH_UNICODE” 模式被无条件地打开,从而在 SQLAlchemy 端调用函数,这些函数无条件地将所有字符串转换为 unicode,并导致性能影响。 实际上,根据 cx_Oracle 的作者的说法,“WITH_UNICODE” 模式已从 5.1 开始完全删除,因此不再需要昂贵的 unicode 转换函数,并且如果在 Python 2 下检测到 cx_Oracle 5.1 或更高版本,则禁用这些函数。 还在 #3937 下删除的针对 “WITH_UNICODE” 模式的警告也已恢复。此更改也向后移植到:1.1.13、1.0.19
参考文献: #4035
[Oracle] [缺陷] ¶
使用 cx_Oracle 实现了对持久化和检索 Oracle 值 “infinity” 的部分支持,仅使用 Python 浮点值,例如
float("inf")
。 Decimal 支持尚未由 cx_Oracle DBAPI 驱动程序实现。参考: #4064
[Oracle] [缺陷] ¶
cx_Oracle 方言已重新设计和现代化,以利用旧的 4.x 系列 cx_Oracle 中不存在的新模式。 这包括最低 cx_Oracle 版本为 5.x 系列,并且现在已完全测试 cx_Oracle 6.x。 最重要的更改涉及类型转换,主要是关于数值/浮点和 LOB 数据类型,更有效地利用 cx_Oracle 类型处理钩子来简化绑定参数和结果数据的处理方式。
[Oracle] [缺陷] ¶
已完全删除了所有版本的 cx_Oracle 的两阶段支持,而在 1.2.0b1 中,此更改仅对 6.x 系列的 cx_Oracle 生效。 此功能在任何版本的 cx_Oracle 中都从未正确工作,并且在 cx_Oracle 6.x 中,SQLAlchemy 依赖的 API 已被删除。
参考文献: #3997
[Oracle] [缺陷] ¶
当使用
Insert.returning()
和 cx_Oracle 后端时,结果集中出现的列键现在使用正确的列/标签名称,就像所有其他方言一样。 以前,这些列键显示为ret_nnn
。[oracle] [bug] ¶
cx_Oracle 方言的几个参数现在已被弃用,将不再生效:
auto_setinputsizes
、exclude_setinputsizes
、allow_twophase
。[oracle] [bug] ¶
修复了当 Oracle 中使用类似 “column DESC” 表达式的索引被反射时,如果表也没有主键,则不会返回该索引的错误。这是由于尝试过滤掉 Oracle 隐式添加到主键列上的索引的逻辑导致的。
参考: #4042
[oracle] [bug] ¶
修复了 cx_Oracle 6.0 引起的更多回归问题;目前,用户唯一能感受到的行为变化是断开连接检测现在除了检测 cx_Oracle.InterfaceError 外,还会检测 cx_Oracle.DatabaseError,因为此行为似乎已更改。 关于数值精度和无法关闭的连接的其他问题正在等待上游 cx_Oracle 问题跟踪器的处理。
参考: #4045
[oracle] [bug] ¶
修复了 Oracle 8 “非 ANSI” 连接模式不会将
(+)
运算符添加到使用除=
运算符之外的运算符的表达式中的错误。(+)
需要位于作为右侧一部分的所有列上。参考: #4076
1.2.0b2¶
发布日期:2017 年 7 月 24 日orm¶
[orm] [bug] ¶
修复了 1.1.11 版本的一个回归错误,该错误导致在包含带有子查询加载关系的实体的查询中添加额外的非实体列会失败。这是由于 1.1.11 版本中添加的检查,作为 #4011 的结果。
此更改也向后移植到:1.1.12
参考: #4033
[orm] [bug] ¶
修复了在 1.1 版本中作为 #3514 的一部分添加的 JSON NULL 求值逻辑中的错误,该逻辑无法适应 ORM 映射的属性,这些属性的名称与映射的
Column
不同。此更改也向后移植到:1.1.12
参考: #4031
[orm] [bug] ¶
在
WeakInstanceDict
中的所有方法中添加了KeyError
检查,其中对key in dict
的检查之后是对该键的索引访问,以防止在负载下可能发生的垃圾回收竞争,垃圾回收可能会在代码假定键存在之后从字典中删除键,从而导致非常罕见的KeyError
异常。此更改也向后移植到:1.1.12
参考: #4030
tests¶
1.2.0b1¶
发布日期:2017 年 7 月 10 日orm¶
[orm] [feature] ¶
现在可以将
aliased()
构造传递给Query.select_entity_from()
方法。 实体将从aliased()
构造表示的可选对象中拉取。 这允许将aliased()
的特殊选项(例如aliased.adapt_on_names
)与Query.select_entity_from()
结合使用。此更改也向后移植到:1.1.7
参考: #3933
[orm] [feature] ¶
为
scoped_session
添加了.autocommit
属性,代理当前分配给线程的底层Session
的.autocommit
属性。 拉取请求由 Ben Fagin 提供。[orm] [feature] ¶
添加了一个新功能
with_expression()
,允许在结果时将临时的 SQL 表达式添加到查询中的特定实体。 这是将 SQL 表达式作为结果元组中的单独元素传递的替代方法。参考: #3058
[orm] [feature] ¶
添加了一种新的映射器级别继承加载样式 “polymorphic selectin”。 这种加载样式会在加载基对象类型之后,为继承层次结构中的每个子类发出查询,使用 IN 来指定所需的 primary key 值。
参考: #3948
[orm] [feature] ¶
添加了一种新的预先加载类型,称为 “selectin” 加载。 这种加载样式与 “subquery” 预先加载非常相似,不同之处在于它使用 IN 表达式,给定来自已加载父对象的主键值列表,而不是重新声明原始查询。 这会生成更高效的 “baked” 查询(例如,SQL 字符串被缓存),并且也适用于
Query.yield_per()
的上下文中。参考: #3944
[orm] [feature] ¶
lazy="select"
加载器策略现在在所有情况下都使用BakedQuery
查询缓存系统。 这消除了生成Query
对象并将其运行到select()
,然后从延迟加载相关集合和对象的过程生成字符串 SQL 语句的大部分开销。 “baked” 延迟加载器也得到了改进,使其现在可以在大多数使用查询加载选项的情况下进行缓存。参考: #3954
[orm] [feature] [ext] ¶
Query.update()
方法现在可以容纳混合属性以及复合属性,作为要放置在 SET 子句中的键的来源。 对于混合属性,提供了一个额外的装饰器hybrid_property.update_expression()
,用户可以为其提供一个返回元组的函数。另请参阅
参考: #3229
[orm] [feature] ¶
添加了新的属性事件
AttributeEvents.bulk_replace()
。 当集合分配给关系时,在传入的集合与现有集合进行比较之前,将触发此事件。 这个早期事件也允许转换传入的非 ORM 对象。 该事件与@validates
装饰器集成。另请参阅
参考: #3896
[orm] [feature] ¶
添加了新的事件处理程序
AttributeEvents.modified()
,当调用 func:.attributes.flag_modified 函数时触发,这在使用sqlalchemy.ext.mutable
扩展模块时很常见。参考: #3303
[orm] [bug] ¶
修复了子查询预先加载的问题,该问题延续了在 #2699、#3106、#3893 中修复的一系列问题,涉及当从连接的继承子类开始,然后子查询预先加载到基类的关系时,“子查询” 包含正确的 FROM 子句,同时查询还包含针对子类的条件。 前面 tickets 中的修复程序不适用于从第一级更深入地加载的额外子查询加载操作,因此已进一步推广修复程序。
此更改也向后移植到:1.1.11
参考: #4011
[orm] [bug] ¶
修复了诸如 “delete-orphan”(以及其他级联)之类的级联无法找到链接到自身是继承关系中子类的关系的对象的错误,从而导致操作无法进行。
此更改也向后移植到:1.1.10
参考: #3986
[orm] [bug] ¶
修复了由于 #3915 添加的缓存而可能在线程环境下发生的竞争条件。
Column
对象的内部集合可能会在别名对象上不适当地重新生成,当连接的预先加载程序尝试呈现 SQL 并收集结果时,会混淆连接的预先加载程序,并导致属性错误。 现在,在缓存别名对象并在线程之间共享之前,预先生成集合。此更改也向后移植到:1.1.7
参考: #3947
[orm] [bug] ¶
作为
relationship.post_update
功能的结果发出的 UPDATE 现在将与版本控制功能集成,以同时增加行的版本 ID 并断言现有版本号已匹配。参考: #3496
[orm] [bug] ¶
修复了在使用具有 “onupdate” 值的列时,与
relationship.post_update
功能相关的几个用例。 当 UPDATE 发出时,现在会使相应的对象属性过期或刷新,以便新生成的 “onupdate” 值可以填充到对象上; 以前,陈旧的值将保留。 此外,如果在对象的 INSERT 中为目标属性在 Python 中设置了值,则该值现在会在 UPDATE 期间重新发送,以便 “onupdate” 不会覆盖它(请注意,这对于服务器生成的 onupdate 也同样适用)。 最后,当在 flush 中刷新这些属性时,现在会为这些属性发出SessionEvents.refresh_flush()
事件。[orm] [bug] ¶
修复了如果版本 ID 计数器实际上没有递增,并且基表上没有其他值被修改,则与连接表继承结合使用的程序化 version_id 计数器将失败的错误,因为 UPDATE 将具有空的 SET 子句。 由于未递增版本计数器的程序化 version_id 是一个已记录的用例,因此现在检测到此特定条件,并且 UPDATE 现在将 version_id 值设置为自身,以便并发检查仍然发生。
参考: #3996
[orm] [bug] ¶
版本控制功能不支持版本计数器的 NULL 值。 如果版本 ID 是程序化的,并且在 UPDATE 中设置为 NULL,则现在会引发异常。 拉取请求由 Diana Clarke 提供。
参考: #3673
[orm] [bug] ¶
从
scoped_session
中删除了一个非常旧的关键字参数,称为scope
。 此关键字从未记录在案,并且是早期尝试允许可变作用域的尝试。参考: #3796
[orm] [bug] ¶
修复了将 “with_polymorphic” 加载与子类链接的关系(指定 joinedload 和 innerjoin=True)结合使用时,会将那些 “innerjoins” 降级为 “outerjoins” 以适应不支持该关系的其他多态类别的错误。 这适用于单个和连接的继承多态加载。
参考: #3988
[orm] [bug] ¶
为
Session.refresh()
方法添加了新的参数with_for_update
。 当Query.with_lockmode()
方法被弃用,转而使用Query.with_for_update()
时,Session.refresh()
方法从未更新以反映新选项。参考: #3991
[orm] [bug] ¶
修复了
column_property()
也被标记为 “deferred” 的情况下,会在 flush 期间被标记为 “expired”,导致它与常规属性的取消过期一起加载,即使从未访问过该属性的错误。参考: #3984
[orm] [bug] ¶
修复了子查询预先加载中的错误,其中自引用关系的 “join_depth” 参数无法正确遵守,加载所有可用的深度级别,而不是正确计算预先加载的指定级别数。
参考: #3967
[orm] [bug] ¶
为
Mapper
使用的 LRU “编译缓存”(最终将用于其他基于 ORM 的 LRU 缓存)添加了警告,这样当缓存开始达到其大小限制时,应用程序将发出警告,表明这是一个性能下降的情况,可能需要注意。 如果应用程序正在使用无限数量的Engine
对象(这是一种反模式),则 LRU 缓存可能会达到其大小限制。 否则,这可能表明存在应引起 SQLAlchemy 开发人员注意的问题。[orm] [bug] ¶
修复了错误,以提高在相关实体的延迟加载之后生效的加载器选项的特异性,以便如果这些选项包含实体信息,则加载器选项将更具体地匹配别名或非别名实体。
参考: #3963
[orm] [bug] ¶
如果命名的属性键在对象中不存在,则
flag_modified()
函数现在会引发InvalidRequestError
,因为这被假定为在 flush 过程中存在。 要标记对象 “dirty” 以进行 flush,而无需引用任何特定属性,可以使用flag_dirty()
函数。参考: #3753
[orm] [bug] ¶
Query.update()
和Query.delete()
使用的 “evaluate” 策略现在可以适应从多对一关系到实例的简单对象比较,当主键/外键列的属性名称与列的实际名称不匹配时。 以前,这将进行简单的基于名称的匹配,并因 AttributeError 而失败。参考: #3366
[orm] [bug] ¶
@validates
装饰器现在允许装饰的方法接收来自 “批量集合设置” 操作的对象,这些对象尚未与现有集合进行比较。 这允许将传入值转换为兼容的 ORM 对象,这在 “append” 事件中已经允许。 请注意,这意味着对于集合分配期间的所有值,而不是仅对于新值,都将调用@validates
方法。参考: #3896
[orm] [bug] ¶
修复了单表继承中的错误,其中 select_from() 参数在将行限制为子类时不会被考虑在内。 以前,仅会考虑请求的列中的表达式。
参考: #3891
[orm] [bug] ¶
当将集合分配给关系映射的属性时,不再更改先前的集合。 以前,旧集合会与触发的 “item remove” 事件一起清空; 现在,事件触发,而不会影响旧集合。
另请参阅
参考: #3913
[orm] [bug] ¶
当发出
SessionEvents.after_rollback()
事件时,现在会显示Session
的状态,即对象在过期之前的属性状态。 这现在与SessionEvents.after_commit()
事件的行为一致,该事件也在对象属性状态过期之前发出。参考: #3934
[orm] [bug] ¶
修复了如果
Query.with_parent()
针对aliased()
构造而不是常规映射类时,Query.with_parent()
将无法工作的错误。 还为独立的with_parent()
函数以及Query.with_parent()
添加了新的参数with_parent.from_entity
。参考: #3607
orm declarative¶
[orm] [declarative] [bug] ¶
修复了在
AbstractConcreteBase
上使用declared_attr
的错误,其中特定的返回值是一些未映射的符号,包括None
,会导致属性仅硬性求值一次并将值存储到对象字典,不允许它为子类调用。 当declared_attr
在映射类上时,此行为是正常的,并且不会在 mixin 或抽象类上发生。 由于AbstractConcreteBase
既是 “abstract” 又是实际的 “mapped”,因此此处做了一个特殊的例外情况,以便 “abstract” 行为优先于declared_attr
。参考: #3848
engine¶
[engine] [feature] ¶
为
Pool
对象添加了原生的 “悲观断开连接” 处理。 新参数Pool.pre_ping
(可从引擎中作为create_engine.pool_pre_ping
获得)应用了 pooling 文档中介绍的 “pre-ping” 配方的有效形式,该配方在每次连接签出时发出一个简单的语句(通常为 “SELECT 1”)来测试连接的活动性。 如果现有连接不再能够响应命令,则透明地回收该连接,并且当前时间戳之前进行的所有其他连接都将失效。参考: #3919
[engine] [bug] ¶
添加了一个异常处理程序,当
Connection
的 “autorollback” 功能本身引发异常时,将在 Py2K 上发出 “cause” 异常的警告。 在 Py3K 中,解释器自然会将这两个异常报告为在处理另一个异常期间发生的一个异常。 这将继续进行回滚失败处理的一系列更改,这些更改上次在 1.0.12 中的 #2696 中访问过。此更改也向后移植到:1.1.7
参考: #3946
[engine] [bug] ¶
修复了以下错误:在不常见的情况下,当直接将
Compiled
对象传递给Connection.execute()
时,生成Compiled
对象的方言未被咨询以获取字符串语句的参数风格,而是假设它会匹配方言级别的参数风格,从而导致不匹配的发生。参考链接: #3938
sql¶
[sql] [功能] ¶
添加了一种新的
bindparam()
类型,称为“expanding”(扩展)。它用于IN
表达式,其中元素列表在语句执行时被渲染成单独的绑定参数,而不是在语句编译时。这允许将单个绑定参数名称链接到包含多个元素的 IN 表达式,并允许查询缓存与 IN 表达式一起使用。新功能允许相关的“select in”加载和“polymorphic in”加载功能利用 baked query 扩展来减少调用开销。此功能在 1.2 版本中应被视为实验性功能。参考链接: #3953
[sql] [功能] [mysql] [oracle] [postgresql] ¶
通过新的
Table.comment
和Column.comment
参数,为Table
和Column
对象添加了 SQL 注释支持。注释在表创建时作为 DDL 的一部分包含,可以以内联方式或通过适当的 ALTER 语句添加,并且也会在表反射中以及通过Inspector
反射回来。目前支持的后端包括 MySQL、PostgreSQL 和 Oracle。非常感谢 Frazer McLean 在此方面付出的巨大努力。参考链接: #1546
[sql] [功能] ¶
当
ColumnOperators.in_()
和ColumnOperators.notin_()
运算符的右手条件为空序列时,发出警告的长期行为已得到修改;现在默认情况下渲染简单的“静态”表达式“1 != 1”或“1 = 1”,而不是拉入原始的左手表达式。这导致 NULL 列与空集的比较结果从 NULL 更改为 true/false。此行为是可配置的,可以使用create_engine.empty_in_strategy
参数在create_engine()
中启用旧行为。参考链接: #3907
[sql] [功能] ¶
为“startswith”和“endswith”比较器类添加了一个新的选项
autoescape
;这提供了一个转义字符,并自动将其应用于所有通配符“%”和“_”。拉取请求由 Diana Clarke 提供。注意
此功能已从 1.2.0b2 中的初始实现更改为 1.2.0,现在 autoescape 作为布尔值传递,而不是作为要用作转义字符的特定字符。
参考: #2694
[sql] [bug] ¶
修复了在
WithinGroup
构造的结构迭代期间会发生的 AttributeError。此更改也向后移植到:1.1.11
参考链接: #4012
[sql] [bug] ¶
修复了由于 #3859 在 1.1.5 版本中发布的回归错误,其中基于
Variant
对表达式的“右手边”评估进行调整以遵守底层类型的“右手边”规则,导致Variant
类型被不适当地丢失,在某些情况下,我们*确实*希望将左手边类型直接传递到右手边,以便可以将绑定级别规则应用于表达式的参数。此更改也向后移植到:1.1.9
参考链接: #3952
[sql] [bug] [postgresql] ¶
更改了
ResultProxy
的机制,以无条件地延迟“自动关闭”步骤,直到Connection
完成对象操作;在 PostgreSQL ON CONFLICT with RETURNING 不返回行的情况下,自动关闭发生在这个以前不存在的用例中,导致通常在 INSERT/UPDATE/DELETE 上无条件发生的自动提交行为失败。此更改也向后移植到:1.1.9
参考链接: #3955
[sql] [bug] ¶
现在,
Numeric
、Integer
和日期相关类型之间的类型强制转换规则包括额外的逻辑,该逻辑将尝试在“已解析”类型上保留传入类型的设置。目前,此操作的目标是asdecimal
标志,以便Numeric
或Float
与Integer
之间的数学运算将保留 “asdecimal” 标志,以及类型是否应为Float
子类。参考链接: #4018
[sql] [bug] [mysql] ¶
如果方言指定它也支持“原生十进制”模式,则
Float
类型的结果处理器现在无条件地通过float()
处理器运行值。虽然大多数后端将为浮点数据类型提供 Pythonfloat
对象,但 MySQL 后端在某些情况下缺乏类型信息以提供此信息,并且除非完成浮点转换,否则返回Decimal
。参考链接: #4020
[sql] [bug] ¶
为传递给 SQL 语句的 Python “float” 值的处理添加了一些额外的严格性。“float”值将与
Float
数据类型关联,而不是像以前那样与 Decimal 强制转换的Numeric
数据类型关联,从而消除了在 SQLite 上发出的令人困惑的警告以及不必要的 Decimal 强制转换。参考链接: #4017
[sql] [bug] ¶
所有比较运算符(如 LIKE、IS、IN、MATCH、equals、greater than、less than 等)的运算符优先级都已合并到一个级别,以便对它们相互使用的表达式将在它们之间生成括号。这符合 Oracle、MySQL 和其他数据库的声明运算符优先级,这些数据库将所有这些运算符置于相同的优先级,以及 PostgreSQL 9.5 及更高版本,它们也扁平化了运算符优先级。
另请参阅
参考链接: #3999
[sql] [bug] ¶
修复了使用
ColumnOperators.is_()
或类似运算符的表达式类型不会是“boolean”类型,而是“nulltype”类型的问题,以及当针对未类型化表达式使用自定义比较运算符时也会出现此问题。这种类型化会影响表达式在更大上下文以及结果行处理中的行为。参考链接: #3873
[sql] [bug] ¶
修复了
Label
构造的否定,以便在将not_()
修饰符应用于标记表达式时,内部元素可以被正确否定。参考链接: #3969
[sql] [bug] ¶
SQL 语句中百分号“加倍”以进行转义的系统已得到改进。与
literal_column
构造以及ColumnOperators.contains()
等运算符相关的百分号“加倍”现在基于正在使用的 DBAPI 的声明参数风格发生;对于百分号敏感的参数风格(如 PostgreSQL 和 MySQL 驱动程序中常见的参数风格),将发生加倍,对于其他参数风格(如 SQLite 的参数风格),则不会发生加倍。这允许更数据库无关地使用literal_column
构造成为可能。参考链接: #3740
[sql] [bug] ¶
修复了列级
CheckConstraint
在 sqltext 是 Core 表达式而不是纯字符串的情况下,无法使用底层方言编译器编译 SQL 表达式并应用适当的标志以将文字值生成为内联的问题。这在很久以前已在 0.9 版本中为表级检查约束修复,作为 #2742 的一部分,表级检查约束更常见地使用 Core SQL 表达式而不是纯字符串表达式。参考链接: #3957
[sql] [bug] ¶
修复了如果 SQL 本身是未类型化的表达式(例如纯文本),则在“pre-execute”代码路径中,面向 SQL 的 Python 端列默认值可能无法在 INSERT 时正确执行的错误。“pre-execute”代码路径相当不常见,但是当不使用 RETURNING 时,可以应用于具有 SQL 默认值的非整数主键列。
参考链接: #3923
[sql] [bug] ¶
当名称区分大小写(例如,包含大写字符)时,由列级
collate()
和ColumnOperators.collate()
渲染的 COLLATE 表达式现在被引用为标识符。请注意,这不会影响已引用的类型级排序规则。参考链接: #3785
[sql] [bug] ¶
修复了在列上下文中使用的
Alias
对象尝试将其自身分组为带括号的表达式时会引发参数错误的错误。以这种方式使用Alias
尚未完全支持 API,但它适用于一些最终用户配方,并且可能在支持某些未来的 PostgreSQL 功能中发挥更重要的作用。参考链接: #3939
schema¶
[schema] [bug] ¶
如果创建的
ForeignKeyConstraint
对象的“本地”和“远程”列的数量不匹配,则现在会引发ArgumentError
,否则会导致约束的内部状态不正确。请注意,这也影响了方言的反射过程为外键约束生成一组不匹配的列的情况。此更改也向后移植到:1.1.10
参考链接: #3949
postgresql¶
[postgresql] [bug] ¶
继续修复 1.1.8 版本中发布的正确处理 PostgreSQL 版本字符串“10devel”的问题,额外调整了正则表达式以处理“10beta1”形式的版本字符串。虽然 PostgreSQL 现在提供了更好的方法来获取此信息,但我们至少在 1.1.x 版本中坚持使用正则表达式,以最大程度地降低与旧的或备用的 PostgreSQL 数据库的兼容性风险。
此更改也向后移植到:1.1.11
参考链接: #4005
[postgresql] [bug] ¶
修复了将
ARRAY
与具有排序规则的字符串类型一起使用会导致在 CREATE TABLE 中生成错误语法的问题。此更改也向后移植到:1.1.11
参考文献: #4006
[postgresql] [bug] ¶
为 GRANT、REVOKE 关键字添加了“自动提交”支持。拉取请求由 Jacob Hayes 提供。
此更改也向后移植到:1.1.10
[postgresql] [bug] ¶
添加了对解析开发版本(如“PostgreSQL 10devel”)的 PostgreSQL 版本字符串的支持。拉取请求由 Sean McCully 提供。
此更改也向后移植到:1.1.8
[postgresql] [bug] ¶
修复了基本
ARRAY
数据类型不会调用ARRAY
的绑定/结果处理器的问题。参考链接: #3964
[postgresql] [bug] ¶
在反射 PostgreSQL
INTERVAL
数据类型时,添加了对所有可能的“fields”标识符(例如“YEAR”、“MONTH”、“DAY TO MINUTE”等)的支持。此外,INTERVAL
数据类型本身现在包含一个新的参数INTERVAL.fields
,可以在其中指定这些限定符;限定符也会在反射/检查时反射回生成的数据类型中。参考链接: #3959
mysql¶
[mysql] [功能] ¶
为 MySQL 的 ON DUPLICATE KEY UPDATE MySQL 特定
Insert
对象添加了支持。拉取请求由 Michael Doronin 提供。参考链接: #4009
[mysql] [bug] ¶
MySQL 5.7 引入了对“SHOW VARIABLES”命令的权限限制;MySQL 方言现在将处理 SHOW 不返回行的情况,特别是对于 SQL_MODE 的初始获取,并将发出警告,指示应修改用户权限以允许行的存在。
此更改也向后移植到:1.1.11
参考链接: #4007
[mysql] [bug] ¶
删除了对 UTC_TIMESTAMP MySQL 函数的古老且不必要的拦截,这妨碍了将其与参数一起使用。
此更改也向后移植到:1.1.10
参考链接: #3966
[mysql] [bug] ¶
修复了 MySQL 方言在渲染 CREATE TABLE 时,在表选项与 PARTITION 选项结合使用时渲染表选项的错误。PARTITION 相关选项需要跟随表选项,而以前没有强制执行此顺序。
此更改也向后移植到:1.1.10
参考链接: #3961
[mysql] [bug] ¶
当调用
MetaData.reflect()
时,添加了对由于过时的表定义而无法反射的视图的支持;对于无法响应DESCRIBE
的表,会发出警告,但操作会成功。参考链接: #3871
mssql¶
[mssql] [bug] ¶
修复了当使用 Azure 数据仓库时,SQL Server 事务隔离必须从不同的视图中获取的错误,现在尝试对两个视图进行查询,如果失败仍然继续,则无条件引发 NotImplemented,以提供针对未来新 SQL Server 版本中任意 API 更改的最佳弹性。
此更改也向后移植到:1.1.11
参考链接: #3994
[mssql] [bug] ¶
为 SQL Server 方言添加了一个占位符类型
XML
,以便可以重新渲染包含此类型的反射表作为 CREATE TABLE。该类型没有特殊的往返行为,目前也不支持其他限定参数。此更改也向后移植到:1.1.11
参考链接: #3973
[mssql] [bug] ¶
SQL Server 方言现在允许数据库和/或所有者名称中包含点,在所有者周围的字符串中显式使用方括号,并且可以选择在数据库名称周围也使用方括号。此外,为架构名称发送
quoted_name
构造将不会在点上拆分,并将完整字符串作为“所有者”传递。quoted_name
现在也可以从sqlalchemy.sql
导入空间获得。参考链接: #2626
oracle¶
[oracle] [功能] [postgresql] ¶
为
Sequence
添加了新的关键字Sequence.cache
和Sequence.order
,以允许渲染 Oracle 和 PostgreSQL 理解的 CACHE 参数,以及 Oracle 理解的 ORDER 参数。拉取请求由 David Moore 提供。此更改也向后移植到:1.1.12
[oracle] [功能] ¶
Oracle 方言现在在使用
Inspector.get_unique_constraints()
,Inspector.get_check_constraints()
时检查唯一约束和检查约束。由于 Oracle 没有与唯一Index
分开的唯一约束,因此反射的Table
仍然不会有关联的UniqueConstraint
对象。拉取请求由 Eloy Felix 提供。参考链接: #4003
[oracle] [bug] ¶
当使用 DBAPI 的 6.0b1 或更高版本时,已完全删除对 cx_Oracle 的两阶段事务的支持。在任何情况下,两阶段功能在历史上都无法在 cx_Oracle 5.x 下使用,并且 cx_Oracle 6.x 已删除了此功能所依赖的连接级“twophase”标志。
此更改也向后移植到:1.1.11
参考文献: #3997
[oracle] [bug] ¶
修复了由于“b”字符,cx_Oracle 方言的版本字符串解析对于 cx_Oracle 6.0b1 版本会失败的错误。版本字符串解析现在通过正则表达式而不是简单的拆分进行。
此更改也向后移植到:1.1.10
参考链接: #3975
[oracle] [bug] ¶
cx_Oracle 方言现在支持“合理的行计数”,也就是说,当通过 DBAPI
cursor.executemany()
执行一系列参数集时,我们可以使用cursor.rowcount
来验证匹配的行数。这在 ORM 中检测并发修改场景时会产生影响,因为即使 ORM 正在批处理语句,也可以检测到一些简单的情况,并且当使用更严格的版本控制功能时,ORM 仍然可以使用语句批处理。假设至少版本 5.0 的 cx_Oracle 启用了该标志,这现在很常见。参考链接: #3932
[oracle] [错误] ¶
Oracle 反射现在“规范化”赋予外键约束的名称,即,对于不区分大小写的名称,以全小写形式返回。这已经是索引和主键约束以及所有表和列名称的行为。这将允许 Alembic 自动生成脚本在最初指定为不区分大小写时正确比较和呈现外键约束名称。
参考: #3276
其他¶
[功能] [ext] ¶
在
Session
中添加了新的标志Session.enable_baked_queries
,以允许在会话范围内禁用 baked queries,从而减少内存使用。还添加了新的Bakery
包装器,以便可以检查由BakedQuery.bakery
返回的 bakery。[错误] [ext] ¶
在声明式类正在进行垃圾回收且新的 automap prepare() 操作同时进行的情况下,防止将 “None” 作为类进行测试,这种情况非常少见,会命中在 gc 后未完全执行的 weakref。
此更改也向后移植到:1.1.10
参考: #3980
[错误] [ext] ¶
修复了
sqlalchemy.ext.mutable
中的错误,其中Mutable.as_mutable()
方法不会跟踪使用TypeEngine.copy()
复制的类型。与 1.0 相比,这在 1.1 中更像是一种回归,因为TypeDecorator
类现在是SchemaEventTarget
的子类,除其他外,它向父Column
指示在复制Column
时应复制类型。当将声明式与 mixin 或抽象类一起使用时,这些复制很常见。此更改也向后移植到:1.1.8
参考: #3950
[错误] [ext] ¶
为
Result.count()
方法添加了对绑定参数的支持,例如通常通过Query.params()
设置的参数。 以前,省略了对参数的支持。 拉取请求由 Pat Deegan 提供。此更改也向后移植到:1.1.8
[错误] [ext] ¶
AssociationProxy.any()
、AssociationProxy.has()
和AssociationProxy.contains()
比较方法现在支持链接到属性,该属性本身也是一个AssociationProxy
,以递归方式。参考: #3769
[错误] [ext] ¶
为
MutableSet
实现了就地突变运算符__ior__
、__iand__
、__ixor__
和__isub__
,为MutableList
实现了__iadd__
,以便在使用这些 mutator 方法更改集合时触发更改事件。参考: #3853
[错误] [声明式] ¶
如果
declared_attr.cascading
修饰符与声明式属性一起使用,而该属性本身是在要映射的类上声明的,而不是在声明式 mixin 类或__abstract__
类上声明的,则会发出警告。declared_attr.cascading
修饰符目前仅适用于 mixin/抽象类。参考: #3847
[错误] [ext] ¶
改进了关联代理列表集合,以便在使用
list.append()
的情况下,可以防止针对新创建的关联对象过早地自动刷新,并且当关联代理访问端点集合时,将调用延迟加载。 现在,先访问端点集合,然后再调用创建器来生成关联对象。参考: #3941
[错误] [ext] ¶
sqlalchemy.ext.hybrid.hybrid_property
类现在支持跨子类多次调用 mutator,例如@setter
、@expression
等,并且现在提供了一个@getter
mutator,以便可以在子类或其他类中重新使用特定的 hybrid。 这现在与标准 Python 中@property
的行为相匹配。[错误] [ext] ¶
修复了
sqlalchemy.ext.serializer
扩展中的一个错误,即无法可靠地序列化“带注释的” SQL 元素(由 ORM 为多种类型的 SQL 表达式生成)。 还将序列化器的默认 pickle 级别提升为 “HIGHEST_PROTOCOL”。参考: #3918
flambé! 龙和 The Alchemist 图像设计由 Rotem Yaari 创建并慷慨捐赠。
使用 Sphinx 7.2.6 创建。 文档上次生成时间:Tue 11 Mar 2025 02:40:17 PM EDT