1.2 更新日志

1.2.19

发布日期: 2019年4月15日

orm

  • [orm] [bug]

    修复了 1.2 版本中的一个回归错误,该错误是由于引入了关系惰性加载器的烘焙查询,在生成“惰性子句”期间,在记忆属性中发生竞争条件。如果两个线程同时初始化记忆属性,则烘焙查询可能会使用绑定参数键生成,这些键随后会被下一次运行中的新键替换,从而导致惰性加载查询将相关条件指定为 None。此修复确保在生成新的子句和参数对象之前固定参数名称,以便每次名称都相同。

    参考: #4507

示例

  • [示例] [bug]

    修复了 large_resultsets 示例案例中的错误,其中由于代码重新格式化而重命名的 “id” 变量导致测试失败。感谢 Matt Schuchhardt 提供的 pull request。

    参考: #4528

引擎

  • [引擎] [bug]

    使用 __eq__() 比较 URL 的两个对象时,未考虑端口号,仅端口号不同的两个对象被认为是相等的。现在在 URL__eq__() 方法中添加了端口比较,端口号不同的对象现在不相等。此外,__ne__() 没有为 URL 实现,这在使用 Python2 中的 != 时会导致意外结果,因为 Python2 中比较运算符之间没有隐含的关系。

    参考: #4406

mssql

  • [mssql] [bug]

    在隔离级别更改为 SNAPSHOT 后,会发出 commit(),因为 pyodbc 和 pymssql 都打开了一个隐式事务,这会阻止在当前事务中发出后续 SQL。

    参考: #4536

oracle

  • [oracle] [bug]

    为 Oracle 方言添加了对 NCHAR 数据类型反射的支持,并将 NCHAR 添加到 Oracle 方言导出的类型列表中。

    参考: #4506

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

mysql

  • [mysql] [bug]

    修复了由 #4344 引起的第二个回归错误(第一个是 #4361),它解决了 MySQL 问题 88718,其中使用的转换为小写函数对于带有 OSX/Windows 大小写约定的 Python 2 不正确,这将引发 TypeError。已为此逻辑添加了完整覆盖,以便在所有 Python 版本上的所有三种大小写约定中,每个代码路径都以模拟风格进行练习。与此同时,MySQL 8.0 修复了问题 88718,因此该解决方法仅适用于 MySQL 8.0 版本的特定跨度。

    参考: #4492

sqlite

  • [sqlite] [bug]

    修复了 SQLite DDL 中的一个错误,其中使用表达式作为服务器端默认值需要将其包含在括号中才能被 sqlite 解析器接受。感谢 Bartlomiej Biernacki 提供的 pull request。

    参考: #4474

mssql

  • [mssql] [bug]

    修复了 SQL Server “IDENTITY_INSERT” 逻辑中的一个错误,该逻辑允许对 IDENTITY 列使用显式值继续 INSERT,但未检测到 Insert.values() 与包含 Column 作为键和 SQL 表达式作为值的字典一起使用的情况。

    参考: #4499

1.2.17

发布日期: 2019年1月25日

orm

postgresql

  • [postgresql] [bug]

    修改了在反射 CHECK 约束时使用的查询,以使用 pg_get_constraintdef 函数,因为 consrc 列在 PG 12 中已被弃用。感谢 John A Stevenson 提供的提示。

    参考: #4463

oracle

  • [oracle] [bug]

    修复了由于 1.2 版本中 cx_Oracle 方言的重构而导致的整数精度逻辑回归。我们现在不再将 cx_Oracle.NATIVE_INT 类型应用于发送整数值的结果列(检测为正精度且 scale == 0),这会遇到值超出 32 位边界的整数溢出问题。相反,输出变量保持未类型化,以便 cx_Oracle 可以选择最佳选项。

    参考: #4457

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

  • [sql] [bug] [mysql] [oracle]

    修复了为 DropTableComment 发出的 DDL 的问题,Alembic 的即将到来的版本将使用该 DDL,该 DDL 对于 MySQL 和 Oracle 数据库是不正确的。

    参考: #4436

