SqlAlchemy 2.0 中文文档(六十)(1)https://developer.aliyun.com/article/1560726
1.3.9
发布日期:2019 年 10 月 4 日
orm
- [orm] [bug]
修复了由#4775(在版本 1.3.6 中发布)引起的 selectinload 加载策略中的回归,其中 None 的多对一属性将不再被加载器填充。虽然由于延迟加载器在获取时填充 None,通常不会注意到这一点,但如果对象被分离,将导致分离实例错误。
参考:#4872 - [orm] [bug]
将普通字符串表达式传递给Session.query()
已被弃用,因为所有字符串强制转换在#4481中已被移除,而这个应该已经包含在内。可以使用literal_column()
函数生成文本列表达式。
参考:#4873 - [orm] [bug]
在Session
可能会在SessionEvents.after_flush()
挂钩中发生的加载操作中,隐式地将一个对象与具有相同主键的另一个对象交换出标识映射,从而分离旧对象,这可能是发生的结果。警告旨在通知用户某些特殊条件导致此情况发生,并且先前的对象可能不处于预期状态。
参考:#4890
引擎
- [引擎] [用例]
添加了新的create_engine()
参数create_engine.max_identifier_length
。这将覆盖方言编码的“最大标识符长度”,以适应最近更改了此长度的数据库,而 SQLAlchemy 方言尚未调整以检测该版本。此参数与现有的create_engine.label_length
参数交互,因为它为匿名生成的标签建立了最大(和默认)值。此外,方言系统中已添加了关于最大标识符长度的连接后检测。此功能首先由 Oracle 方言使用。
另请参阅
最大标识符长度 - 在 Oracle 方言文档中
参考:#4857
sql
- [sql] [用例]
添加了一个明确的错误消息,用于当传递给Table
的对象不是SchemaItem
对象时,而不是解析为属性错误。
参考:#4847 - [sql] [错误]
在绑定参数中干扰“pyformat”或“named”格式的字符,即%,(,)
和空格字符,以及一些通常不希望出现的字符,会在使用匿名名称的bindparam()
中被提前剥离。这些匿名名称通常是从一个包含这些字符的命名列自动生成的,不使用.key
,以便它们既不干扰 SQLAlchemy 编译器对字符串格式化的使用,也不干扰参数的驱动程序级解析,这两者在修复之前可能会被演示。此更改仅适用于内部生成和使用的匿名参数名称,不适用于最终用户定义的名称,因此该更改不应对任何现有代码产生影响。特别适用于 psycopg2 驱动程序,它否则不会引用特殊参数名称,但也会剥离前导下划线以适应 Oracle(但尚未剥离前导数字,因为某些匿名参数当前完全基于数字/下划线);无论如何,Oracle 继续引用包含特殊字符的参数名称。
参考:#4837
sqlite
- [sqlite] [用例]
增加了对 sqlite“URI”连接的支持,允许在查询字符串中传递特定于 sqlite 的标志,例如 Python sqlite3 驱动程序支持的“只读”。
另请参阅
URI 连接
参考:#4863
mssql
- [mssql] [错误]
在用于反射的Table
中使用 SQL Server 多部分模式名称时,对模式名称应用了标识符引用,同时对Inspector
方法(如Inspector.get_table_names()
)也进行了处理;这适用于数据库名称中的特殊字符或空格。此外,如果当前数据库与传递的目标所有者数据库名称匹配,则不会发出“use”语句。
参考:#4883
oracle
- [oracle] [用例]
现在 Oracle 方言在使用 Oracle 版本 12.2 或更高版本时会发出警告,如果未设置create_engine.max_identifier_length
参数。在这种特定情况下,默认版本为 Oracle 服务器配置中设置的“兼容性”版本,而不是实际服务器版本。在 1.4 版本中,12.2 或更高版本的默认 max_identifier_length 将移至 128 个字符。为了保持向前兼容性,应用程序应将create_engine.max_identifier_length
设置为 30,以保持相同的长度行为,或者设置为 128 以测试即将到来的行为。这个长度决定了生成的约束名称如何被截断,例如CREATE CONSTRAINT
和DROP CONSTRAINT
语句,这意味着新长度可能会导致与使用旧长度生成的名称不匹配,影响数据库迁移。
另请参阅
最大标识符长度 - 在 Oracle 方言文档中
参考:#4857 - [oracle] [错误]
当使用 SQLAlchemy 的Date
、DateTime
或Time
数据类型时,恢复了将 cx_Oracle.DATETIME 添加到 setinputsizes() 调用中的功能,因为一些复杂查询需要它存在。这在 1.2 系列中由于任意原因被移除。
参考:#4886
测试
- [测试] [错误]
修复了在 1.3.8 中发布的单元测试回归,该回归会导致 Oracle、SQL Server 和其他非本地 ENUM 平台失败,原因是作为#4285的一部分添加了新的枚举测试,枚举在工作单元中创建了重复的名称约束。
参考:#4285
1.3.8
发布日期:2019 年 8 月 27 日
ORM
- [ORM] [用例]
添加了对使用 Python pep-435 枚举对象作为 ORM 映射的主键列值的Enum
数据类型的支持。由于这些值本身不可排序,而 ORM 对主键要求可排序,因此在类型系统中添加了一个新的TypeEngine.sort_key_function
属性,允许任何 SQL 类型为其类型的 Python 对象实现排序,工作单元会查询此排序。Enum
类型然后使用给定枚举的数据库值定义这一点。通过将可调用对象传递给Enum.sort_key_function
参数,还可以重新定义排序方案。拉取请求由 Nicolas Caniart 提供。
参考:#4285 - [ORM] [错误]
修复了由于内部上下文字典中的映射器/关系状态而导致Load
对象不可 pickle 的 bug。现在,这些对象通过与加载器选项系统中其他元素类似的技术转换为可 pickle。
参考:#4823
引擎
- [引擎] [特性]
添加了新参数create_engine.hide_parameters
,当设置为 True 时,将导致 SQL 参数不再被记录,也不会在StatementError
对象的字符串表示中呈现。
参考:#4815 - [engine] [bug]
修复了一个问题,即如果 dialect“initialize”过程在首次连接时遇到意外异常,初始化过程将无法完成,然后在后续连接尝试中不再尝试,使得 dialect 处于未初始化或部分初始化状态,需要根据对实时连接的检查来建立参数的范围。事件系统中的“invoke once”逻辑已经重新设计,以适应这种情况,使用新的私有 API 功能建立一个“exec once”钩子,该钩子将继续允许初始化程序在后续连接中触发,直到完成而不引发异常。这不会影响事件系统中现有的once=True
标志的行为。
参考:#4807
postgresql
- [postgresql] [usecase]
增加了对包含特殊 PostgreSQL 限定词“NOT VALID”的 CHECK 约束的反射支持,这些限定词可能存在于已添加到现有表中的 CHECK 约束中,指示这些约束不适用于表中现有数据。由Inspector.get_check_constraints()
返回的 CHECK 约束的 PostgreSQL 字典可能包含一个额外的条目dialect_options
,其中将包含一个条目"not_valid": True
,如果检测到此符号。感谢 Bill Finn 的拉取请求。
参考:#4824 - [postgresql] [bug]
修订了对于 1.3.7 版本中添加的对 psycopg2“execute_values()”功能的支持的方法,该支持是为了#4623而添加的。该方法依赖于一个正则表达式,该表达式无法匹配更复杂的 INSERT 语句,例如涉及子查询的语句。新方法完全匹配作为 VALUES 子句呈现的字符串。
参考:#4623 - [postgresql] [bug]
修复了一个错误,即当针对一个array
对象使用 Postgresql 运算符(如Comparator.contains()
和Comparator.contained_by()
)时,对于非整数值,由于一个错误的断言语句,这些运算符无法正确运行。
参考:#4822
sqlite
- [sqlite] [bug] [reflection]
修复了设置为仅通过表名而不是列名引用父表的 FOREIGN KEY 不会正确反映“referred columns”的 bug,因为如果没有显式给出,SQLite 的 PRAGMA 不会报告这些列。出于某种原因,这是硬编码为假定本地列的名称,这对某些情况可能有效,但不正确。新方法反映了被引用表的主键,并使用约束列列表作为被引用列列表,如果远程列不直接在反映的 pragma 中存在。
参考:#4810
1.3.7
发布日期:2019 年 8 月 14 日
orm
- [orm] [bug]
修复了由新的多对一逻辑的 selectinload 引起的回归问题,其中一个基于主键连接条件而不是真实外键的条件会导致如果父对象上给定键值的相关对象不存在,则会导致 KeyError。
参考:#4777 - [orm] [bug]
修复了在与应用了基于表达式的“offset”的查询一起使用Query.first()
或切片表达式时会引发 TypeError 的 bug,由于针对“offset”的“or”条件不希望它是 SQL 表达式而不是整数或 None。
参考:#4803
sql
- [sql] [bug]
修复了Index
对象中包含一些无法解析为特定列的混合函数表达式,与基于字符串的列名结合使用时,会导致初始化内部状态失败,从而在 DDL 编译过程中失败的问题。
参考:#4778 - [sql] [bug]
修复了TypeEngine.column_expression()
方法不会应用于 UNION 或其他_selectable.CompoundSelect
内部的后续 SELECT 语句的 bug,即使 SELECT 语句在语句的最顶层呈现。新逻辑现在区分了呈现列表达式(对于列表中的所有 SELECT 都需要)与收集结果行的返回数据类型(仅对第一个 SELECT 需要)。
参考:#4787 - [sql] [bug]
修复了内部克隆 SELECT 结构可能导致关键错误的问题,如果 SELECT 的副本更改其状态,使其列列表发生更改。这在一些 ORM 场景中被观察到,可能是 1.3 及以上版本独有的问题,因此部分是回归修复。
参考:#4780
postgresql
- [postgresql] [usecase]
为 psycopg2 方言添加了新的方言标志,executemany_mode
,它取代了之前的实验性use_batch_mode
标志。executemany_mode
支持 psycopg2 提供的“执行批处理”和“执行值”函数,后者用于编译的insert()
构造。感谢 Yuval Dinari 提供的拉取请求。
另请参阅
Psycopg2 快速执行助手
参考:#4623
mysql
- [mysql] [用例]
将 ARRAY 和 MEMBER 添加到 MySQL 保留字列表中,因为 MySQL 8.0 现在已将这些设为保留字。
参考:#4783 - [mysql] [错误]
当 MySQL 方言的 charset 给定给 MySQL 驱动程序时,连接开始时将发出“SET NAMES”以平息 MySQL 8.0 中观察到的一个明显行为,即在 UNION 包含与形式为 CAST(NULL AS CHAR(…))的列联接的字符串列时引发排序规则错误,这正是 SQLAlchemy 的 polymorphic_union 函数所做的。该问题似乎至少影响了 PyMySQL 一年,但是最近出现了 mysqlclient 1.4.4,基于这个 DBAPI 创建连接的方式发生了变化。由于该指令的存在影响了三个不同的 MySQL charset 设置,每个设置根据其是否存在具有复杂的影响,因此 SQLAlchemy 现在将在新连接上发出该指令,以确保正确的行为。
参考:#4804 - [mysql] [错误]
添加了另一个修复上游 MySQL 8 问题的方法,其中对于外键约束反射中的大小写敏感的表名错误地报告,这是首次添加到#4344的修复的扩展,它影响了大小写敏感的列名。新问题发生在 MySQL 8.0.17,因此 88718 修复的一般逻辑仍然存在。
另请参阅bugs.mysql.com/bug.php?id=96365
- 上游错误
参考:#4751
sqlite
- [sqlite] [错误]
支持 json 的方言应该在 create_engine()级别接受参数json_serializer
和json_deserializer
,然而 SQLite 方言称它们为_json_serializer
和_json_deserilalizer
。已更正名称,旧名称在更改警告下被接受,并且这些参数现在被文档化为create_engine.json_serializer
和create_engine.json_deserializer
。
参考:#4798 - [sqlite] [错误]
修复了在 SQLite 方言中使用“PRAGMA table_info”时的 bug,这意味着反射功能用于检测表存在性、表列列表和外键列表时,默认会在任何附加数据库中的任何表上运行,当未给出模式名称且表在基本模式中不存在时。修复明确地对“main”模式运行 PRAGMA,然后如果“main”返回没有行,则对“temp”模式运行,以保持“无模式”命名空间中的表和临时表的行为,附加表仅在“模式”命名空间中。
参考:#4793
mssql
- [mssql] [usecase]
为 SQL Server 新增了try_cast()
构造,发出“TRY_CAST”语法。感谢 Leonel Atencio 的 Pull 请求。
参考:#4782
杂项
- [bug] [events]
修复了事件系统中的问题,其中使用once=True
标志与动态生成的监听器函数会导致未来事件的事件注册失败,如果这些监听器函数在使用后被垃圾回收,因为假设监听函数是强引用的。现在“once”包装被修改为持久地强引用内部函数,并更新了文档,使用“once”不意味着自动注销监听器函数。
参考:#4794
1.3.6
发布日期:2019 年 7 月 21 日
orm
- [orm] [feature]
新增了新的加载器选项方法Load.options()
,允许按层次结构构建加载器选项,这样就可以在不需要多次调用defaultload()
的情况下,将许多子选项应用于特定路径。感谢 Alessio Bogon 提出的想法。
参考:#4736 - [orm] [performance]
应用于选择加载中的优化#4340,其中不需要 JOIN 即可急切加载相关项目的优化现在也适用于多对一关系,因此只查询相关表以进行简单的连接条件。在这种情况下,基于父对象上的外键列的值查询相关项目;如果这些列被延迟加载或其他方式未加载到集合中的任何父对象上,则加载器将退回到 JOIN 方法。
参考:#4775 - [orm] [bug]
修复了由#4365引起的回归,其中从实体到自身的连接不使用别名时不再引发信息性错误消息,而是在断言失败时失败。已恢复信息性错误条件。
参考:#4773 - [orm] [bug]
修复了一个问题,即_ORMJoin.join()
方法,这是一个未内部使用的 ORM 级方法,它公开了通常是内部过程的Query.join()
方法,未正确传播full
和outerjoin
关键字参数。拉取请求由 Denis Kataev 提供。
参考:#4713 - [orm] [bug]
修复了一个 bug,即指定了uselist=True
的多对一关系在主键更改期间未能正确更新的问题,其中相关列需要更改。
参考:#4772 - [orm] [bug]
修复了一个 bug,即检测与“动态”关系一对一或多对一使用的错误配置的错误,如果关系配置为uselist=True
,则会失败。当前的修复方案是发出警告,而不是引发异常,因为这样做会导致向后不兼容,但在将来的版本中,它将引发异常。
参考:#4772 - [orm] [bug]
修复了一个 bug,即对一个尚不存在的映射属性创建同义词时会引发递归错误,例如当它引用配置映射器之前的 backref 时会出现,当尝试在其上测试最终不存在的属性时会引发递归错误(例如当类通过 Sphinx autodoc 运行时会发生),因为同义词的未配置状态会将其置于未找到属性的循环中。
参考:#4767
engine
- [engine] [bug]
修复了一个 bug,即使用反射函数(例如MetaData.reflect()
)与已应用执行选项的Engine
对象将失败,因为生成的OptionEngine
代理对象未包括在反射例程中使用的.engine
属性。
参考:#4754
sql
- [sql] [bug]
调整了Enum
的初始化,以最小化调用给定 PEP-435 枚举对象的.__members__
属性的频率,以适应这种属性的调用成本很高的情况,这是一些常用的第三方枚举库的情况。
参考:#4758 - [sql] [bug] [postgresql]
修复了array_agg
构造与FunctionElement.filter()
结合时,与数组索引操作符结合时无法产生正确的运算符优先级的问题。
参考:#4760 - [sql] [错误]
修复了一个不太可能的问题,即对于联合和其他_selectable.CompoundSelect
对象的“对应列”例程可能在某些重叠列情况下返回错误的列,从而在使用集合操作时可能影响一些 ORM 操作,如果底层的select()
构造先前在其他类似类型的例程中使用过,则由于未清除缓存值而可能受��影响。
参考:#4747
postgresql
- [postgresql] [用例]
增加了对 PostgreSQL 分区表上索引的反射支持,这是从 PostgreSQL 11 版本开始添加的功能。
参考:#4771 - [postgresql] [用例]
通过将array
对象嵌套在另一个对象中,为多维 Postgresql 数组文字提供支持。多维数组类型会被自动检测。
另请参阅array
参考:#4756
mysql
- [mysql] [错误]
修复了当nullable=True
时,为TIMESTAMP
数据类型渲染“NULL”特殊逻辑无法工作的错误,如果列的数据类型是TypeDecorator
或Variant
。现在的逻辑确保它向下展开到原始的TIMESTAMP
,以便在请求时正确呈现此特殊情况的 NULL 关键字。
参考:#4743 - [mysql] [错误]
增强了 MySQL/MariaDB 版本字符串解析,以适应奇异的 MariaDB 版本字符串,其中“MariaDB”一词嵌入在其他字母数字字符中,例如“MariaDBV1”。这种检测对于正确适应已分为 MySQL 和 MariaDB 的 API 功能至关重要,例如“transaction_isolation”系统变量。
参考:#4624
sqlite
- [sqlite] [usecase]
为 SQLite 添加了对复合(元组)IN 运算符的支持,通过在此后端渲染 VALUES 关键字。由于其他后端(如 DB2)已知使用相同的语法,因此在基本编译器中使用一个方言级标志tuple_in_values
启用了该语法。该更改还包括对 SQLite 中使用“in_()”在元组值和空集之间时的“空 IN 元组”表达式的支持。
参考:#4766
mssql
- [mssql] [bug]
确保用于反映索引和视图定义的查询将字符串参数明确转换为 NVARCHAR,因为许多 SQL Server 驱动程序经常将字符串值,特别是具有非 ASCII 字符或较大字符串值的值,视为 TEXT,这通常与 SQL Server 的信息模式表中的 VARCHAR 字符不正确地进行比较。这些 CAST 操作已经在反射查询中对 SQL Serverinformation_schema.
表进行了处理,但在针对sys.
表的另外三个查询中缺失。
参考:#4745
1.3.5
发布日期:2019 年 6 月 17 日
orm
- [orm] [bug]
修复了一系列关于超过两层深度的联合表继承的相关错误,以及对主键值的修改,其中这些主键列也以外键关系相互链接,这在联合表继承中是很典型的。在三级继承层次结构中的中间表现在只有在主键值发生变化且passive_updates=False
(例如,外键约束不被执行)时才会进行更新;而在之前会被跳过;同样,在passive_updates=True
(例如,ON UPDATE CASCADE 生效)的情况下,第三级表将不会收到更新语句,这与之前的情况不同,因为 CASCADE 已经修改了它。在一个相关问题中,与联合继承层次结构中的中间表的主键相关联的关系在父对象的主键被修改时也将正确地更新其外键列,即使该父对象是链接父类的子类,而在之前这些类不会被计算。
参考:#4723 - [orm] [bug]
修复了Mapper.all_orm_descriptors
访问器返回一个条目给Mapper
本身在声明式__mapper__
键下的 bug,当这不是一个描述符时。现在,所有InspectionAttr
对象上存在的.is_attribute
标志现在被查询,这也已经被修改为对于关联代理为True
,因为对于这个对象错误地设置为 False。
参考:#4729 - [orm] [bug]
修复了Query.join()
中的回归,其中aliased=True
标志不会正确应用到过滤条件的情况,如果之前对同一实体进行了连接。这是因为适配器的顺序放错了。顺序已经被颠倒,以便最近的aliased=True
调用的适配器优先,就像在 1.2 版本和更早版本中一样。这破坏了“elementtree”示例等其他内容。
参考:#4704 - [orm] [bug] [py3k]
用完全从 Python 3.3 中供应的版本替换了getfullargspec()
的 Python 兼容性例程。最初,Python 在 Python 3.8 alpha 版本中对该函数发出了弃用警告。虽然这一变化被撤销了,但观察到 Python 3 对getfullargspec()
的实现在 3.4 系列中重写为Signature
后慢了一个数量级。虽然 Python 计划改进这种情况,但目前 SQLAlchemy 项目使用了一个简单的替代方案以避免任何未来问题。
参考:#4674 - [orm] [bug]
重新设计了AliasedClass
使用的属性机制,不再依赖于在包装类的 MRO 上调用__getattribute__
,而是在包装类上使用 getattr()正常解析属性,然后解包/适应。这允许在映射类上使用更广泛的属性样式,包括特殊的__getattr__()
方案;但这也使代码更简单、更具弹性。
参考:#4694
sql
- [sql] [bug]
解决了由于使用literal_column
()构造而导致的一系列引号问题。当这个构造通过子查询进行“代理”并通过与其文本匹配的标签引用时,即使使用
quoted_name构造设置了
Label的字符串,标签也不会应用引号规则。不对
Label的文本应用引号是一个 bug,因为这个文本严格来说是一个 SQL 标识符名称而不是一个 SQL 表达式,而且字符串不应该已经嵌入引号,与
literal_column()不同,后者可能会被应用到。为了帮助手动引号方案,维护了一个非标记的
literal_column()` 在子查询的外部传播的现有行为,尽管不清楚是否可以为这样的构造生成有效的 SQL。
参考:#4730
postgresql
- [postgresql] [usecase]
在为 PostgreSQL 反射索引时,添加了对列排序标志的支持,包括 ASC、DESC、NULLSFIRST、NULLSLAST。同时也将这一功能添加到了通用的反射系统中,可以在未来的版本中应用于其他方言。感谢 Eli Collins 的 Pull request。
参考:#4717 - [postgresql] [bug]
修复了 PostgreSQL 方言无法正确反映没有成员的 ENUM 数据类型的 bug,调用get_enums()
返回一个带有None
的列表,并在反射具有此类数据类型的列时引发 TypeError。现在检查返回一个空列表。
参考:#4701
mysql
- [mysql] [bug]
修复了 MySQL ON DUPLICATE KEY UPDATE 无法将列设置为 NULL 值的 bug。感谢 Lukáš Banič 的 Pull request。
参考:#4715
1.3.4
发布日期:2019 年 5 月 27 日
orm
- [orm] [bug]
修复了当事件监听器通过AttributeEvents.propagate
标志向子类传播时,AttributeEvents.active_history
标志未设置的问题。这个 bug 在整个AttributeEvents
系统的使用期间都存在。
参考:#4695 - [orm] [bug]
修复了新关联代理系统仍未代理混合属性的回归,当它们使用@hybrid_property.expression
装饰器返回替代 SQL 表达式,或者当混合属性返回任意PropComparator
时,会在表达式级别进行代理。这涉及进一步泛化用于检测在QueryableAttribute
级别代理对象类型的启发式方法,以更好地检测描述符最终服务于映射类还是列表达式。
参考:#4690 - [orm] [bug]
应用了映射器“配置互斥锁”来防止在动态模块导入方案仍在为相关类配置映射器的过程中使用映射器时可能发生的竞争。这并不能防止所有可能的竞争条件,比如如果并发导入尚未遇到相关类,但它在 SQLAlchemy 声明过程中尽可能多地防范了可能发生的情况。
参考:#4686 - [orm] [bug]
现在对将瞬态对象与Session.merge()
合并到会话中时,如果该对象在Session
中已经是瞬态的情况发出警告。这会对通常会导致对象被双重插入的情况发出警告。
参考:#4647 - [orm] [bug]
修复了在与映射实例中处于未获取状态且持久化为 NULL 的属性进行比较时,新关系 m2o 比较逻辑首次引入的回归,当属性没有显式默认值时,在持久化设置中访问时需要默认为 NULL。
参考:#4676
engine
- [engine] [bug] [postgresql]
将在方言初始化期间发生的“回滚”移动到额外的方言特定初始化步骤之后,特别是 psycopg2 方言的初始化步骤,这些步骤会在第一个新连接上无意中保留事务状态,这可能会干扰一些需要确保没有启动事务的 psycopg2 特定 API。感谢 Matthew Wilkes 的拉取请求。
参考:#4663
sql
- [sql] [bug]
修复了GenericFunction
类意外注册自己为命名函数的问题。感谢 Adrien Berchet 提供的拉取请求。
参考:#4653 - [sql] [bug]
修复了布尔列的双重否定不会重置“NOT”运算符的问题。
参考:#4618 - [sql] [bug]
GenericFunction
命名空间正在迁移,以便函数名称以不区分大小写的方式查找,因为 SQL 函数不会因区分大小写的差异而发生冲突,用户定义的函数或存储过程也不会发生这种情况。现在使用GenericFunction
声明的函数查找使用不区分大小写的方案,但支持一个弃用案例,允许存在两个或更多具有不同大小写的相同名称的GenericFunction
对象,这将导致对该特定名称进行区分大小写的查找,同时在函数注��时发出警告。感谢 Adrien Berchet 在这个复杂功能上的大量工作。
参考:#4569
postgresql
- [postgresql] [bug] [orm]
修复了“匹配行数”警告即使 dialect 报告“supports_sane_multi_rowcount=False”也会发出的问题,例如 psycogp2 使用use_batch_mode=True
等情况。
参考:#4661
mysql
- [mysql] [bug]
增加了对 DROP CHECK 约束的支持,MySQL 8.0.16 需要删除 CHECK 约束;MariaDB 支持普通的 DROP CONSTRAINT。该逻辑通过检查 MariaDB 版本字符串来区分这两种语法的区别。Alembic 迁移已经解决了这个问题,通过在 MySQL / MariaDB CHECK 约束上实现自己的 DROP,但这个改变直接在 Core 中实现,以便供一般使用。感谢 Hannes Hansen 提供的拉取请求。
参考:#4650
mssql
- [mssql] [feature]
增加了对 SQL Server 过滤索引的支持,通过mssql_where
参数,其工作方式类似于 PostgreSQL 方言中的postgresql_where
索引函数。
参见
过滤索引
参考:#4657 - [mssql] [bug]
为 pymssql 添加了错误代码 20047 到“is_disconnect”。感谢 Jon Schuff 提供的拉取请求。
参考文献:#4680
misc
- [misc] [bug]
从 MANIFEST.in 中移除了多余的“sqla_nose.py”符号,该符号会创建一个不希望出现的警告消息。
参考文献:#4625
1.3.3
发布日期:2019 年 4 月 15 日
orm
- [orm] [bug]
修复了 1.3 版本中新的“模糊 FROMs”查询逻辑中的回归问题,该问题在 Query.join() handles ambiguity in deciding the “left” side more explicitly 中引入,当一个Query
显式地将一个实体放在 FROM 子句中,并且还使用Query.join()
将其与之连接时,如果该实体在额外的连接中使用,稍后将会导致“模糊 FROM”错误,因为该实体在Query
的“from”列表中出现两次。修复此问题的方法是将独立实体合并到它已经是一部分的连接中,这与在渲染 SELECT 语句时最终发生的方式相同。
参考文献:#4584 - [orm] [bug]
调整了Query.filter_by()
方法,不再对多个条件内部调用and()
,而是将其作为一系列条件传递给Query.filter()
,而不是一个单一条件。这样做允许Query.filter_by()
推迟到Query.filter()
处理可变数量的子句,包括列表为空的情况。在这种情况下,Query
对象将不会有.whereclause
,这使得后续的“无 whereclause”方法如Query.select_from()
表现一致。
参考文献:#4606
postgresql
- [postgresql] [bug]
修复了从版本 1.3.2 发布以来由 #4562 引起的回归问题,其中一个仅包含查询字符串而没有主机名的 URL,例如用于指定包含连接信息的服务文件,将不再正确传播到 psycopg2。#4562 中的更改已经调整以进一步适应 psycopg2 的确切要求,即如果存在任何连接参数,则不再需要“dsn”参数,因此在这种情况下,仅传递查询字符串参数。
参考:#4601
mssql
- [mssql] [bug]
修复了 SQL Server 方言中的问题,如果 ORDER BY 表达式中存在一个绑定参数,最终在 SQL Server 版本的语句中不会被渲染,那么这些参数仍然会成为执行参数的一部分,导致 DBAPI 级别的错误。感谢 Matt Lewellyn 提交的拉取请求。
参考:#4587
杂项
- [bug] [pool]
修复了由于弃用Pool
的use_threadlocal
标志导致的行为回归,SingletonThreadPool
不再使用此选项,这会导致在事务的上下文中多次使用相同的Engine
连接或隐式执行时发生“回滚”逻辑,从而取消事务。虽然这不是推荐的引擎和连接工作方式,但当使用SingletonThreadPool
时,事务应该保持打开状态,无论在同一线程中对相同引擎做了什么。use_threadlocal
标志仍然被弃用,但SingletonThreadPool
现在实现了自己版本的相同逻辑。
参考:#4585 - [bug] [ext]
修复了一个 bug,即在MutableList
上使用copy.copy()
或copy.deepcopy()
会导致列表中的项目重复,这是由于 Python 的 pickle 和 copy 在处理列表时使用__getstate__()
和__setstate__()
存在不一致性。为了解决这个问题,必须向MutableList
添加一个__reduce_ex__
方法。为了与基于__getstate__()
的现有 pickle 保持向后兼容性,__setstate__()
方法也保留了;测试套件断言,对旧版本类进行的 pickle 仍然可以被 pickle 模块反序列化。
参考:#4603
1.3.2
发布日期:April 2, 2019
orm
- [orm] [bug] [ext]
恢复了对纯 Python 描述符(例如@property
对象)的实例级支持,与关联代理一起使用时,如果代理对象根本不在 ORM 范围内,则被归类为“模糊”,但直接被代理。对于类级别访问,基本的类级别__get__()
现在直接返回AmbiguousAssociationProxyInstance
,而不是引发异常,这是返回可能的最接近以前返回AssociationProxy
本身的行为的近似。还改进了这些对象的字符串表示,以更具描述性地反映当前状态。
参考:#4573, #4574 - [orm] [bug]
修复了一个 bug,即在使用with_polymorphic()
或其他别名构造时,当别名目标被用作在column_property()
内部的子查询的Select.correlate_except()
目标时,适配不正确。这需要修复子句适配机制,以正确处理出现在“correlate except”列表中的可选择项,类似于出现在“correlate”列表中的可选择项的方式。这实际上是一个持续了很长时间的相当基本的 bug,但很难遇到它。
参考:#4537 - [orm] [bug]
修复了一个新的错误消息,当尝试将关系选项链接到一个未使用PropComparator.of_type()
的 AliasedClass 时,应该引发错误消息,而不是引发AttributeError
。请注意,在 1.3 中,不再允许从普通映射器关系创建选项路径到AliasedClass
而不使用PropComparator.of_type()
。
参考:#4566
sql
- [sql] [bug] [documentation]
多亏了 TypeEngine methods bind_expression, column_expression work with Variant, type-specific types,我们不再需要依赖直接子类化特定方言类型的方法,TypeDecorator
现在可以处理所有情况。此外,上述更改使得直接子类化基本 SQLAlchemy 类型的行为稍微不太可能按预期工作,这可能会产生误导。文档已更新,使用TypeDecorator
来处理这些示例,包括 PostgreSQL 的“ArrayOfEnum”示例数据类型,并且直接支持“直接子类化类型”的功能已被移除。
参考:#4580
postgresql
- [postgresql] [feature]
为 psycopg2 方言添加了支持无参数连接 URL 的功能,这意味着 URL 可以作为"postgresql+psycopg2://"
传递给create_engine()
,而不需要额外的参数来指示传递给 libpq 的空 DSN,这表示连接到“localhost”而不提供用户名、密码或数据库。感谢 Julian Mehnle 提供的拉取请求。
参考:#4562 - [postgresql] [bug]
修改了Select.with_for_update.of
参数,如果传递了一个 join 或其他组合的可选择对象,则将从中过滤出各个Table
对象,允许将 join()对象传递给参数,这在使用 ORM 时通常会发生。感谢 Raymond Lu 提供的拉取请求。
参考:#4550
1.3.1
发布日期:2019 年 3 月 9 日
orm
- [orm] [bug] [ext]
修复了一个回归问题,即关联代理链接到同义词将不再起作用,无论是在实例级别还是在类级别。
参考资料:#4522
mssql
- [mssql] [错误]
在将隔离级别更改为 SNAPSHOT 后发出了 commit(),因为 pyodbc 和 pymssql 都会打开一个隐式事务,该事务会阻止后续 SQL 在当前事务中发出。
此更改还回溯到:1.2.19
参考资料:#4536 - [mssql] [错误]
修复了 SQL Server 反射中的回归问题,原因是#4393中从Float
数据类型中删除了开放式**kw
导致反射此类型失败,因为传递了“scale”参数。
参考资料:#4525
1.3.0
发布日期:2019 年 3 月 4 日
orm
- [orm] [功能]
Query.get()
方法现在可以接受一个属性键和值的字典作为指示要加载的主键值的手段;对于复合主键特别有用。拉取请求由 Sanjana S. 提供。
参考资料:#4316 - [orm] [功能]
现在可以将 SQL 表达式分配给 ORM 刷新的主键属性,方法与普通属性描述的方式相同,如将 SQL 插入/更新表达式嵌入到刷新中,其中表达式将被评估,然后使用 RETURNING 返回给 ORM,或者在 pysqlite 的情况下,使用 cursor.lastrowid 属性工作。需要支持 RETURNING 的数据库(例如 Postgresql、Oracle、SQL Server)或 pysqlite。
参考资料:#3133
引擎
- [引擎] [功能]
更改了在StatementError
字符串化时的格式。现在,每个错误细节都会被分成多个新行,而不是在单行上间隔开。此外,SQL 表示现在会将 SQL 语句字符串化,而不是使用repr()
,因此换行符会按原样呈现。拉取请求由 Nate Clark 提供。
另请参阅
更改了 StatementError 的格式(换行和 %s)
参考资料:#4500
sql
- [sql] [错误]
Alias
类及其相关子类CTE
、Lateral
和TableSample
已经重新设计,用户不再能直接构造这些对象。这些构造需要使用独立的构造函数或与可选择绑定的方法来实例化新对象。
参考:#4509
模式
- [模式] [特性]
添加了新参数Table.resolve_fks
和MetaData.reflect.resolve_fks
,当设置为 False 时,将禁用在ForeignKey
对象中遇到的相关表的自动反射,这既可以减少省略表的 SQL 开销,也可以避免由于数据库特定原因无法反射的表。即使两个Table
对象存在于同一个MetaData
集合中,这两个表的反射仍然可以相互引用,即使这两个表的反射是分开进行的。
参考:#4517
1.3.0b3
发布日期:2019 年 2 月 8 日
orm
- [orm] [错误]
改进了with_polymorphic()
与加载器选项一起使用的行为,特别是通配符操作以及load_only()
。多态对象将更准确地定位,以便实体上的列级选项能够正确生效。这个问题是在#4468中修复的同类问题的延续。
参考:#4469
orm 声明式
- [orm] [声明式] [错误]
添加了一些帮助异常,当基于AbstractConcreteBase
、DeferredReflection
或AutoMap
的映射在映射准备好使用之前使用时,将调用这些异常,这些异常包含关于类的描述性信息,而不是掉入其他信息较少的故障模式。
引用:#4470
sql
- [sql] [bug]
完全删除了直接作为select()
或Query
对象组件传递的字符串的行为,自动强制将其转换为text()
构造;现在发出的警告是一个ArgumentError
或在order_by()
/group_by()
的情况下是CompileError
。自版本 1.0 以来一直发出警告,但其存在仍然引发了对此行为可能被误用的担忧。
请注意,order_by() / group_by()的公共 CVE 已发布,此提交已解决:CVE-2019-7164 CVE-2019-7548
另请参阅
删除字符串 SQL 片段强制转换为 text()
引用:#4481 - [sql] [bug]
在编译时将引用应用于Function
名称,如果它们包含非法字符,例如空格或标点符号,则通常但不一定由sqlalchemy.sql.expression.func
构造生成的名称。但是,名称与以前一样是不区分大小写的,这意味着如果名称包含大写字母或混合大小写字符,仅此并不会触发引用。目前为了向后兼容性,不区分大小写仍然保持不变。
引用:#4467 - [sql] [bug]
添加了对接受为纯字符串的关键 DDL 短语的“SQL 短语验证”,包括ForeignKeyConstraint.on_delete
、ForeignKeyConstraint.on_update
、ExcludeConstraint.using
、ForeignKeyConstraint.initially
等,用于期望一系列 SQL 关键字的地方。任何非空格字符表明该短语需要引用的情况将引发CompileError
。此更改与作为#4481一部分提交的一系列更改相关。
参考:#4481
postgresql
- [postgresql] [错误]
修复了使用大写名称作为索引类型(例如 GIST、BTREE 等)或 EXCLUDE 约束时将其视为需要引用的标识符,而不是按原样呈现的问题。新行为将这些类型转换为小写,并确保它们只包含有效的 SQL 字符。
参考:#4473
测试
- [测试] [更改]
测试系统已删除对 Nose 的支持,Nose 已多年未维护,并在 Python 3 下产生警告。测试套件目前标准化为 Pytest。感谢 Parth Shandilya 的拉取请求。
参考:#4460
杂项
- [错误] [扩展]
当使用关联代理与集合或字典时,实现了更全面的赋值操作(例如“批量替换”)。修复了创建多余代理对象以替换旧对象的问题,这会导致过多的事件和 SQL,并且在唯一约束的情况下会导致刷新失败。
另请参阅
为集合、字典实现了批量替换与 AssociationProxy
参考:#2642
1.3.0b2
发布日期:2019 年 1 月 25 日
通用
- [通用] [更改]
在整个库中进行了大规模的更改,确保所有已被标记为弃用或遗留的对象、参数和行为在调用时都会发出DeprecationWarning
警告。由于 Python 3 解释器现在默认显示弃用警告,以及基于 tox 和 pytest 等工具的现代测试套件通常会显示弃用警告,这一变化应该使得更容易注意到哪些 API 功能已经过时。这一变化的主要原因是,长期以来已被弃用但仍然在实际应用中使用的功能最终可以在不久的将来被移除;其中最大的例子是自版本 0.7 以来就已被弃用但仍然存在于库中的SessionExtension
和MapperExtension
类,以及一些其他的预事件扩展钩子。另一个是,还将弃用几个长期存在的重要行为,包括线程本地引擎策略、convert_unicode 标志和非主要映射器。
另请参阅
对所有已弃用元素发出弃用警告;添加新的弃用
参考:#4393
orm
- [orm] [功能]
实现了一个新功能,即AliasedClass
构造现在可以用作relationship()
的目标。这样就不再需要“非主要映射器”的概念,因为AliasedClass
更容易配置,并自动继承映射类的所有关系,同时保留加载器选项正常工作的能力。
另请参阅
与 AliasedClass 的关系取代了非主要映射器的需求
参考:#4423 - [orm] [功能]
添加了新的MapperEvents.before_mapper_configured()
事件。该事件与其他“配置”阶段的映射器事件相辅相成,提供了一个每个Mapper
在其配置步骤之前接收的事件,并且还可以用于阻止或延迟特定Mapper
对象的配置,使用新的返回值interfaces.EXT_SKIP
。请参阅文档链接以获取示例。
另请参阅MapperEvents.before_mapper_configured()
参考:#4397 - [orm] [change]
添加了一个新函数close_all_sessions()
,它接管了Session.close_all()
方法的任务,后者现在已被弃用,因为这会让人误解为一个类方法。感谢 Augustin Trancart 的拉取请求。
参考:#4412 - [orm] [bug]
修复了长期存在的问题,即重复的集合成员会导致反向引用在删除其中一个重复项时删除成员与其父对象之间的关联,就像在一条语句中交换两个对象的副作用一样。
另请参见
在删除操作期间,对于集合重复项的多对一反向引用检查
参考:#1103 - [orm] [bug]
扩展了首次作为#3287的一部分进行的修复,其中针对使用通配符的子类的加载器选项将扩展自身以包括将通配符应用于超类属性的情况,例如在表达式中Load(SomeSubClass).load_only('foo')
。SomeSubClass
的父类的列也将被排除,就像使用未绑定选项load_only('foo')
一样。
参考:#4373 - [orm] [bug]
改进了 ORM 在加载器选项遍历领域发出的错误消息。这包括早期检测到不匹配的加载器策略以及更清晰地解释为什么这些策略不匹配。
参考:#4433 - [orm] [bug]
在collection.remove()
方法中,现在在移除项目之前调用“remove”集合事件,这与大多数其他形式的集合项目移除行为一致(例如__delitem__
、__setitem__
下的替换)。对于pop()
方法,删除事件仍然在操作之后触发。 - [orm] [bug] [engine]
为 Core 和 ORM 添加了执行选项的访问器,通过Query.get_execution_options()
、Connection.get_execution_options()
、Engine.get_execution_options()
和Executable.get_execution_options()
。PR 由 Daniel Lister 提供。
参考:#4464 - [orm] [bug]
修复了与#3423相关的关联代理问题,导致使用自定义PropComparator
对象与混合属性(例如在dictlike-polymorphic
示例中演示的属性)在关联代理中无法正常工作。在#3423中添加的严格性已经放宽,并添加了额外的逻辑以适应关联代理链接到自定义混合的情况。
参考:#4446 - [orm] [bug]
实现了.get_history()
方法,这也意味着对于synonym()
属性也有AttributeState.history
的可用性。以前,尝试通过同义词访问属性历史会引发AttributeError
。
参考:#3777
orm 声明式
- [bug] [orm declarative]
在ColumnProperty
中添加了一个__clause_element__()
方法,可以使在声明映射类中使用未完全声明的列或延迟属性在约束或其他基于列的场景中稍微更友好,尽管这仍无法在开放式表达式中工作;如果收到TypeError
,建议调用ColumnProperty.expression
属性。
参考:#4372
engine
- [engine] [feature]
添加了公共访问器QueuePool.timeout()
,返回QueuePool
对象的配置超时时间。感谢 Irina Delamare 的拉取请求。
参考:#3689 - [engine] [change]
自大约版本 0.2 以来一直是 SQLAlchemy 的传统特性的“threadlocal” 引擎策略现在已被弃用,以及Pool
的Pool.threadlocal
参数,在大多数现代用例中没有任何效果。
另请参阅
“threadlocal” 引擎策略已弃用
参考:#4393
sql
- [sql] [feature]
修改了AnsiFunction
类,这是类似CURRENT_TIMESTAMP
这样的常见 SQL 函数的基类,以接受位置参数,就像常规的临时函数一样。这适用于许多特定后端上这些函数接受参数(如“分数秒”精度等)的情况���如果函数使用参数创建,它会呈现括号和参数。如果没有参数,则编译器生成非括号形式。
参考:#4386 - [sql] [change]
create_engine.convert_unicode
和String.convert_unicode
参数已被弃用。这些参数是在大多数 Python DBAPIs 几乎不支持 Python Unicode 对象时构建的,而 SQLAlchemy 需要以高效的方式在整个系统中在 Unicode 和字节字符串之间传递数据和 SQL 字符串的非常复杂的任务。由于 Python 3,DBAPIs 被迫适应了 Unicode-aware APIs,今天所有由 SQLAlchemy 支持的 DBAPIs 都原生支持 Unicode,包括在 Python 2 上,这使得这个长期存在且非常复杂的功能最终被(大部分)移除。当然,在一些 Python 2 的边缘情况下,SQLAlchemy 仍然需要处理 Unicode,但这些都是自动处理的;在现代使用中,用户不应该需要与这些标志进行交互。
另请参阅
已弃用 convert_unicode 参数
参考:#4393
mssql
- [mssql] [bug]
Unicode
和UnicodeText
数据类型的literal_processor
现在在文本字符串表达式前面渲染一个N
字符,这是 SQL Server 要求在 SQL 表达式中呈现 Unicode 字符值时的必需操作。
参考:#4442
杂项
- [bug] [ext]
修复了 1.3.0b1 中由#3423引起的回归,其中访问仅存在于多态子类上的属性的关联代理对象会引发AttributeError
,尽管实际被访问的实例是该子类的实例。
参考:#4401
1.3.0b1
发布日期:2018 年 11 月 16 日
orm
- [orm] [feature]
添加了新功能Query.only_return_tuples()
。导致Query
对象无条件返回键入的元组对象,即使查询针对单个实体。感谢 Eric Atkin 的贡献。
此更改也已回溯至:1.2.5 - [orm] [feature]
在Session.bulk_save_objects()
方法中添加了新标志Session.bulk_save_objects.preserve_order
,默认值为 True。当设置为 False 时,给定的映射将按对象类型分组为插入和更新,以便更好地将常见操作批量处理在一起。感谢 Alessandro Cucci 的贡献。 - [orm] [feature]
“selectin”加载策略现在在简单的一对多加载情况下省略了 JOIN,而是仅从相关表中加载,依靠相关表的外键列来匹配父表中的主键。可以通过将relationship.omit_join
标志设置为 False 来禁用此优化。非常感谢 Jayson Reis 的努力。
另请参阅
selectin loading no longer uses JOIN for simple one-to-many
参考:#4340 - [orm] [feature]
在InstanceState
类中添加了.info
字典,该类是从调用映射对象的inspect()
方法返回的对象。
另请参阅
info dictionary added to InstanceState
参考:#4257 - [orm] [bug]
修复了在与Query.join()
以及Query.select_entity_from()
结合使用Lateral
构造时,不会将子句适应到连接的右侧的错误。 “lateral”引入了连接右侧可以相关的用例。以前,未考虑适应此子句。请注意,在 1.2 版本中,由于#4304,由Query.subquery()
引入的可选择性仍未适应;可选择性需要由select()
函数生成以成为“lateral”连接的右侧。
此更改也回溯到:1.2.12
参考:#4334 - [orm] [bug]
修复了关于passive_deletes=”all”
的问题,即对象的外键属性在从其父集合中移除后仍保持其值。以前,工作单元会将其设置为NULL
,即使passive_deletes
指示不应修改它。
另请参阅passive_deletes=’all’
将保留从集合中移除的对象的 FK 不变
参考:#3844 - [orm] [bug]
改进了与关系绑定的多对一对象表达式的行为,使得在相关对象上检索列值现在对于对象从其父Session
中分离,即使属性已过期也是弹性的。在InstanceState
中使用了新功能来记忆特定列属性在其过期之前的最后已知值,以便在对象被分离和过期时表达式仍然可以评估。使用现代属性状态功能改进了错误条件,以根据需要生成更具体的消息。
另请参阅
改进了多对一查询表达式的行为
参考:#4359 - [orm] [bug] [mysql] [postgresql]
现在 ORM 在某些情况下会在子查询中加倍使用“FOR UPDATE”子句,与联接式急加载一起使用,因为观察到 MySQL 不会锁定子查询中的行。这意味着查询会带有两个 FOR UPDATE 子句;请注意,在某些后端(如 Oracle)上,由于不必要,子查询中的 FOR UPDATE 子句会被静默忽略。此外,在主要与 PostgreSQL 一起使用的“OF”子句的情况下,仅在使用时才在内部子查询中呈现 FOR UPDATE,以便可选择地将可选择的对象定位到 SELECT 语句中的表。
另请参阅
FOR UPDATE 子句在联接急加载子查询中以及外部呈现
参考:#4246 - [orm] [bug]
重构Query.join()
以进一步澄清结构化联接的各个组件。此重构增加了Query.join()
的能力,以确定在 FROM 列表中有多个元素或查询针对多个实体时,联接的最适当“左”侧。如果有多个 FROM/entity 匹配,将引发错误,要求指定 ON 子句以解决模棱两可。特别是针对我们在 #4363 中看到的回归,但也具有一般用途。现在Query.join()
中的代码路径更易于遵循,并且在操作的较早阶段更具体地决定错误情况。
另请参阅
Query.join() 更明确地处理决定“左”侧的模棱两可
参考:#4365 - [orm] [bug]
修复了Query
中的一个长期存在的问题,即标量子查询(例如由Query.exists()
、Query.as_scalar()
和其他从Query.statement
派生的查询生成的子查询)在被用于需要实体适配的新Query
时,例如当查询被转换为联合查询或 from_self()等时,将无法正确适配。此更改从由Query.statement
访问器生成的select()
对象中移除了“无适配”注释。
参考���#4304 - [orm] [bug]
在 Python 3 下,在 ORM 刷新期间,当主键值在 Python 中不可排序时(例如没有__lt__()
方法的Enum
),会重新引发一个信息性异常;通常在这种情况下,Python 3 会引发TypeError
。刷新过程在 Python 中按主键对持久对象进行排序,因此这些值必须是可排序的。
参考:#4232 - [orm] [bug]
移除了MappedCollection
类使用的集合转换器。此转换器仅用于断言传入的字典键与其对应对象的键匹配,并且仅在批量设置操作期间使用。该转换器可能会干扰自定义验证器或想要进一步转换传入值的AttributeEvents.bulk_replace()
监听器。当传入的键与值不匹配时,此转换器将引发的TypeError
已被移除;在批量赋值期间,传入值将被键入其生成的键,而不是显式存在于字典中的键。
总的来说,@converter 已被作为#3896的一部分添加的AttributeEvents.bulk_replace()
事件处理程序所取代。
参考:#3604 - [orm] [bug]
添加了新行为,当检索到多对一关系的“旧”值时,延迟加载时会跳过由于lazy="raise"
或分离会话错误而引发的异常。
另请参见
多对一替换不会对“raiseload”或“old”对象引发异常
参考:#4353 - [orm] [bug]
在 ORM 中长期存在的一个疏漏,即一个多对一关系的__delete__
方法是非功能性的,例如对于del a.b
这样的操作。现在已实现,并且等效于将属性设置为None
。
另请参阅
实现了“del”用于 ORM 属性
参考:#4354
orm 声明性
- [orm] [声明性] [bug]
修复了当声明性不会更新Mapper
的状态,例如在映射器属性集已经被调用并且被备忘录化后添加或删除其他属性时的 bug。另外,如果从当前已映射的类中删除了完全映射的属性(例如列、关系等),则现在会引发NotImplementedError
,因为如果属性已被删除,则映射器将无法正确运行。
参考:#4133
engine
- [engine] [特性]
添加了对QueuePool
的新的“后进先出”模式,通常通过将标志create_engine.pool_use_lifo
设置为 True 来启用。“后进先出”模式意味着刚刚检入的连接将首先再次检出,允许在池仅部分利用时从服务器端清理多余的连接。拉请求由 Taem Park 提供。
另请参阅
队列池的新的后进先出策略
sql
- [sql] [特性]
重构了SQLCompiler
来公开一个类似于SQLCompiler.order_by_clause()
和SQLCompiler.limit_clause()
方法的SQLCompiler.group_by_clause()
方法,这些方法可以被方言覆盖以自定义 GROUP BY 如何呈现。拉请求由 Samuel Chou 提供。
此更改也被回溯到:1.2.13 - [sql] [特性]
在“字符串 SQL”系统中添加了Sequence
,当在没有方言的情况下字符串化包含“序列下一个值”表达式的语句时,将渲染一个有意义的字符串表达式(""
),而不是引发编译错误。
参考:#4144 - [sql] [特性]
添加了新的命名约定标记column_0N_name
,column_0_N_name
等,这些标记将为序列中特定约束引用的所有列的名称/键/标签提供渲染。为了适应这种命名约定的长度,SQL 编译器的自动截断功能现在也适用于约束名称,这将为约束创建一个缩短的、确定性生成的名称,该名称将适用于目标后端而不超过该后端的字符限制。
此更改还修复了另外两个问题。一个是column_0_key
标记尽管已记录,但却不可用,另一个是如果这两个值不同,referred_column_0_name
标记会无意中渲染.key
而不是.name
的列。
另请参阅
新的多列命名约定标记,长名称截断
参考:#3989 - [sql] [功能]
为“expanding IN”绑定参数功能添加了新逻辑,如果给定的列表为空,将生成特定于不同后端的特殊“空集”表达式,从而允许 IN 表达式完全动态,包括空 IN 表达式。
另请参阅
扩展 IN 功能现在支持空列表
参考:#4271 - [sql] [功能]
现在支持 Python 内置的dir()
用于 SQLAlchemy 的“properties”对象,例如 Core 列集合(例如.c
)、mapper.attrs
等。也允许 iPython 自动完成工作。感谢 Uwe Korn 的拉取请求。 - [sql] [功能]
添加了新功能FunctionElement.as_comparison()
,允许 SQL 函数充当可以在 ORM 内部工作的二进制比较操作。
另请参阅
SQL 函数的二进制比较解释
参考:#3831 - [sql] [错误]
添加了基于“like”的运算符作为“比较”运算符,包括ColumnOperators.startswith()
ColumnOperators.endswith()
ColumnOperators.ilike()
ColumnOperators.notilike()
等等,以便所有这些运算符都可以成为 ORM“primaryjoin”条件的基础。
参考:#4302 - [sql] [错误]
修复了TypeEngine.bind_expression()
和TypeEngine.column_expression()
方法的问题,这些方法在目标类型是Variant
或其他TypeDecorator
的一部分时无法正常工作。另外,SQL 编译器现在在渲染这些方法时调用方言级别的实现,以便方言现在可以为内置类型提供 SQL 级别的处理。
另请参见
TypeEngine 方法 bind_expression, column_expression 适用于 Variant,类型特定类型
参考:#3981
postgresql
- [postgresql] [特性]
增加了新的 PG 类型REGCLASS
,用于将表名转换为 OID 值。感谢 Sebastian Bank 的拉取请求。
此更改也被回溯到了:1.2.7
参考:#4160 - [postgresql] [特性]
增加了对 PostgreSQL 分区表的基本反射支持,例如,在返回表信息的反射查询中添加了 relkind=‘p’。
另请参见
为 PostgreSQL 分区表添加了基本的反射支持
参考:#4237
mysql
- [mysql] [特性]
在 MySQL 中增加了对 CREATE FULLTEXT INDEX 的“WITH PARSER”语法的支持,使用mysql_with_parser
关键字参数。还支持了反射,以适应 MySQL 的特殊注释格式,用于报告此选项。另外,“FULLTEXT”和“SPATIAL”索引前缀现在也反映到mysql_prefix
索引选项中。
参考:#4219 - [mysql] [特性]
增加了对 MySQL 中 ON DUPLICATE KEY UPDATE 语句中参数的排序支持,因为 MySQL UPDATE 子句中的参数顺序是有意义的,类似于参数有序更新中描述的方式。感谢 Maxim Bublis 的拉取请求。
另请参见
ON DUPLICATE KEY UPDATE 中参数排序的控制 - [mysql] [特性]
连接池的“预连接”特性现在在 mysqlclient、PyMySQL 和 mysql-connector-python 的情况下使用 DBAPI 连接的ping()
方法。感谢 Maxim Bublis 的拉取请求。
另请参见
预先使用协议级 ping 进行预先 ping
sqlite
- [sqlite] [feature]
通过新的 SQLite 实现支持 SQLite 的 JSON 功能,使用了JSON
,JSON
。该类型的名称为JSON
,遵循了 SQLite 文档中的示例。感谢 Ilja Everilä 提供的拉取请求。
另请参阅
添加对 SQLite JSON 的支持
参考:#3850 - [sqlite] [feature]
实现了 SQLite 中ON CONFLICT
语句在 DDL 级别的理解,例如用于主键、唯一键和 CHECK 约束以及在Column
上指定的用于满足内联主键和 NOT NULL。感谢 Denis Kataev 提供的拉取请求。
另请参阅
添加了对 SQLite 中 ON CONFLICT 的约束的支持
参考:#4360
mssql
- [mssql] [feature]
在 SQL Server pyodbc 方言中添加了fast_executemany=True
参数,启用了 pyodbc 的新性能特性,当使用 Microsoft ODBC 驱动程序时可以使用相同的名称。
另请参阅
添加对 pyodbc fast_executemany 的支持
参考:#4158 - [mssql] [bug]
废弃了在 SQL Server 中使用Sequence
来影响 IDENTITY 值的“开始”和“增量”的用法,而是使用新参数mssql_identity_start
和mssql_identity_increment
直接设置这些参数。在未来的版本中,Sequence
将用于生成真正的CREATE SEQUENCE
DDL 与 SQL Server。
另请参阅
新参数以影响 IDENTITY 的开始和增量,使用 Sequence 废弃
参考:#4362
oracle
- [oracle] [feature]
添加了一个新的事件,目前仅由 cx_Oracle 方言使用,DialectEvents.setiputsizes()
。该事件将一个BindParameter
对象的字典传递给特定于 DBAPI 的类型对象,这些对象在转换为参数名称后将传递给 cx_Oracle 的cursor.setinputsizes()
方法。这允许查看 setinputsizes 过程以及修改传递给此方法的数据类型的行为。
另请参阅
使用 setinputsizes 实现对 cx_Oracle 数据绑定性能的精细控制
此更改也 回溯到:1.2.9
参考:#4290 - [oracle] [bug]
更新了可以发送到 cx_Oracle DBAPI 的参数,允许所有当前参数以及尚未添加的未来参数。此外,删除了在 1.2 版本中已弃用的未使用参数,并且现在我们将“threaded”默认设置为 False。
另请参阅
cx_Oracle 连接参数现代化,已弃用的参数已移除
参考:#4369 - [oracle] [bug]
Oracle 方言将不再使用 NCHAR/NCLOB 数据类型来表示通用的 Unicode 字符串或 clob 字段,除非在create_engine()
中传递了标志use_nchar_for_unicode=True
- 这包括 CREATE TABLE 行为以及绑定参数的setinputsizes()
。在读取方面,在 Python 2 下已经添加了 CHAR/VARCHAR/CLOB 结果行的自动 Unicode 转换,以匹配 Python 3 下 cx_Oracle 的行为。为了减轻 Python 2 下的性能损失,SQLAlchemy 在 Python 2 下使用非常高效(当构建了 C 扩展时)的本地 Unicode 处理程序。
另请参阅
通用 Unicode 取消强调的国家字符数据类型,通过选项重新启用
参考:#4242
杂项
- [feature] [ext]
添加了新属性Query.lazy_loaded_from
,其中填充了一个使用此Query
来延迟加载关系的InstanceState
。这样做的理由是它作为水平分片功能的提示,以便使用状态的标识令牌作为查询中要使用的默认标识令牌在 id_chooser()中使用。
此更改也被回溯到:1.2.9
参考:#4243 - [feature] [ext]
添加了新功能BakedQuery.to_query()
,允许以干净的方式在另一个BakedQuery
内使用一个BakedQuery
作为子查询,而无需显式引用Session
。
参考文献:#4318 - [功能] [扩展]
当目标属性是普通列时,AssociationProxy
现在具有标准列比较操作,例如ColumnOperators.like()
和ColumnOperators.startswith()
- 与目标表连接的 EXISTS 表达式通常呈现,但列表达式然后在 EXISTS 的 WHERE 条件中使用。请注意,这会更改关联代理上的.contains()
方法的行为,使其在基于列的属性上使用ColumnOperators.contains()
。
另请参阅
关联代理现在为基于列的目标提供标准列操作符
参考文献:#4351 - [功能] [扩展]
在水平分片扩展中,对ShardedQuery
类添加了对批量Query.update()
和Query.delete()
的支持。这还为批量更新/删除方法Query._execute_crud()
添加了额外的扩展钩子。
另请参阅
水平分片扩展支持批量更新和删除方法
参考文献:#4196 - [错误] [扩展]
重新设计了AssociationProxy
,以在单独的对象中存储特定于父类的状态,这样一个AssociationProxy
可以为多个父类提供服务,这是继承所固有的,而且不会有任何模糊性。添加了一个新方法AssociationProxy.for_class()
,允许检查特定于类的状态。
另请参阅
关联代理在每个类上存储特定于类的状态
参考:#3423 - [错误] [扩展]
关联代理集合的长期行为已经改变,现在代理将保持对父对象的强引用,只要代理集合本身也在内存中,就可以消除“陈旧的关联代理”错误。这一变更是基于实验性质进行的,以查看是否会出现任何导致副作用的用例。
另请参阅
新功能和改进 - 核心
参考:#4268 - [错误] [扩展]
修复了关联代理与标量对象的解除关联的多个问题。现在del
可以正常工作,另外还添加了一个新标志AssociationProxy.cascade_scalar_deletes
,当设置为 True 时,表示将标量属性设置为None
或通过del
删除也会将源关联设置为None
。
另请参阅
关联代理有新的 cascade_scalar_deletes 标志
参考:#4308
1.3.25
无发布日期
orm
- [orm] [错误]
修复了在Session.bulk_save_objects()
与持久对象一起使用时的问题,其中会无法跟踪主键映射的主键,其中主键列名与属性名不同。
参考:#6392
模式
- [模式] [错误]
如果未在至少通过参数传递Table.name
和Table.metadata
实例化Table
对象,则会引发一个信息性错误消息。以前,如果这些是作为关键字参数传递的,则该对象将无声地初始化失败。
参考:#6135
postgresql
- [postgresql] [错误] [回归]
修复了由#6023引起的回归,当使用 psycopg2 时,PostgreSQL cast 运算符应用于ARRAY
中的元素时,如果数据类型也嵌入到Variant
适配器的实例中,则会失败使用正确的类型。
此外,修复了在使用Variant(ARRAY(some_schema_type))
时发出正确的 CREATE TYPE 的支持。
参考:#6182
mysql
- [mysql] [错误] [mariadb]
修复了 MariaDB 10.6 系列的问题,包括 mariadb-connector Python 驱动程序(仅在 SQLAlchemy 1.4 上受支持)以及自动使用的本地 10.6 客户端库中的向后不兼容更改,mysqlclient DBAPI(适用于 1.3 和 1.4)。当编码状态为“utf8”时,这些客户端库现在会报告“utf8mb3”编码符号,导致 MySQL 方言中的查找和编码错误,该方言不期望此符号。更新了 MySQL 基础库以适应报告此 utf8mb3 符号以及测试套件的更改。感谢 Georg Richter 的支持。
参考:#7115, #7136
sqlite
- [sqlite] [错误]
添加有关传递给 pysqlcipher 的 url 的与加密相关的 pragma 的注意事项。
参考:#6589
orm
- [orm] [错误]
修复了在与持久化对象一起使用时的Session.bulk_save_objects()
中的问题,这些对象将无法跟踪列名与属性名不同的映射的主键。
参考:#6392
模式
- [模式] [错误]
如果Table
对象在实例化时没有传递至少Table.name
和Table.metadata
参数,则现在会引发一个信息性错误消息。以前,如果这些参数作为关键字参数传递,对象将悄悄地无法正确初始化。
参考:#6135
postgresql
- [postgresql] [bug] [regression]
修复了由#6023引起的回归,当使用 psycopg2 时,将 PostgreSQL cast 运算符应用于ARRAY
中的元素时,如果数据类型也嵌入在Variant
适配器的实例中,将无法使用正确的类型。
此外,修复了在使用Variant(ARRAY(some_schema_type))
时发出正确的 CREATE TYPE 的支持。
参考:#6182
mysql
- [mysql] [bug] [mariadb]
修复了适应 MariaDB 10.6 系列的问题,包括 mariadb-connector Python 驱动程序(仅支持 SQLAlchemy 1.4)和自动使用的 mysqlclient DBAPI 中的本机 10.6 客户端库中的不兼容更改。当编码状态为“utf8”时,这些客户端库现在报告“utf8mb3”编码符号,导致 MySQL 方言中的查找和编码错误,该方言不期望此符号。更新了 MySQL 基本库以适应此 utf8mb3 符号的报告以及测试套件。感谢 Georg Richter 的支持。
参考:#7115, #7136
sqlite
- [sqlite] [bug]
在传递给 pysqlcipher 的 url 中添加有关加密相关的 pragma 的注释。
参考:#6589
1.3.24
发布日期:2021 年 3 月 30 日
orm
- [orm] [bug]
删除了非常古老的警告,指出 passive_deletes 不适用于多对一关系。虽然在许多情况下,在多对一关系上放置此参数可能不是预期的操作,但在某些情况下,可能希望在此类关系之后禁止删除级联。
参考:#5983 - [orm] [bug]
修复了连接两个表的过程可能失败的问题,如果其中一个表具有无关的、无法解决的外键约束,这将在连接过程中引发NoReferenceError
,尽管可以绕过此异常以允许连接完成。在处理中测试异常重要性的逻辑会对构造做出可能失败的假设。
参考:#5952 - [orm] [bug]
修复了当父对象已经加载,并且后续查询覆盖时,MutableComposite
构造可能处于无效状态的问题,这是由于复合属性的刷新处理程序用新对象替换对象而不受可变扩展处理。
参考:#6001
engine
- [engine] [bug]
修复了“schema_translate_map”功能在直接执行DefaultGenerator
对象(例如序列)时未被考虑的问题,其中包括当禁用 implicit_returning 时“预执行”它们以生成主键值的情况。
参考:#5929
schema
- [schema] [bug]
修复了首次引入的错误,即 #2892、#2919 和 #3832 的某种组合,其中对于TypeDecorator
的附加事件会与“impl”类重复,如果“impl”也是SchemaType
。真实情况是,任何TypeDecorator
与Enum
或Boolean
相结合时,当设置create_constraint=True
标志时,会获得重复的CheckConstraint
。
参考:#6152 - [schema] [bug] [sqlite]
修复了由Boolean
或Enum
生成的 CHECK 约束在第一次编译后无法正确呈现命名约定的问题,这是由于约束名称中的状态意外更改导致的。此问题首次出现在修复问题#3067 时引入的 0.9 版本中,修复了当时采取的方法,该方法似乎比实际需要的更复杂。
参考:#6007 - [schema] [bug]
修复/实现了支持使用列名/键等作为约定一部分的主键约束命名约定。特别是,这包括Table
自动关联的PrimaryKeyConstraint
对象将在向表添加新的主键Column
对象然后添加到约束时更新其名称。现在已经适应了与此约束构建过程相关的内部故障模式,包括没有列存在,没有名称存在或存在空名称。
参考:#5919 - [schema] [bug]
调整了为Sequence
对象发出 DROP 语句的逻辑,使得所有Sequence
对象在所有表之后被删除,即使给定的Sequence
仅与Table
对象相关,而不直接与整体MetaData
对象相关。该用例支持同一Sequence
同时与多个Table
相关联。
参考:#6071
postgresql
- [postgresql] [bug]
修复了在某些条件下使用aggregate_order_by
会返回 ARRAY(NullType)的问题,干扰了结果对象正确返回数据的能力。
参考:#5989 - [postgresql] [bug] [reflection]
修复了 PostgreSQL 反射中的问题,表达“NOT NULL”的列将取代对应域的可空性。
参考:#6161 - [postgresql] [bug] [types]
调整了 psycopg2 方言,使其对包含 ARRAY 元素的绑定参数发出明确的 PostgreSQL 样式转换。这允许在数组中正确使用全部范围的数据类型。asyncpg 方言已在最终语句中生成了这些内部转换。这还包括对数组切片更新的支持以及 PostgreSQL 特有的ARRAY.contains()
方法。
参考:#6023
mssql
- [mssql] [bug] [reflection]
修复了有关 SQL Server 反射的问题,针对较旧的 SQL Server 2005 版本,调用 sp_columns 如果不加 EXEC 关键字则无法正确执行。这种方法在当前的 1.4 系列中不再使用。
参考:#5921
orm
- [orm] [bug]
删除了一个非常古老的警告,指出 passive_deletes 不适用于多对一关系。虽然在许多情况下在多对一关系上放置此参数可能不是预期的行为,但有一些用例希望在这样的关系之后不允许删除级联。
参考:#5983 - [orm] [bug]
修复了如果两个表中的一个表具有无关、不可解析的外键约束,则连接两个表的过程可能会失败的问题。此外,如果在连接过程中引发了NoReferenceError
,尽管可以绕过此错误完成连接,但测试过程中测试异常的逻辑将对结构进行假设,这些假设将失败。
参考:#5952 - [orm] [bug]
修复了当父对象已加载,然后被后续查询覆盖时,MutableComposite
结构可能处于无效状态的问题,因为复合属性的刷新处理程序会用不受可变扩展控制的新对象替换对象。
参考:#6001
引擎
- [engine] [bug]
修复了一个 bug,在直接执行DefaultGenerator
对象(比如序列)时,“schema_translate_map” 特性未被考虑进去,其中包括当隐式返回被禁用时“预执行”以生成主键值的情况。
参考:#5929
模式
- [模式] [错误]
修复了首次引入的错误,可能是由#2892、#2919和#3832的某种组合引起的,其中TypeDecorator
的附加事件会对“impl”类重复,如果“impl”也是SchemaType
。实际情况是,任何TypeDecorator
与Enum
或Boolean
相对时,当设置create_constraint=True
标志时,将会获得一个重复的CheckConstraint
。
参考:#6152 - [模式] [错误] [sqlite]
修复了由Boolean
或Enum
生成的 CHECK 约束在第一次编译后无法正确呈现命名约定的问题,这是由于约束名称中的状态意外更改导致的。此问题首次在 0.9 中引入,修复了当时为解决问题#3067 而采取的方法,该方法似乎比实际需要的更复杂。
参考:#6007 - [模式] [错误]
修复/实现了支持使用列名/键等作为约定的主键约束命名规范。特别是,这包括Table
自动关联的PrimaryKeyConstraint
对象将在向表添加新的主键Column
对象后更新其名称,然后更新约束。现在已经适应了与此约束构建过程相关的内部故障模式,包括没有列存在、没有名称存在或空名称存在。
参考:#5919 - [模式] [错误]
调整了发出Sequence
对象的 DROP 语句的逻辑,以便在删除多个表时,所有Sequence
对象都在所有表之后被删除,即使给定的Sequence
仅与一个Table
对象相关联,而不直接与整体MetaData
对象相关联。该用例支持同一Sequence
同时与多个Table
相关联。
参考:#6071
postgresql
- [postgresql] [bug]
修复了在某些条件下使用aggregate_order_by
会返回 ARRAY(NullType)的问题,干扰了结果对象正确返回数据的能力。
参考:#5989 - [postgresql] [bug] [reflection]
修复了在 PostgreSQL 反射中,表达“NOT NULL”的列将取代相应域的可空性的问题。
参考:#6161 - [postgresql] [bug] [types]
调整了 psycopg2 方言以发出包含 ARRAY 元素的绑定参数的显式 PostgreSQL 风格转换。这允许各种数据类型在数组中正确运行。asyncpg 方言已在最终语句中生成了这些内部转换。这还包括对数组切片更新以及 PostgreSQL 特定的ARRAY.contains()
方法的支持。
参考:#6023
mssql
- [mssql] [bug] [reflection]
修复了有关旧版 SQL Server 2005 版本的 SQL Server 反射的问题,调用 sp_columns 时,如果没有使用 EXEC 关键字作为前缀,则无法正确进行。这种方法在当前的 1.4 系列中没有使用。
参考:#5921
1.3.23
发布日期:2021 年 2 月 1 日
sql
- [sql] [bug]
修复了在TypeDecorator
类型上使用TypeEngine.with_variant()
方法时未考虑到正在使用的特定方言映射的 bug,这是由于TypeDecorator
中的规则尝试检查TypeDecorator
实例链而导致的。
参考:#5816
postgresql
- [postgresql] [bug]
仅适用于 SQLAlchemy 1.3,setup.py 将 pg8000 固定在低于 1.16.6 的版本。版本 1.16.6 及以上由 SQLAlchemy 1.4 支持。感谢 Giuseppe Lumia 的拉取请求。
参考:#5645 - [postgresql] [bug]
修复了在使用Table.to_metadata()
(在 1.3 中称为Table.tometadata()
)与 PostgreSQL 的ExcludeConstraint
结合使用时,使用临时列表达式的情况下无法正确复制的问题。
参考:#5850
mysql
- [mysql] [usecase]
在 MySQL >= (8, 0, 17) 和 MariaDb >= (10, 4, 5) 中现在支持转换为FLOAT
。
参考:#5808 - [mysql] [bug] [reflection]
修复了 MySQL 服务器默认反射对带有否定符号的数值失败的 bug。
参考:#5860 - [mysql] [bug]
修复了 MySQL 方言中长期存在的 bug,其中标识符长度的最大限制为 255 对于所有类型的约束名称都太长,不仅仅是索引,所有这些都有一个大小限制为 64。由于元数据命名约定可能在此区域创建过长的名称,因此将限制应用于 DDL 编译器内的标识符生成器。
参考:#5898 - [mysql] [bug]
修复了由于 PyMySQL 1.0 发布而引起的弃用警告,包括“db”和“passwd”参数的弃用警告,现在替换为“database”和“password”。
参考:#5821 - [mysql] [bug]
修复了 SQLAlchemy 1.3.20 中由于修复#5462而引起的 Oracle 方言中的回归,该修复为 MySQL 功能表达式在索引中添加双括号,后端所需,这无意中扩展到包括任意text()
表达式以及 Alembic 的内部文本组件,这些对于 Alembic 来说是需要的,用于不暗示双括号的任意索引表达式。检查已经缩小,仅包括直接的二元/一元/功能表达式。
参考:#5800
oracle
- [oracle] [bug]
修复了 SQLAlchemy 1.3.11 中由#4894引入的 Oracle 方言中的回归,其中在 UPDATE 的 RETURNING 中使用 SQL 表达式会因为在任意 SQL 表达式不是列时检查“server_default”而无法编译。
参考:#5813 - [oracle] [bug]
修复了 Oracle 方言中的 bug,通过Insert.returning()
检索 CLOB/BLOB 列会失败,因为当返回时需要读取 LOB 值;此外,修复了在 Python 2 下通过 RETURNING 检索 Unicode 值的支持。
参考:#5812
misc
- [bug] [ext]
修复了在尝试为可选择的.c
集合生成“key”时有时会调用的字符串化失败的问题,如果列是使用sqlalchemy.ext.compiler
扩展的未标记的自定义 SQL 构造,并且没有提供默认编译形式;虽然这似乎是一个不寻常的情况,但在一些 ORM 场景中可能会调用它,比如当表达式与连接的急加载一起在“order by”中使用时。问题在于缺乏默认编译器函数会引发CompileError
而不是UnsupportedCompilationError
。
参考:#5836
sql
- [sql] [bug]
修复了在TypeDecorator
类型上使用TypeEngine.with_variant()
方法时存在的 bug,由于TypeDecorator
中的一条规则,它试图检查TypeDecorator
实例链,而未考虑到正在使用的特定方言映射。
参考:#5816
postgresql
- [postgresql] [bug]
仅适用于 SQLAlchemy 1.3,setup.py 将 pg8000 固定在低于 1.16.6 的版本。版本 1.16.6 及以上受 SQLAlchemy 1.4 支持。感谢 Giuseppe Lumia 的拉取请求。
参考:#5645 - [postgresql] [bug]
修复了在与使用临时列表达式的 PostgreSQLExcludeConstraint
一起使用Table.to_metadata()
(在 1.3 中称为Table.tometadata()
)时无法正确复制的问题。
参考:#5850
mysql
- [mysql] [usecase]
现在 MySQL >= (8, 0, 17)和 MariaDb >= (10, 4, 5)中支持转换为FLOAT
。
参考:#5808 - [mysql] [bug] [reflection]
修复了 MySQL 服务器默认反射对带有否定符号的数值失败的 bug。
参考:#5860 - [mysql] [bug]
修复了 MySQL 方言中存在已久的 bug,其中 255 的最大标识符长度对于所有类型的约束名称都太长,而不仅仅是索引,所有这些都有 64 的大小限制。由于元数据命名约定可能在此区域创建过长的名称,因此将限制应用于 DDL 编译器内的标识符生成器。
参考:#5898 - [mysql] [bug]
修复了由于 PyMySQL 1.0 发布而引起的弃用警告,包括“db”和“passwd”参数的弃用警告,现已替换为“database”和“password”。
参考:#5821 - [mysql] [bug]
由于修复了#5462导致的 SQLAlchemy 1.3.20 中的回归问题,该修复为 MySQL 功能表达式在索引中添加了双括号,后端需要这样做,这无意中扩展到了包括任意text()
表达式以及 Alembic 的内部文本组件,这些对于 Alembic 来说是必需的,用于不暗示双括号的任意索引表达式。检查已经缩小,只包括直接的二元/一元/功能表达式。
引用:#5800
oracle
- [oracle] [bug]
修复了在 SQLAlchemy 1.3.11 中由#4894引入的 Oracle 方言中的回归问题,其中在 UPDATE 的 RETURNING 中使用 SQL 表达式会因为在任意 SQL 表达式不是列时检查“server_default”而无法编译。
引用:#5813 - [oracle] [bug]
修复了 Oracle 方言中的一个错误,即通过Insert.returning()
检索 CLOB/BLOB 列会失败,因为当返回时需要读取 LOB 值;此外,修复了在 Python 2 下通过 RETURNING 检索 Unicode 值的支持。
引用:#5812
杂项
- [bug] [ext]
修复了在尝试为可选择的.c
集合生成“key”时有时会调用字符串化的问题,如果列是使用sqlalchemy.ext.compiler
扩展的未标记的自定义 SQL 构造,并且没有提供默认编译形式,则会失败;虽然这似乎是一个不寻常的情况,但在一些 ORM 场景中可能会调用它,比如在“order by”中与联接的急加载一起使用表达式时。问题在于缺少默认编译器函数会引发CompileError
而不是UnsupportedCompilationError
。
引用:#5836
SqlAlchemy 2.0 中文文档(六十)(3)https://developer.aliyun.com/article/1560730