postgresql

  • [postgresql] [bug]

    修复了如果枚举/域的名称或模式的名称需要引号,则远程模式中存在的 ENUM 或自定义域在列反射中无法识别的问题。新的解析方案现在完全解析带引号或不带引号的标记,包括对 SQL 转义引号的支持。

    参考: #4416

  • [postgresql] [bug]

    修复了如果多个对象在不同的模式名称下具有相同的名称,则同一个 MetaData 对象引用的多个 ENUM 对象将无法创建的问题。PostgreSQL 方言使用的内部记忆化,用于跟踪在 DDL 创建序列期间是否在数据库中创建了特定的 ENUM,现在考虑了模式名称。

sqlite

  • [sqlite] [bug]

    基于 SQL 表达式的索引的反射现在被跳过并发出警告,这与 Postgresql 方言的方式相同,我们目前不支持反射其中包含 SQL 表达式的索引。以前,会生成具有 None 列的索引,这会破坏像 Alembic 这样的工具。

    参考: #4431

misc

  • [no_tags]

    修复了 “expanding IN” 功能中的问题,其中在查询中多次使用相同的绑定参数名称会导致在重写查询中的参数的过程中出现 KeyError。

    参考: #4394

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

  • [orm] [declarative] [bug]

    column() 对象应用于声明性类的情况下发出警告,因为这似乎是要成为 Column 对象。

    参考: #4374

misc

  • [no_tags]

    添加了对 mysqlclient 和 pymysql 接受的 write_timeout 标志的支持,以便在 URL 字符串中传递。

    参考: #4381

  • [no_tags]

    修复了 PostgreSQL 域的反射问题,该域表示为数组将无法识别。感谢 Jakub Synowiec 提供的 pull request。

    参考: #4377, #4380

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

  • [mysql] [bug]

    修复了由 #4344 引起的回归错误,该错误在 1.2.13 中发布,其中使用 information_schema.columns 视图解决了 MySQL 8.0 在反射外键引用时引用的列名的大小写敏感性问题。该解决方法在 OSX / lower_case_table_names=2 上失败,这为 information_schema.columnsSHOW CREATE TABLE 生成了不匹配的大小写,因此在不区分大小写的 SQL 模式下,现在使用不区分大小写的匹配。

    参考: #4361

1.2.13

发布日期: 2018年10月31日

orm

  • [orm] [bug]

    修复了 “dynamic” 加载器需要在查询的 FROM 子句中显式设置 “secondary” 表的错误,以适应 secondary 是一个连接对象的情况,否则该连接对象不会仅从其列中拉入查询。

    参考: #4349

orm declarative

  • [orm] [declarative] [bug]

    修复了由版本 1.2.12 中的 #4326 引起的回归错误,其中将 declared_attr 与 mixin 结合 synonym() 一起使用将无法将同义词正确映射到继承的子类。

    参考: #4350

  • [orm] [declarative] [bug]

    使用 use_existing_column 解决列冲突 中讨论的列冲突解决技术现在可用于 Column,它也是主键列。以前,在允许列复制通过之前,会对在单继承子类上声明的主键列进行检查。

    参考: #4352

sql

postgresql

  • [postgresql] [bug]

    添加了对 aggregate_order_by 函数接收多个 ORDER BY 元素的支持,之前只接受单个元素。

    参考:#4337

mysql

  • [mysql] [bug]

    将单词 function 添加到 MySQL 的保留字列表中,该单词现在是 MySQL 8.0 中的关键字

    参考:#4348

  • [mysql] [bug]

    为 MySQL 8.0 系列中引入的 MySQL bug #88718 添加了一个解决方法,该 bug 导致外键约束的反射未报告被引用列的正确大小写敏感性,从而在使用反射约束时(例如使用 automap 扩展时)导致错误。此解决方法会向 information_schema 表发出额外的查询,以检索正确的大小写敏感名称。

    参考:#4344

misc

  • [misc] [bug]

    修复了实用工具语言助手内部的部分代码向 Python __import__ 内置函数传递了错误类型的参数作为要导入的模块列表的问题。此问题在核心库中未产生任何症状,但可能会导致重新定义 __import__ 内置函数或以其他方式对其进行检测的外部应用程序出现问题。感谢 Joe Urciuoli 的 pull request。

  • [misc] [bug] [py3k]

    修复了 Python 3.7 由于 Python collectionscollections.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

  • [oracle] [bug]

    修复了 cx_Oracle 7.0 的问题,其中 Oracle param.getvalue() 的行为现在返回一个列表,而不是单个标量值,从而破坏了整个 Core 和 ORM 中的自动递增逻辑。dml_ret_array_val 兼容性标志用于 cx_Oracle 6.3 和 6.4,以建立与 7.0 及更高版本的兼容行为,对于 cx_Oracle 6.2.1 及更早版本,版本号检查将回退到旧的逻辑。

    参考:#4335

misc

  • [bug] [ext]

    修复了 BakedQuery 未将 Session 使用的特定查询类作为缓存键的一部分,导致在使用自定义查询类时出现不兼容性,特别是 ShardedQuery,它具有一些不同的参数签名。

    参考:#4328

1.2.11

发布日期:2018 年 8 月 20 日

orm declarative

  • [orm] [declarative] [bug]

    修复了先前未经测试的用例中的问题,允许声明式映射类从声明式基类外部的经典映射类继承,包括它适应未映射的中间类。未映射的中间类可以指定 __abstract__,现在可以正确解释,或者中间类可以保持未标记状态,并且将在层次结构中检测到经典映射的基类。为了预测可能将经典映射混合到现有声明式层次结构中的现有场景,如果为给定类检测到多个映射基类,则现在会引发错误。

    参考:#4321

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

  • [oracle] [bug]

    对于 cx_Oracle,根据 cx_Oracle 开发人员的建议,Integer 数据类型现在将绑定到 “int”。 以前,使用 cx_Oracle.NUMBER 会导致 cx_Oracle 6.x 系列中精度损失。

    参考:#4309

misc

  • [bug] [py3k]

    在 Python 3.3 及更高版本中,开始从 “collections.abc” 导入 “collections”,以实现 Python 3.8 兼容性。感谢 Nathaniel Knight 的 pull request。

  • [no_tags]

    修复了 SQLite 数据库的 “schema” 名称在表反射中无法正确引用 schema 名称的问题。感谢 Phillip Cloud 的 pull request。

1.2.10

发布日期:2018 年 7 月 13 日

orm

  • [orm] [bug]

    修复了 Bundle 构造中的错误,其中当 Bundle 用作渲染 SQL 的一部分时(例如在语句的 ORDER BY 或 GROUP BY 中),放置两个同名的列会被去重。

    参考:#4295

  • [orm] [bug]

    修复了由于 #4287 导致的 1.2.9 回归错误,其中将 Load 选项与字符串通配符结合使用会导致 TypeError。

    参考:#4298

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_Oracle cursor.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 级别的回归,其中传递给 Sessionquery_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

  • [mssql] [bug]

    修复了由 #4061 引起的 1.2 回归问题,其中 SQL Server “BIT” 类型将被视为 “native boolean”。 此处的目的是避免在列上创建 CHECK 约束,但更大的问题是 BIT 值不像 true/false 常量那样表现,并且不能解释为独立表达式,例如 “WHERE <column>”。 SQL Server 方言现在恢复为非 native boolean,但带有一个额外的标志,仍然可以避免创建 CHECK 约束。

    参考链接: #4250

oracle

  • [oracle] [bug]

    Oracle BINARY_FLOAT 和 BINARY_DOUBLE 数据类型现在参与 cx_Oracle.setinputsizes(),传递 NATIVE_FLOAT,以便支持 NaN 值。 此外,BINARY_FLOAT, BINARY_DOUBLEDOUBLE_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

  • [tests] [bug]

    修复了测试套件中的一个 bug,其中如果外部方言为 server_version_info 返回 None,则排除逻辑将引发 AttributeError

    参考链接: #4249

misc

  • [bug] [ext]

    水平分片扩展现在利用了作为 #4137 一部分添加到 ORM 标识键的 identity token,当对象刷新或基于列的延迟加载或未过期操作发生时。 由于我们知道对象来自的 “shard”,因此我们在刷新时利用此值,从而避免了针对不匹配此对象标识的任何其他 shard 的查询。

    参考链接: #4247

  • [bug] [ext]

    修复了在多线程上下文中针对可能调用 configure_mappers() 的其他线程使用 automap AutomapBase.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

  • [sql] [bug]

    修复了使用 “literal_binds” 选项的 INSERT 语句的编译问题,该语句还使用显式序列和 “inline” 生成(如 PostgreSQL 和 Oracle 上),将无法适应序列处理例程中的额外关键字参数。

    参考链接: #4231

postgresql

  • [postgresql] [feature]

    添加了新的 PG 类型 REGCLASS,该类型有助于将表名强制转换为 OID 值。 此 pull request 由 Sebastian Bank 提供。

    参考链接: #4160

  • [postgresql] [bug]

    修复了 PostgreSQL “range” 数据类型(如 DATERANGE)的特殊 “not equals” 运算符在与 Python None 值比较时无法呈现 “IS NOT NULL” 的 bug。

    参考链接: #4229

mssql

  • [mssql] [bug]

    修复了由 #4060 引起的 1.2 回归问题,其中用于反射 SQL Server 跨模式外键的查询错误地限制了条件。

    参考链接: #4234

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

  • [engine] [bug]

    修复了连接池中的 bug,其中如果之前的 “connect” 处理程序抛出异常,则连接可能存在于池中,但未调用其所有 “connect” 事件处理程序; 请注意,方言本身具有发出 SQL 的 connect 处理程序,例如设置事务隔离级别的处理程序,如果数据库处于不可用状态,则这些处理程序可能会失败,但仍然允许连接。 如果任何 connect 处理程序失败,则现在首先使连接无效。

    参考链接: #4225

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

  • [mssql] [bug]

    调整了 pyodbc 的 SQL Server 版本检测,仅允许使用数字 token,过滤掉非整数,因为方言使用此值进行元组数字比较。 这通常适用于任何情况下的所有已知 SQL Server / pyodbc 驱动程序。

    参考链接: #4227

oracle

  • [oracle] [bug]

    支持的最低 cx_Oracle 版本为 5.2 (2015 年 6 月)。 以前,方言断言版本为 5.0,但从 1.2.2 开始,我们使用了一些直到 5.2 才出现的符号。

    参考链接: #4211

misc

  • [bug] [declarative]

    删除了在从非映射声明性 mixin 调用时,调用命名为 @declared_attr 方法的 __table_args__, __mapper_args__ 时发出的警告。 当在映射类上覆盖这些方法之一时,直接调用这些方法被记录为使用的方法。 警告仍然针对常规属性名称发出。

    参考链接: #4221

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 的多个引用,则也被转换为 AliasCTE 将无法正确呈现其 “ctename AS aliasname” 子句。

    参考链接: #4204

  • [sql] [bug]

    修复了新的 “expanding IN parameter” 功能中的 bug,其中值的 bind 参数处理器根本无法工作,测试未能涵盖这个非常基本的情况,其中包括 ENUM 值无法工作。

    参考链接: #4198

postgresql

  • [postgresql] [bug] [py3k]

    修复了首次在 #4006 中引入的 PostgreSQL COLLATE / ARRAY 调整中的 bug,其中 Python 3.7 正则表达式中的新行为导致修复失败。

    此更改也向后移植到: 1.1.18

    参考链接: #4208

mysql

  • [mysql] [bug]

    MySQL 方言现在使用 SELECT @@version 显式查询服务器版本,以确保我们获得正确的版本信息。 像 MaxScale 这样的代理服务器会干扰传递给 DBAPI 的 connection.server_version 值的值,因此这不再可靠。

    此更改也向后移植到: 1.1.18

    参考链接: #4205

1.2.4

发布日期: 2018 年 2 月 22 日

orm

  • [orm] [bug]

    修复了 ORM 版本控制功能中的 1.2 回归问题,其中针对 select()alias() 的映射(也对底层表使用了版本控制列)会由于作为 #3673 一部分添加的检查而失败。

    参考链接: #4193

engine

  • [engine] [bug]

    修复了由 1.2.3 中 #4181 的修复程序引起的回归问题,其中涉及 EngineOptionEngine 的事件系统的更改未考虑事件删除,这将在类级别调用时引发 AttributeError

    参考链接: #4190

sql

  • [sql] [bug]

    修复了 CTE 表达式在给定名称区分大小写或另有需要引号时,其名称或别名名称不会被引用的 bug。 此 pull request 由 Eric Atkin 提供。

    参考链接: #4197

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

  • [sql] [feature]

    添加了对 Enum 的支持,在使用 Python pep-435 风格的枚举对象时,可以持久化枚举的值而不是键。用户提供一个可调用函数,该函数将返回要持久化的字符串值。这允许针对非字符串值的枚举也可以进行值持久化。此拉取请求由 Jon Snyder 提供。

    参考: #3906

  • [sql] [bug]

    修复了当多个键指向相同值时,Enum 类型无法正确处理枚举“别名”的错误。此拉取请求由 Daniel Knell 提供。

    参考: #4180

postgresql

  • [postgresql] [bug]

    将 “SSL SYSCALL error: Operation timed out” 添加到 psycopg2 驱动程序的“断开连接”场景触发消息列表中。此拉取请求由 André Cruz 提供。

    此更改也向后移植到: 1.1.16

  • [postgresql] [bug]

    将 “TRUNCATE” 添加到 PostgreSQL 方言接受作为“自动提交”触发关键字的关键字列表中。此拉取请求由 Jacob Hayes 提供。

    此更改也向后移植到: 1.1.16

sqlite

  • [sqlite] [bug]

    修复了当平台既未安装 pysqlite2 也未安装 sqlite3 时引发的导入错误,以便引发与 sqlite3 相关的导入错误,而不是 pysqlite2 的错误,因为 pysqlite2 错误不是实际的故障模式。此拉取请求由 Robin 提供。

oracle

  • [oracle] [feature]

    外键的 ON DELETE 选项现在是 Oracle 反射的一部分。Oracle 不支持 ON UPDATE 级联。此拉取请求由 Miroslav Shubernetskiy 提供。

  • [oracle] [bug]

    修复了 cx_Oracle 断开连接检测(由 pre_ping 和其他功能使用)中的错误,其中可能将错误作为 DatabaseError 引发,其中包括数字错误代码;之前我们没有在这种情况下检查断开连接代码。

    参考: #4182

tests

  • [tests] [bug]

    在 1.2 中添加的一个测试,原本以为可以确认 Python 2.7 的行为,但结果证明只能确认 Python 2.7.8 及更高版本的行为。Python 错误 #8743 仍然影响 Python 2.7.7 及更早版本中的集合比较,因此涉及 AssociationSet 的相关测试不再在这些较旧的 Python 2.7 版本上运行。

    参考: #3265

misc

  • [bug] [pool]

    修复了一个相当严重的连接池错误,其中在用户定义的 DisconnectionError 导致刷新后或由于 1.2 版本发布的 “pre_ping” 功能而获取的连接,如果连接通过弱引用清理(例如,面向前端的对象被垃圾回收)返回到池中,则不会被正确重置;弱引用仍然会引用先前无效的 DBAPI 连接,重置操作会被错误地调用到该连接上。这将导致日志中出现堆栈跟踪,并且连接在未重置的情况下被检入池中,这可能会导致锁定问题。

    此更改也向后移植到: 1.1.16

    参考: #4184

1.2.2

发布日期:2018 年 1 月 24 日

orm

  • [orm] [bug]

    修复了关于新 bulk_replace 事件的 1.2 回归,其中当批量赋值将对象分配给新所有者时,反向引用将无法从先前的所有者处删除对象。

    参考: #4171

mysql

  • [mysql] [bug]

    为 MySQL 方言添加了更多 MySQL 8.0 保留字,用于引用目的。此拉取请求由 Riccardo Magliocchetti 提供。

mssql

  • [mssql] [bug]

    将 ODBC 错误代码 10054 添加到 ODBC / MSSQL 服务器的断开连接错误代码列表中。

    参考: #4164

oracle

  • [oracle] [bug]

    当使用 NVARCHAR2 数据类型(在 SQLAlchemy 中对应于 sqltypes.Unicode())时,cx_Oracle 方言现在无条件地调用 setinputsizes() 并使用 cx_Oracle.NCHAR。根据 cx_Oracle 的作者的说法,这允许在 Oracle 客户端中进行正确的转换,而与 NLS_NCHAR_CHARACTERSET 的设置无关。

    参考: #4163

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

  • [mssql] [bug]

    修复了 1.2 中的回归,其中 #3785 中新修复的排序规则名称引用破坏了 SQL Server,SQL Server 明确不理解引用的排序规则名称。混合大小写排序规则名称是否被引用现在被推迟到方言级别的决定,以便每个方言可以直接准备这些标识符。

    参考: #4154

oracle

  • [oracle] [bug]

    修复了从 cx_Oracle 方言中删除大多数 setinputsizes 规则影响 TIMESTAMP 数据类型检索小数秒能力的回退。

    参考: #4157

  • [oracle] [bug]

    修复了 Oracle 导入中的回归,其中缺少逗号导致出现未定义的符号。此拉取请求由 Miroslav Shubernetskiy 提供。

tests

  • [tests] [bug]

    从公共测试套件中删除了一个 oracle 特定的 requirements 规则,该规则干扰了第三方方言套件。

  • [tests] [bug]

    添加了一个新的排除规则 group_by_complex_expression,该规则禁用使用 “GROUP BY <expr>” 的测试,这对于至少两个第三方方言来说似乎不可行。

misc

  • [bug] [ext]

    修复了由于 #3769 (允许链式 any() / has()) 导致的关联代理中的回归,其中针对形式为(o2m 关系,associationproxy(m2o 关系,m2o 关系))的链式关联代理的 contains() 会引发关于在链的最终链接上重新应用 contains() 的错误。

    参考: #4150

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

  • [engine] [feature]

    URL 对象的 “password” 属性现在可以是任何用户定义或用户子类化的字符串对象,该对象响应 Python 内置的 str()。传递的对象将作为数据成员 URL.password_original 保留,并在读取 URL.password 属性以生成字符串值时进行咨询。

    参考: #4089

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

  • [postgresql] [feature]

    添加了新的 MONEY 数据类型。此拉取请求由 Cleber J Santos 提供。

mysql

  • [mysql] [bug]

    MySQL 5.7.20 现在警告使用 @tx_isolation 变量;现在执行版本检查,并使用 @transaction_isolation 代替以防止此警告。

    此更改也已向后移植到:1.1.15

    参考: #4120

  • [mysql] [bug]

    修复了 1.2.0b3 版本中的回归,其中 “MariaDB” 版本比较在 Python 3 下对于某些特定的 MariaDB 版本字符串可能会失败。

    参考: #4115

mssql

  • [mssql] [bug]

    修复了 sqltypes.BINARY 和 sqltypes.VARBINARY 数据类型不包含 pyodbc 的正确绑定值处理程序的错误,这允许传递 pyodbc.NullParam 值,这有助于 FreeTDS。

    参考: #4121

oracle

  • [oracle] [bug]

    添加了一些额外的规则,以在使用 asdecimal=True 时完全处理带有 cx_Oracle 数字类型的 Decimal('Infinity')Decimal('-Infinity') 值。

    参考: #4064

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 声明式

  • [ORM] [声明式] [缺陷]

    如果子类尝试覆盖使用 @declared_attr.cascading 在超类上声明的属性,则会发出警告,指示被覆盖的属性将被忽略。 如果没有更复杂的开发工作,则无法完全支持到更深层次的子类的这种用例,因此为了保持一致性,无论覆盖属性如何,“cascading” 都会一直向下传递。

    参考文献: #4091

  • [ORM] [声明式] [缺陷]

    如果 @declared_attr.cascading 属性与特殊的声明性名称(例如 __tablename__)一起使用,则会发出警告,因为这没有效果。

    参考文献: #4092

引擎

  • [引擎] [功能]

    ResultProxy 添加了 __next__()next() 方法,以便 next() 内置函数可以直接在对象上工作。 ResultProxy 长期以来一直具有 __iter__() 方法,该方法已经允许它响应 iter() 内置函数。 __iter__() 的实现未更改,因为性能测试表明,在 Python 2.7 和 3.6 中,使用带有 StopIteration__next__() 方法进行迭代的速度都慢大约 20%。

    参考文献: #4077

  • [引擎] [缺陷]

    PoolConnection 进行了一些调整,使得恢复逻辑不会在 pool.EmptyAttributeError 的异常捕获下运行,因为当恢复操作本身失败时,Python 3 会创建一个误导性的堆栈跟踪,将 Empty / AttributeError 作为原因,而实际上这些异常捕获是控制流的一部分。

    参考文献: #4028

SQL

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 类型的参数(例如 PostgreSQL array 构造)会产生 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 属性最终呈现 MySQL VALUES() 函数。

    参考文献: #4072

SQLite

  • [SQLite] [缺陷]

    修复了如果引用的表位于远程架构中(例如在 SQLite 上,远程数据库由 ATTACH 引用),SQLite CHECK 约束反射会失败的缺陷。

    此更改也已向后移植到:1.1.15

    参考文献: #4099

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_setinputsizesexclude_setinputsizesallow_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

  • [tests] [bug] [py3k]

    修复了测试 fixtures 中的问题,该问题与 Python 3.6.2 中关于上下文管理器所做的更改不兼容。

    此更改也向后移植到:1.1.12, 1.0.18

    参考: #4034

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() 事件。

    参考: #3471, #3472

  • [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.commentColumn.comment 参数,为 TableColumn 对象添加了 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]

    现在,NumericInteger 和日期相关类型之间的类型强制转换规则包括额外的逻辑,该逻辑将尝试在“已解析”类型上保留传入类型的设置。目前,此操作的目标是 asdecimal 标志,以便 NumericFloatInteger 之间的数学运算将保留 “asdecimal” 标志,以及类型是否应为 Float 子类。

    参考链接: #4018

  • [sql] [bug] [mysql]

    如果方言指定它也支持“原生十进制”模式,则 Float 类型的结果处理器现在无条件地通过 float() 处理器运行值。虽然大多数后端将为浮点数据类型提供 Python float 对象,但 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.cacheSequence.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 的行为相匹配。

    参考: #3911, #3912

  • [错误] [ext]

    修复了 sqlalchemy.ext.serializer 扩展中的一个错误,即无法可靠地序列化“带注释的” SQL 元素(由 ORM 为多种类型的 SQL 表达式生成)。 还将序列化器的默认 pickle 级别提升为 “HIGHEST_PROTOCOL”。

    参考: #3918