SqlAlchemy 2.0 中文文档(五十八)(2)https://developer.aliyun.com/article/1563134
2.0.1
发布日期:2023 年 2 月 1 日
orm
- [orm] [bug] [回归]
修复了使用具有复合外键的连接表继承的 ORM 模型会在映射器内部遇到内部错误的回归。
参考:#9164 - [orm] [bug]
当将基类的链接策略选项链接到子类的另一个属性时,错误报告得到改进,应该使用of_type()
。以前,当使用Load.options()
时,消息缺乏of_type()
应该使用的信息详细信息,而在直接链接选项时不是这样。即使使用Load.options()
,信息详细信息现在也会发出。
参考:#9182
orm 声明
- [bug] [orm 声明]
添加了对 PEP 484NewType
的支持,可以在registry.type_annotation_map
中使用,以及在Mapped
构造中使用。这些类型将与当前的自定义类型子类相同;它们必须显式出现在registry.type_annotation_map
中进行映射。
参考资料:#9175 - [bug] [orm declarative]
在使用MappedAsDataclass
超类时,层次结构中的所有类(不管它们是否实际上已映射)都将通过@dataclasses.dataclass
函数运行,因此在映射的子类被转换为数据类时,层次结构中声明的非 ORM 字段将被使用。该行为既适用于使用__abstract__ = True
映射的中介类,也适用于用户定义的声明基类本身,假设MappedAsDataclass
作为这些类的超类存在。
这允许像InitVar
声明这样的非映射属性在超类上使用,而无需在每个非映射类上显式运行@dataclasses.dataclass
装饰器。新行为被认为是正确的,因为这是当使用超类来指示数据类行为时 PEP 681 实现所期望的。
参考资料:#9179 - [bug] [orm declarative]
添加了对 PEP 586Literal[]
的支持,可以在registry.type_annotation_map
中使用,以及在Mapped
构造中使用。要使用这样的自定义类型,它们必须显式出现在registry.type_annotation_map
中进行映射。感谢 Frederik Aalund 提交的拉取请求。
作为此更改的一部分,将Enum
在registry.type_annotation_map
中的支持扩展为还包括Literal[]
类型,该类型由字符串值组成,除了enum.Enum
数据类型之外。如果在Mapped[]
中使用了一个未在registry.type_annotation_map
中链接到特定数据类型的Literal[]
数据类型,那么默认将使用一个Enum
。
另请参阅
在类型映射中使用 Python Enum 或 pep-586 Literal 类型
参考:#9187 - [bug] [orm declarative]
在registry.type_annotation_map
中使用Enum
时,修复了一个问题,即如果根据文档将Enum.native_enum
参数重写为 False,则该参数将不会正确地复制到映射的列数据类型中。
参考:#9200 - [bug] [orm declarative] [regression]
在DeclarativeBase
类中修复了一个回归,其中注册表的默认构造函数不会应用于基类本身,这与以前的declarative_base()
构造方式不同。这会阻止具有自己的__init__()
方法的映射类调用super().__init__()
以访问注册表的默认构造函数并自动填充属性,而是会命中object.__init__()
,这会导致在任何参数上引发TypeError
。
参考:#9171 - [bug] [orm declarative]
改进了在使用 Annotated Declarative mapping 时解释 PEP 593Annotated
类型的规则集,内部类型将始终检查“Optional”,并将其添加到确定列是否为“nullable”的条件中;如果Annotated
容器中的类型是可选的(或与None
联合),则如果没有显式的mapped_column.nullable
参数覆盖它,将考虑该列为可空。
参考:#9177
sql
- [sql] [bug]
修正了版本 2.0.0 中发布的对#7664的修复,还包括了DropSchema
,这在修复中被无意中忽略,允许在没有方言的情况下进行字符串化。这两个构造的修复已经回溯到 1.4.47 版本的 1.4 系列。
参考:#7664 - [sql] [bug] [regression]
修复了与新“insertmanyvalues”功能实现相关的回归,其中在 CTE 中引用另一个insert()
时会出现内部TypeError
的情况;为此情况进行了额外的修复,适用于像 asyncpg 这样的位置方言在使用“insertmanyvalues”时。
参考:#9173
typing
- [typing] [bug]
打开了对Select.with_for_update.of
的类型,也接受表和映射类参数,似乎适用于 MySQL 方言。
参考:#9174 - [typing] [bug]
修复了限制/偏移方法的类型,包括Select.limit()
、Select.offset()
、Query.limit()
、Query.offset()
,允许None
,这是“取消”当前限制/偏移的文档化 API。
参考:#9183 - [typing] [bug]
修复了mapped_column()
对象被类型化为Mapped
时不会被接受在模式约束中,如ForeignKey
、UniqueConstraint
或Index
。
参考:#9170 - [typing] [bug]
修复了对ColumnElement.cast()
的类型检查,以接受Type[TypeEngine[T]]
和TypeEngine[T]
;先前只接受TypeEngine[T]
。拉取请求由 Yurii Karabas 提供。
参考资料:#9156
2.0.0
发布日期:2023 年 1 月 26 日
ORM
- [ORM] [错误]
改进了在配置映射器或刷新过程中发出的警告的通知,这些警告通常作为不同操作的一部分调用,以在可能不明显相关的操作中添加附加上下文到警告的消息,指示其中一个这些操作作为警告源在操作中的消息内。
参考资料:#7305
ORM 扩展
- [功能] [ORM 扩展]
向水平分片 APIset_shard_id
添加了新选项,该选项设置了要针对其进行查询的有效分片标识符,包括主查询以及所有次要加载程序,包括关系急加载程序以及关系和列延迟加载程序。
参考资料:#7226 - [用例] [ORM 扩展]
为AutomapBase
添加了新功能,用于跨多个模式自动加载类,这些类可能具有重叠的名称,方法是提供一个AutomapBase.prepare.modulename_for_table
参数,允许自定义新生成的类的__module__
属性,以及一个新集合AutomapBase.by_module
,它存储了基于__module__
属性的类的点分隔的模块名称空间。
此外,现在可以任意次调用AutomapBase.prepare()
方法,无论是否启用了反射;在每次调用时,只会处理之前未映射的新添加的表。先前,需要显式调用MetaData.reflect()
方法。
另请参阅
从多个模式生成映射 - 同时演示两种技术的使用。
参考资料:#5145
SQL
- [SQL] [错误]
修复了CreateSchema
DDL 构造的字符串化问题,当没有方言时,会导致AttributeError
。更新:请注意,此修复未考虑到DropSchema
;版本 2.0.1 中的后续修复解决了这个问题。这两个元素的修复已经回溯到 1.4.47。
参考:#7664
输入
- [输入] [错误]
为从func
命名空间中可用的内置通用函数添加了类型,这些函数接受一组特定的参数并返回特定的类型,例如count
,current_timestamp
等。
参考:#9129 - [输入] [错误]
修正了“lambda 语句”传递的类型,以便 mypy、pyright 等可以接受普通 lambda 而不会出现关于参数类型的任何错误。此外,为更多的 lambda 语句公共 API 实现了类型,并确保StatementLambdaElement
是Executable
层次结构的一部分,因此它被类型化为被Connection.execute()
接受。
参考:#9120 - [输入] [错误]
ColumnOperators.in_()
和ColumnOperators.not_in()
方法的类型现在包括Iterable[Any]
,而不是Sequence[Any]
,以提供更灵活的参数类型。
参考:#9122 - [输入] [错误]
从类型的角度来看,or_()
和and_()
需要第一个参数存在,但这些函数仍然接受零个参数,这将在运行时发出弃用警告。还添加了类型支持,以支持将固定字面量False
用于or_()
和True
用于and_()
作为唯一的第一个参数,但文档现在指示在这些情况下发送false()
和true()
构造作为更明确的方法。
参考:#9123 - [打字] [错误]
修复了在对Query
对象进行迭代时类型不正确的问题。
参考:#9125 - [打字] [错误]
修复了在使用Result
作为上下文管理器时对象类型未被保留的问题,始终指示所有情况下的Result
而不是特定的Result
子类型。感谢 Martin Baláž 的拉取请求。
参考:#9136 - [打字] [错误]
修复了使用relationship.remote_side
和类似参数时的问题,传递作为Mapped
类型的注释声明对象将不被类型检查器接受。
参考:#9150 - [打字] [错误]
为诸如isnot()
、notin_()
等旧操作符添加了类型,这些操作符以前引用了更新的操作符,但它们本身没有被类型化。
参考:#9148
postgresql
- [postgresql] [错误]
添加了对 asyncpg 方言的支持,以在可用时返回cursor.rowcount
值用于 SELECT 语句。虽然这不是cursor.rowcount
的典型用法,但其他 PostgreSQL 方言通常提供此值。感谢 Michael Gorven 的拉取请求。
此更改也回溯到:1.4.47
参考:#9048
mysql
- [mysql] [用例]
添加了对 MySQL 索引反射的支持,以正确反映先前被忽略的mysql_length
字典。
此更改也回溯到:1.4.47
参考:#9047
mssql
- [mssql] [bug] [regression]
MSSQL 方言的新添加的注释反射和渲染功能,添加于#7844,如果无法确定是否使用不受支持的后端(如 Azure Synapse),则现在将默认禁用;这个后端不支持表和列注释,也不支持用于生成它们以及反映它们的 SQL Server 例程。方言添加了一个新参数supports_comments
,默认值为None
,表示应自动检测注释支持。当设置为True
或False
时,注释支持将被无条件启用或禁用。
另请参阅
DDL 注释支持
参考:#9142
2.0.0rc3
发布日期:2023 年 1 月 18 日
orm
- [orm] [feature]
向Mapper
添加了一个名为Mapper.polymorphic_abstract
的新参数。该指令的目的是让 ORM 不考虑该类被直接实例化或加载,只考虑子类。实际效果是,Mapper
将阻止直接实例化该类的实例,并期望该类没有配置独特的多态标识。
在实践中,使用Mapper.polymorphic_abstract
映射的类可以作为relationship()
的目标,也可以在查询中使用;当然,子类必须在映射中包含多态标识。
新参数会自动应用于继承AbstractConcreteBase
类的类,因为这个类不打算被实例化。
另请参阅
使用多态抽象构建更深层次的层次结构
参考:#9060 - [orm] [bug]
修复了在registry.type_annotation_map
中使用 pep-593Annotated
类型,其本身包含一个通用的普通容器或collections.abc
类型(例如list
,dict
,collections.abc.Sequence
等)作为目标类型时会在 ORM 尝试解释Annotated
实例时产生内部错误的问题。
参考:#9099 - [orm] [bug]
当relationship()
映射到抽象容器类型(例如Mapped[Sequence[B]]
)时未提供relationship.container_class
参数时,添加了一个错误消息,此参数在类型为抽象时是必需的。以前,抽象容器会在稍后的步骤中尝试实例化并失败。
参考:#9100
sql
- [sql] [bug]
修复了使用与Update.values()
方法中的列相同名称的bindparam()
,以及在 2.0 中的Insert.values()
方法中,如果在构造的语句中使用相同名称的参数,则在某些情况下会静默失败,替换为同名的新参数,并丢弃 SQL 表达式的其他元素,例如 SQL 函数等。特定情况将是针对 ORM 实体而不是普通Table
实例构造的语句,但如果使用Session
或Connection
调用语句,则会发生。Update
部分的问题既存在于 2.0 中也存在于 1.4 中,并被回溯到 1.4。
此更改还被回溯到:1.4.47
参考:#9075
typing
- [typing] [bug]
修复了在sqlalchemy.ext.hybrid
扩展中注释的问题,以更有效地对用户定义的方法进行类型化。现在,typing 使用PEP 612功能,最近的 Mypy 版本也支持,以维护hybrid_method
的参数签名。 混合方法的返回值在Select.where()
等上下文中被接受为 SQL 表达式,同时仍支持 SQL 方法。
参考:#9096
mypy
- [mypy] [bug]
调整了 mypy 插件,以适应 SQLAlchemy 1.4 时可能进行的一些更改,这些更改是针对问题#236 sqlalchemy2-stubs 而进行的。这些更改与 SQLAlchemy 2.0 保持同步。这些更改也向后兼容旧版本的 sqlalchemy2-stubs。
此更改还回溯到:1.4.47 - [mypy] [bug]
修复了 mypy 插件中的崩溃,在 1.4 和 2.0 版本中均可能发生,如果装饰器用于与具有两个以上组件的表达式(例如@Backend.mapper_registry.mapped
)中引用,则会发生。 现在,此场景被忽略; 使用插件时,装饰器表达式需要是两个组件(即@reg.mapped
)。
此更改还回溯到:1.4.47
参考:#9102
postgresql
- [postgresql] [bug]
修复了 psycopg3 版本 3.1.8 更改了 API 调用的回归,以期望先前未强制执行的特定对象类型,从而破坏了 psycopg3 方言的连接性。
参考:#9106
oracle
- [oracle] [usecase]
添加了对 Oracle SQL 类型TIMESTAMP WITH LOCAL TIME ZONE
的支持,使用新添加的 Oracle 特定的TIMESTAMP
数据类型。
参考:#9086
2.0.0rc2
Released: January 9, 2023
orm
- [orm] [bug]
修复了在 2.0 中添加的过于严格的 ORM 映射规则,该规则阻止了对TableClause
对象的映射,例如在 wiki 上使用的视图配方中使用的那些。
参考:#9071
typing
- [typing] [bug]
数据类转换参数field_descriptors
在 PEP 681 的已接受版本中更名为field_specifiers
。
参考:#9067
postgresql
- [postgresql] [json]Implemented missing
JSONB
operations:
@@
使用Comparator.path_match()
@?
使用Comparator.path_exists()
#-
使用Comparator.delete_path()
- 感谢 Guilherme Martins Crocetti 提供的拉取请求。
参考文献:#7147
mysql
- [mysql] [bug]
恢复了Inspector.has_table()
的行为,以报告 MySQL / MariaDB 的临时表。这是所有其他包含的方言当前的行为,但是在 1.4 中由于不再使用 DESCRIBE 命令而删除了 MySQL 的该行为;在此版本或任何以前的版本上都没有记录支持通过Inspector.has_table()
方法报告临时表的文件,因此以前的行为未定义。
由于 SQLAlchemy 2.0 已经为临时表状态添加了正式支持通过Inspector.has_table()
,因此 MySQL / MariaDB 方言已恢复为使用“DESCRIBE”语句,就像 SQLAlchemy 1.3 系列和以前一样,并且添加了测试支持以包含 MySQL / MariaDB 的此行为。由于 SQLAlchemy 2.0 中Connection
如何处理事务的简化,1.4 试图改进的 ROLLBACK 引发的先前问题不适用。
DESCRIBE 是必需的,因为 MariaDB 特别是没有任何一致可用的公共信息模式以报告临时表,除了依赖于抛出错误以报告无结果的 DESCRIBE/SHOW COLUMNS。
参考文献:#9058
oracle
- [oracle] [bug]
支持外键约束的用例,其中本地列标记为“不可见”。当反射创建检查目标列的ForeignKeyConstraint
时,通常生成的错误被禁用,并且与已存在的具有类似问题的Index
一样,跳过该约束并发出警告。
参考:#9059
2.0.0rc1
发布日期:2022 年 12 月 28 日
通用
- [通用] [错误]
修复了基础兼容模块调用platform.architecture()
以检测某些系统属性的回归错误,结果是对系统级别的file
调用进行了过于广泛的系统调用,在某些情况下不可用,包括某些安全环境配置中。
此更改也已被回溯到:1.4.46
参考:#8995
ORM
- [orm] [功能]
添加了一个新的默认值为Mapper.eager_defaults
参数“auto”的值,这将在工作单元刷新期间自动获取表默认值,如果方言支持 INSERT 的 RETURNING,以及可用的 insertmanyvalues。对于服务器端 UPDATE 默认值的及时获取,这是非常罕见的,只有当Mapper.eager_defaults
设置为True
时才会发生,因为对于 UPDATE 语句没有批量 RETURNING 形式。
参考:#8889 - [orm] [用例]关于
Session
的可扩展性调整,以及ShardedSession
扩展的更新:
Session.get()
现在接受Session.get.bind_arguments
,特别是在使用水平分片扩展时可能会有用。Session.get_bind()
接受任意关键字参数,这有助于开发使用覆盖此方法的Session
类的代码,该方法具有附加参数。- 添加了一个新的 ORM 执行选项
identity_token
,它可用于直接影响与新加载的 ORM 对象关联的“身份令牌”。这个令牌是分片方法(主要是ShardedSession
,但也可以在其他情况下使用)在不同“分片”之间分离对象标识的方式。
另见
身份令牌 SessionEvents.do_orm_execute()
事件钩子现在可以用于影响所有与 ORM 相关的选项,包括autoflush
、populate_existing
和yield_per
;这些选项在事件钩子被调用后重新消耗,然后才被执行。以前,像autoflush
这样的选项在这一点上已经被评估过了。新的identity_token
选项也在这种模式下受支持,并且现在被水平分片扩展使用。ShardedSession
类用新的钩子ShardedSession.identity_chooser
替换了ShardedSession.id_chooser
钩子,不再依赖于传统的Query
对象。在替代ShardedSession.identity_chooser
时,会发出弃用警告,仍然接受ShardedSession.id_chooser
。
- 参考:#7837
- [orm] [usecase]
“将外部事务加入到会话中”的行为已经进行了修订和改进,允许显式控制Session
如何适应已经建立事务和可能已经建立保存点的传入Connection
。新参数Session.join_transaction_mode
包括一系列选项值,可以以多种方式适应现有事务,最重要的是允许Session
以完全事务方式操作,仅使用保存点,同时在任何情况下保持外部启动的事务未提交且活动,允许测试套件回滚测试中发生的所有更改。
此外,对Session.close()
方法进行了修订,以完全关闭可能仍存在的保存点,这也允许“外部事务”配方在Session
未明确结束其自身 SAVEPOINT 事务时继续进行而不产生警告。
另请参阅
会话的新事务加入模式
参考:#9015 - [orm] [usecase]
移除了在检测到非Mapped[]
注释时必须使用__allow_unmapped__
属性的要求;以前,如果检测到旨在支持遗留 ORM 类型映射的错误消息将被引发,此外还未提及与 Dataclasses 特别相关的正确模式。如果使用了registry.mapped_as_dataclass()
或MappedAsDataclass
,则不再引发此错误消息。
另请参阅
使用非映射数据类字段
参考:#8973 - [orm] [bug]
修复了内部 SQL 遍历中的问题,例如对Update
和Delete
等 DML 语句,这将导致除其他潜在问题之外,使用 ORM 更新/删除功能的 lambda 语句的特定问题。
此更改也被回溯到:1.4.46
参考:#9033 - [orm] [bug]
修复了一个 bug,即Session.merge()
无法保留使用relationship.viewonly
参数指示的关系属性的当前加载内容,从而破坏了使用Session.merge()
从缓存和其他类似技术中拉取完全加载的对象的策略。在相关更改中,修复了一个问题,即包含已配置为在映射上lazy='raise'
的已加载关系的对象在传递给Session.merge()
时会失败;假设Session.merge.load
参数保持其默认值True
,则合并过程中的“raise”检查现在被暂停了。
总体而言,这是对 1.4 系列中引入的更改的行为调整,截至#4994,该更改将“merge”从“viewonly”关系的默认级联集中移除。由于“viewonly”关系在任何情况下都不会被持久化,因此在“merge”期间允许其内容传输不会影响目标对象的持久化行为。这使得Session.merge()
能够正确地适用于其用例之一,即将在其他地方加载的对象添加到Session
中,通常是为了从缓存中恢复。
此更改也被回溯到:1.4.45
参考:#8862 - [orm] [bug]
修复了with_expression()
中的问题,在某些情况下,由于表达式由从外部 SELECT 中引用的列组成,因此不会正确地在某些上下文中呈现 SQL,在表达式具有与使用query_expression()
的属性匹配的标签名称的情况下,即使query_expression()
没有默认表达式。暂时,如果query_expression()
确实具有默认表达式,则仍将使用该标签名称作为该默认表达式,并且将继续忽略具有相同名称的其他标签。总体而言,这种情况相当棘手,因此可能需要进一步调整。
此更改还回溯到:1.4.45
参考:#8881 - [orm] [bug]
如果在relationship()
中使用的反向引用名称在目标类上命名了已经有方法或属性分配给该名称的属性,则会发出警告,因为反向引用声明将替换该属性。
参考:#4629 - [orm] [bug]一系列关于
Session.refresh()
的变更和改进。总体变更是,当要刷新与关系绑定的属性时,对象的主键属性现在无条件地包含在刷新操作中,即使未过期,即使未在刷新中指定。
- 改进了
Session.refresh()
,以便如果启用了自动刷新(如Session
的默认值),则自动刷新将在刷新过程的较早部分发生,以便应用待处理的主键更改而不会引发错误。以前,此自动刷新发生得太晚,并且 SELECT 语句不会使用正确的键来定位行,并且会引发InvalidRequestError
。 - 当存在上述条件时,即对象上存在未刷新的主键更改,但未启用自动刷新时,refresh()方法现在明确禁止操作继续进行,并引发一个信息性的
InvalidRequestError
,要求首先刷新待处理的主键更改。以前,这种用例简单地被破坏,无论如何都会引发InvalidRequestError
。这个限制是为了安全起见,以便刷新主键属性,这对于能够刷新具有 relationship 绑定的次要急切加载器的对象是必要的。无论是否实际上需要刷新 PK 列,这个规则都适用于保持 API 行为一致,因为在任何情况下,刷新对象的某些属性而保留其他属性“待处理”是不寻常的。 Session.refresh()
方法已经得到增强,以便刷新那些在映射时或通过最近使用的加载器选项与relationship()
绑定并链接到急切加载器的属性,在所有情况下都会被刷新,即使传递了一个不包括父行上任何列的属性列表。这是在 1.4 中作为#1763的一部分首次实现的功能,允许急切加载的与 relationship 绑定的属性参与Session.refresh()
操作。如果刷新操作没有指示要刷新父行上的任何列,则主键列仍将包括在刷新操作中,这允许加载继续到正常情况下指示的次要关系加载器。以前,对于这种情况会引发一个InvalidRequestError
错误(#8703)- 修复了一个问题,即在
Session.refresh()
与一组过期属性以及像selectinload()
这样发出“secondary”查询的急加载器一起调用时,会发出不必要的额外 SELECT 的情况,如果主键属性也处于过期状态。由于主键属性现在自动包含在刷新中,因此当关系加载器开始为它们选择时,这些属性不会有额外的加载(#8997)。 - 修复了由 2.0.0b1 中的#8126引起的回归,其中
Session.refresh()
方法将在传递过期的列名以及链接到“secondary” eagerloader(如selectinload()
)的关系绑定属性的名称时失败,并引发AttributeError
(#8996)。
- 参考:#8703, #8996, #8997
- [orm] [bug]
改进了版本 1.4 中首次修复的问题,用于#8456,该问题减少了内部“多态适配器”的使用,用于在使用Mapper.with_polymorphic
参数时渲染 ORM 查询。这些适配器非常复杂且容易出错,现在仅在使用用户提供的显式子查询用于Mapper.with_polymorphic
的情况下使用,其中包括仅使用polymorphic_union()
辅助程序的具体继承映射的用例,以及在不需要的现代用例中使用别名子查询的联合继承映射的传统用例。
对于使用内置多态加载方案的联合继承映射的最常见情况,其中包括使用Mapper.polymorphic_load
参数设置为inline
的情况,现在不再使用多态适配器。这对查询构造的性能有积极影响,同时也极大简化了内部查询渲染过程。
目标特定问题是允许column_property()
引用标量子查询中的联合继承类,现在其工作方式尽可能直观。
参考:#8168
engine
- [engine] [bug]
修复了连接池中的长期竞争条件,该条件可能在 eventlet/gevent monkeypatching 方案与使用 eventlet/geventTimeout
条件相结合时发生,其中由于超时而中断的连接池检出将无法清理失败的状态,导致底层连接记录以及有时是数据库连接本身“泄漏”,将池留在无效状态中,无法访问条目。这个问题首次在 SQLAlchemy 1.2 中被识别和修复,用于 #4225,然而在该修复中检测到的故障模式未能适应BaseException
,而不是Exception
,这导致无法捕获 eventlet/geventTimeout
。此外,在初始池连接中还确定了一个块,并通过BaseException
-> “清除失败的连接”块来加固,以适应在此位置的相同条件。非常感谢 Github 用户 @niklaus 在识别和描述这个复杂问题方面的顽强努力。
此更改也被回溯到:1.4.46
参考:#8974 - [engine] [bug]
修复了Result.freeze()
方法在使用text()
或Connection.exec_driver_sql()
时无法工作的问题。
此更改也被回溯到:1.4.45
参考:#8963
sql
- [sql] [usecase]
在“字面绑定参数”渲染操作失败的情况下,现在会抛出一个信息性的重新引发,指示值本身和正在使用的数据类型,以帮助调试在语句中渲染字面参数时的情况。
此更改也被回溯到:1.4.45
参考:#8800 - [sql] [bug]
修复了 Lambda SQL 功能中的问题,其中字面值的计算类型不会考虑“与类型比较”的类型强制转换规则,导致 SQL 表达式(例如与JSON
元素的比较等)缺乏类型信息。
此更改也被回溯到:1.4.46
参考:#9029 - [sql] [bug]
修复了一系列关于渲染绑定参数的位置以及有时身份的问题,例如用于 SQLite、asyncpg、MySQL、Oracle 等的参数。一些编译形式不会正确维护参数的顺序,例如 PostgreSQLregexp_replace()
函数、首次在#4123中引入的CTE
构造的“嵌套”特性,以及使用 Oracle 的FunctionElement.column_valued()
方法形成的可选择表。
此更改也被回溯到:1.4.45
参考:#8827 - [sql] [bug]
添加了测试支持,以确保 SQLAlchemy 中所有Compiler
实现中的所有编译器visit_xyz()
方法都接受**kw
参数,以便所有编译器在所有情况下都接受额外的关键字参数。
参考:#8988 - [sql] [bug]
SQLCompiler.construct_params()
方法以及SQLCompiler.params
访问器现在将返回与使用render_postcompile
参数编译的编译语句对应的确切参数。之前,该方法返回的参数结构本身既不对应原始参数也不对应扩展参数。
不再允许将新参数字典传递给使用render_postcompile
构造的SQLCompiler
的SQLCompiler.construct_params()
;相反,为了为另一组参数制作新的 SQL 字符串和参数集,添加了一个新方法SQLCompiler.construct_expanded_state()
,该方法将使用包含新的 SQL 语句和新的参数字典的ExpandedState
容器产生给定参数集的新扩展形式,以及一个位置参数元组。
参考:#6114 - [sql] [bug]
为了适应对绑定参数有不同字符转义需求的第三方方言,SQLAlchemy 中用于“转义”(即在其位置替换为另一个字符)绑定参数名称的系统已被扩展,使用SQLCompiler.bindname_escape_chars
字典,可以在任何SQLCompiler
子类的类声明级别进行覆盖。作为此更改的一部分,还将点号"."
添加为默认的 “转义” 字符。
引用:#8994
typing
- [typing] [bug]
pep-484 typing 已完成对sqlalchemy.ext.horizontal_shard
扩展以及sqlalchemy.orm.events
模块的类型标注。感谢 Gleb Kisenkov 的努力。
引用:#6810, #9025
asyncio
- [asyncio] [bug]
从AsyncResult
中删除了不起作用的merge()
方法。这个方法从未起作用,是错误地包含在AsyncResult
中的。
此更改还 反向移植 至:1.4.45
引用:#8952
postgresql
- [postgresql] [bug]
修复了一个 PostgreSQL 的 bug,其中Insert.on_conflict_do_update.constraint
参数会接受一个Index
对象,但是不会将此索引展开为其各个索引表达式,而是在 ON CONFLICT ON CONSTRAINT 子句中呈现其名称,这在 PostgreSQL 中不被接受;“约束名”形式仅接受唯一或排除约束名。该参数继续接受索引,但现在会将其展开为其组件表达式以进行呈现。
此更改还 反向移植 至:1.4.46
引用:#9023 - [postgresql] [bug]
对 PostgreSQL 方言在从表中反射列时考虑列类型的方式进行了调整,以适应可能从 PG 的format_type()
函数返回 NULL 的替代后端。
此更改还 反向移植 至:1.4.45
引用:#8748 - [postgresql] [bug]
增加了对使用asyncpg
和psycopg
(仅限于 SQLAlchemy 2.0)的 PG 全文函数的显式支持,关于第一个参数的REGCONFIG
类型转换,之前会错误地转换为 VARCHAR,导致这些方言上的失败,这些方言依赖于显式类型转换。这包括对to_tsvector
,to_tsquery
,plainto_tsquery
,phraseto_tsquery
,websearch_to_tsquery
,ts_headline
的支持,每个函数根据传递的参数数量来确定第一个字符串参数是否应解释为 PostgreSQL 的REGCONFIG
值;如果是,则使用新添加的类型对象REGCONFIG
进行类型转换,然后在 SQL 表达式中显式地转换。
参考:#8977 - [postgresql] [错误]
修复了新修订的 PostgreSQL 范围类型(例如INT4RANGE
自定义类型的实现,而是引发TypeError
的回归问题。
参考:#9020 - [postgresql] [错误]
当与不同类的实例进行比较时,Range.__eq___()
现在会返回NotImplemented
,而不是引发AttributeError
异常。
参考:#8984
sqlite
- [sqlite] [用例]
为 SQLite 后端增加了反映可能存在于外键结构上的“DEFERRABLE”和“INITIALLY”关键字的支持。感谢 Michael Gorven 提交的拉取请求。
这个变化也被回溯到:1.4.45
参考:#8903 - [sqlite] [用例]
增加了对 SQLite 方言中索引中包含的表达式导向的 WHERE 条件的反射支持,类似于 PostgreSQL 方言的方式。感谢 Tobias Pfeiffer 提交的拉取请求。
这个变化也被回溯到:1.4.45
参考:#8804
oracle
- [oracle] [错误]
修复了 Oracle 编译器中FunctionElement.column_valued()
语法不正确的问题,导致COLUMN_VALUE
名称没有正确限定源表。
此更改还被反向移植至:1.4.45
参考:#8945
测试
- [测试] [错误]
修复了 tox.ini 文件中的问题,其中在 tox 4.0 系列对“passenv”的格式进行更改导致 tox 无法正常工作,特别是在 tox 4.0.6 中引发错误。
此更改还被反向移植至:1.4.46 - [测试] [错误]
添加了针对第三方方言的新排除规则unusual_column_name_characters
,可以将其关闭,以防第三方方言不支持具有不寻常字符的列名,例如点、斜杠或百分号,即使名称已正确引用。
此更改还被反向移植至:1.4.46
参考:#9002
2.0.0b4
发布日期:2022 年 12 月 5 日
orm
- [orm] [功能]
添加了一个新参数mapped_column.use_existing_column
以适应单表继承映射的用例,该映射使用一个以上的子类指示相同的列位于超类上。以前可以通过在超类的.__table__
中使用declared_attr()
与定位现有列的方法来实现此模式,但现在已更新为使用mapped_column()
以及 pep-484 类型提示,以一种简单而简洁的方式。
另请参阅
使用 use_existing_column 解决列冲突
参考:#8822 - [orm] [用例]
添加了对自定义用户定义类型的支持,这些类型扩展了 Pythonenum.Enum
基类,以便在使用注释式声明表功能时自动解析为 SQLAlchemy 的Enum
SQL 类型。该功能通过向 ORM 类型映射功能添加的新查找功能实现,并包括对默认生成的Enum
的参数进行更改的支持,以及设置映射中特定的enum.Enum
类型及其特定参数的支持。
另请参阅
在类型映射中使用 Python Enum 或 pep-586 字面类型
参考:#8859 - [orm] [用例]
为相关的 ORM 属性构造(包括mapped_column()
,relationship()
等)添加了mapped_column.compare
参数,以提供 Python 数据类field()
的compare
参数,当使用声明性数据类映射功能时。感谢 Simon Schiele 的拉取请求。
参考:#8905 - [orm] [性能] [bug]
在 ORM 启用的 SQL 语句中进一步增强了性能,特别针对在构造 ORM 语句时的调用计数,使用aliased()
与union()
和类似“复合”结构的组合,以及对 ORM 频繁使用的corresponding_column()
内部方法的直接性能改进,例如aliased()
和类似构造。
参考:#8796 - [orm] [bug]
修复了在列基础属性的Mapped
注释中使用未知数据类型时静默失败而不是报告异常的问题;现在会引发一个信息性异常消息。
参考:#8888 - [orm] [bug]
修复了一系列问题,涉及与字典类型一起使用Mapped
的情况,例如Mapped[Dict[str, str] | None]
,在声明性 ORM 映射中将不会被正确解释。已修复以正确“去可选化”此类型的支持,包括用于在type_annotation_map
中查找的支持。
参考:#8777 - [orm] [bug]
在声明性数据类映射功能中修复了一个 bug,该 bug 导致在映射中使用带有__allow_unmapped__
指令的普通数据类字段时,不会为这些字段创建具有正确类级状态的数据类,不适当地在数据类自身已经用类级默认值替换Field
对象后将原始Field
对象复制到类中。
参考:#8880 - [orm] [bug] [回归]
修复了一个回归问题,即刷新映射到子查询的映射类时(例如直接映射或某些形式的具体表继承),如果使用了Mapper.eager_defaults
参数,将会失败。
参考:#8812 - [ORM] [错误]
修复了 2.0.0b3 中的一个回归问题,由 #8759 导致,其中使用限定名称(如sqlalchemy.orm.Mapped
)指示Mapped
名称将无法被 Declarative 认为指示Mapped
结构。
参考:#8853
ORM 扩展
- [用例] [ORM 扩展]
增加了对association_proxy()
扩展函数的支持,以在 Pythondataclasses
配置中参与,使用了声明性数据类映射中描述的原生数据类功能。包括属性级参数,包括association_proxy.init
和association_proxy.default_factory
。
关联代理的文档也已更新,以在示例中使用 “带注解的声明性表格” 表单,包括用于AssocationProxy
本身的类型注解。
参考:#8878
SQL
- [SQL] [用例]
添加了ScalarValues
,可用作列元素,允许在IN
子句中使用Values
,或与ANY
或ALL
集合聚合一起使用。此新类是使用方法Values.scalar_values()
生成的。当在IN
或NOT IN
操作中使用时,现在会将Values
实例强制转换为ScalarValues
。
参考:#6289 - [SQL] [错误]
修复了在缓存密钥生成中识别的关键内存问题,其中对于使用大量 ORM 别名和子查询的非常大且复杂的 ORM 语句,缓存密钥生成可能会产生比语句本身大几个数量级的大密钥。非常感谢 Rollo Konig Brock 在最终确定此问题方面的非常耐心和长期的帮助。
此更改也回溯到:1.4.44
参考:#8790 - [sql] [bug]
numeric
pep-249 paramstyle 的方法已被重写,并且现在得到了完全支持,包括“扩展 IN”和“insertmanyvalues”等功能。参数名称也可以在源 SQL 构造中重复,这将在数值格式内正确表示为单个参数。引入了一个名为numeric_dollar
的附加数值 paramstyle,它是由 asyncpg 方言使用的; 该 paramstyle 等效于numeric
,只是数字指示器使用美元符号而不是冒号。asyncpg 方言现在直接使用numeric_dollar
paramstyle,而不是首先编译为format
样式。numeric
和numeric_dollar
paramstyles 假设目标后端能够以任何顺序接收数字参数,并将给定的参数值与语句匹配,基于将它们的位置(从 1 开始)与数字指示器进行匹配。这是numeric
paramstyles 的正常行为,尽管观察到 SQLite DBAPI 实现了一个不使用的numeric
样式,它不遵守参数排序。
参考:#8849 - [sql] [bug]
调整了RETURNING
的渲染,特别是在使用Insert
时,现在会像Select
构造一样渲染列,以生成标签,其中将包括消除歧义的标签,以及将命名列周围的 SQL 函数标记为列名本身。这在从Select
构造或使用UpdateBase.returning()
的 DML 语句中选择行时建立了更好的跨兼容性。1.4 系列还做了一项较窄的范围更改,仅调整了函数标签问题。
参考:#8770
架构
- [schema] [bug]
对于将Column
对象附加到Table
对象,现在有更严格的规则,将一些先前的弃用警告转移到异常,并阻止一些先前可能导致表中出现重复列的情况,当设置Table.extend_existing
为True
时,无论是在编程式Table
构建还是在反射操作期间。
请参阅相同名称、键的表对象中列替换规则更严格以了解这些更改的概述。
另请参阅
相同名称、键的表对象中列替换规则更严格
参考:#8925
类型
- [类型] [用例]
添加了一个新类型SQLColumnExpression
,可以在用户代码中表示任何 SQL 列导向表达式,包括基于ColumnElement
和 ORMQueryableAttribute
的表达式。这个类型是一个真正的类,而不是别名,因此也可以用作其他对象的基础。另外还包括了一个额外的 ORM 特定子类SQLORMExpression
。
参考:#8847 - [类型] [错误]
调整了内部对 Pythonenum.IntFlag
类的使用,该类在 Python 3.11 中改变了其行为契约。这并没有导致运行时失败,但导致了在 Python 3.11 下的类型运行失败。
参考:#8783 - [类型] [错误]
sqlalchemy.ext.mutable
扩展和sqlalchemy.ext.automap
扩展现在完全符合 pep-484 类型标准。非常感谢 Gleb Kisenkov 在这方面的努力。
参考:#6810, #8667 - [类型] [错误]
修正了对relationship.secondary
参数的类型支持,该参数也可以接受返回FromClause
的可调用对象(lambda)。 - [类型] [错误]
改进了sessionmaker
和async_sessionmaker
的类型,使得它们的返回值的默认类型将会是Session
或AsyncSession
,而无需明确指定此类型。以前,Mypy 无法从其泛型基类自动推断出这些返回类型。
这次更改的一部分是,对于Session
、AsyncSession
、sessionmaker
和async_sessionmaker
的参数除了初始的“bind”参数之外,已经被设置为关键字参数,其中包括一直以来都被记录为关键字参数的参数,比如Session.autoflush
、Session.class_
等。
感谢 Sam Bull 提交的拉取请求。
参考:#8842 - [typing] [bug]
修复了将返回列元素可迭代对象的可调用函数传递给relationship.order_by
时在类型检查器中标记为错误的问题。
参考:#8776
postgresql
- [postgresql] [usecase]
作为 #8690 的补充,新增了诸如Range.adjacent_to()
、Range.difference()
、Range.union()
等方法到 PG 特定的范围对象中,使其与底层AbstractRange.comparator_factory
实现的标准操作保持一致。
此外,类的__bool__()
方法已校正,以与常见的 Python 容器行为以及其他流行的 PostgreSQL 驱动程序相一致:现在它告诉范围实例是否不为空,而不是相反。
拉取请求由 Lele Gaifax 提供。
参考:#8765 - [postgresql] [change] [asyncpg]
将 asyncpg 使用的 paramstyle 从format
更改为numeric_dollar
。这有两个主要好处,因为它不需要对语句进行额外处理,并且允许语句中存在重复的参数。
参考:#8926 - [postgresql] [bug] [mssql]
仅针对 PostgreSQL 和 SQL Server 方言,调整了编译器,以便在渲染 RETURNING 子句中的列表达式时,建议使用 SELECT 语句中使用的“非匿名”标签作为 SQL 表达式元素的标签;主要示例是可能作为列类型的一部分发出的 SQL 函数,其中标签名称默认应与列名称匹配。这恢复了一个在 1.4.21 版本中由于#6718,#6710而改变的不好定义的行为。Oracle 方言具有不同的 RETURNING 实现,不受此问题的影响。版本 2.0 对其他后端广泛扩展的 RETURNING 支持进行了全面变更。
此更改还反向移植到:1.4.44
参考:#8770 - [postgresql] [bug]
对新的 PostgreSQLRange
类型进行了额外的类型检测,以前允许直接通过 DBAPI 接收 psycopg2 原生范围对象的情况已停止工作,因为现在我们有了自己的值对象。Range
对象已得到增强,以便 SQLAlchemy 核心在其他模糊情况下检测到它(例如与日期的比较),并应用适当的绑定处理程序。拉取请求由 Lele Gaifax 提供。
参考:#8884
mssql
- [mssql] [bug]
由#8177的组合引起的回归,重新启用了 setinputsizes 用于 SQL 服务器,除非使用 fast_executemany + DBAPI executemany 用于语句,以及#6047,实现了“insertmanyvalues”,该值绕过了 DBAPI executemany,而是使用 INSERT 语句的自定义 DBAPI execute。如果打开 fast_executemany,setinputsizes 将不会用于使用“insertmanyvalues”的多个参数集 INSERT 语句,因为检查将错误地假设这是一个 DBAPI executemany 调用。然后,“回归”的问题就是,“insertmanyvalues”语句格式显然对于不使用相同类型的多行特别敏感,因此在这种情况下,尤其需要 setinputsizes。
修复了 fast_executemany 检查,使其仅在使用 true DBAPI executemany 时禁用 setinputsizes。
参考:#8917
oracle
- [oracle] [bug]
对 Oracle 修复#8708的持续修复,在 1.4.43 中发布,其中以下划线开头的绑定参数名称(Oracle 不允许的)仍然未在所有情况下正确转义。
此更改也反向移植到:1.4.45
参考:#8708
测试
- [tests] [bug]
修复了测试套件中--disable-asyncio
参数的问题,该参数实际上无法禁止运行 greenlet 测试,并且也无法阻止套件在整个运行过程中使用“wrapping” greenlet。此参数现在确保在设置时不会在整个运行期间发生 greenlet 或 asyncio 使用。
此更改也反向移植到:1.4.44
参考:#8793
2.0.0b3
发布日期:2022 年 11 月 4 日
orm
- [orm] [bug]
修复了在连接式预加载中出现断言失败的问题,在使用特定外/内连接式预加载组合时会出现断言失败,在跨三个映射器进行预加载时,中间映射器是一个继承的子类映射器。
此更改也反向移植到:1.4.43
参考:#8738 - [orm] [bug]
修复了涉及Select
构造的错误,其中Select.select_from()
与Select.join()
的组合,以及在使用Select.join_from()
时,会导致with_loader_criteria()
功能以及单表继承查询所需的 IN 条件在查询的列子句没有明确包含 JOIN 左侧实体时不会呈现。现在,正确的实体已传递给内部生成的Join
对象,以便正确添加对左侧实体的条件。
此更改也回溯到:1.4.43
参考:#8721 - [orm] [bug]
当with_loader_criteria()
选项作为特定“加载器路径”添加的加载器选项时,现在会引发一个信息性异常,例如在Load.options()
中使用它时。这种用法不受支持,因为with_loader_criteria()
只打算用作顶级加载器选项。以前会生成内部错误。
此更改也回溯到:1.4.43
参考:#8711 - [orm] [bug]
为Session.get()
改进了“字典模式”,以便可以在命名字典中指示引用主键属性名称的同义词名称。
此更改也回溯到:1.4.43
参考:#8753 - [orm] [bug]
修复了继承映射器的“selectin_polymorphic”加载不会正确工作的问题,如果Mapper.polymorphic_on
参数引用的 SQL 表达式不直接映射到类上。
此更改也回溯到:1.4.43
参考:#8704 - [orm] [bug]
修复了当使用Query
对象作为迭代器时,如果在迭代过程中出现用户定义的异常情况,则底层的 DBAPI 游标不会被关闭的问题。当使用Query.yield_per()
来创建服务器端游标时,这会导致通常与 MySQL 相关的服务器端游标不同步的问题,并且由于无法直接访问Result
对象,最终用户的代码无法访问游标以关闭它。
为了解决这个问题,在迭代器方法中应用了对GeneratorExit
的捕获,这样当迭代器被中断时将关闭结果对象,并且按定义将被 Python 解释器关闭。
作为针对 1.4 系列实现的这一变化的一部分,确保了在所有Result
实现上都提供了.close()
方法,包括ScalarResult
、MappingResult
。这一变化的 2.0 版本还包括了用于与Result
类一起使用的新上下文管理器模式。
这一变化也被回溯到了:1.4.43
参考:#8710
orm 声明式
- [orm] [declarative] [bug]
在 ORM 声明式注释中为relationship()
指定的类名添加了支持,以及为Mapped
符号本身的名称,使其与直接的类名不同,以支持诸如将Mapped
导入为from sqlalchemy.orm import Mapped as M
,或者相关类名以类似方式导入为替代名称的情况。此外,作为relationship()
的主参数给定的目标类名将始终优先于左手注释中给定的名称,以便仍然可以在注释中使用否则无法导入的名称,而且这些名称也不与类名匹配。
参考:#8759 - [orm] [declarative] [bug]
改进对使用注释的遗留 1.4 映射的支持,这些注释不包括Mapped[]
,通过确保__allow_unmapped__
属性可以用于允许这些遗留注释通过 Annotated Declarative 而不引发错误,并且不在 ORM 运行时上下文中被解释。此外,当检测到这种情况时改进了生成的错误消息,并为应该如何处理这种情况添加了更多文档。不幸的是,1.4 WARN_SQLALCHEMY_20 迁移警告不能在运行时使用当前架构检测到这个特定的配置问题。
参考:#8692 - [orm] [declarative] [bug]
改变了Mapper
的一个基本配置行为,其中在Mapper.properties
字典中显式存在的Column
对象,无论是直接还是包含在映射器属性对象内部,现在都将在映射的Table
(或其他可选择的)本身中以它们出现的顺序进行映射(假设它们实际上是该表的列列表的一部分),从而保持在映射的可选择上的列的顺序与在映射类中操纵的顺序相同,以及在 ORM SELECT 语句中为该映射器渲染的内容相同。以前(“以前”意味着自版本 0.0.1 以来),在Mapper.properties
字典中的Column
对象总是会首先映射,超过了在映射的Table
中其他列的映射,导致在映射器分配属性给映射类时的顺序以及它们在语句中呈现的顺序之间存在差异。
此更改最显著地发生在声明式将声明的列分配给Mapper
的方式上,特别是在处理具有 DDL 名称明确不同于映射属性名称的Column
(或mapped_column()
)对象以及使用deferred()
等构造时。新行为将使映射的Table
中的列顺序与属性映射到类中的顺序相同,由Mapper
本身分配,并在 ORM 语句(如 SELECT 语句)中呈现,独立于Column
针对Mapper
的配置方式。
参考:#8705 - [orm] [declarative] [bug]
修复了新数据类映射功能中的问题,其中在某些情况下,在继承子类的构造函数中,声明在声明基类/抽象基类/混合类上的列会泄漏。
参考:#8718 - [bug] [orm declarative]
修复了声明式类型解析器(即解析ForwardRef
对象的解析器)中的问题,其中在一个特定的源文件中为列声明的类型在最终映射的类位于另一个源文件时会引发NameError
。现在,这些类型是根据每个类所在的模块来解析的。
参考:#8742
引擎
- [engine] [feature]
为了更好地支持用户定义的异常可能会中断迭代的Result
和AsyncResult
对象的使用情况,现在这两个对象以及诸如ScalarResult
、MappingResult
、AsyncScalarResult
、AsyncMappingResult
等变体都支持上下文管理器的使用,结果将在上下文管理器块的末尾关闭。
另外,确保所有上述提到的Result
对象都包括Result.close()
方法以及Result.closed
访问器,包括以前没有.close()
方法的ScalarResult
和MappingResult
。
另请参阅
结果、AsyncResult 的上下文管理器支持
引用:#8710 - [engine] [用例]
添加了新参数PoolEvents.reset.reset_state
到PoolEvents.reset()
事件中,同时放置了一个将继续接受使用先前一组参数的事件钩子的弃用逻辑。这指示了关于重置正在进行的方式的各种状态信息,并且被用于允许在给定完整上下文的情况下进行自定义重置方案。
在这个改变中,也包括了一个在 1.4 中回溯的修复,该修复重新启用了PoolEvents.reset()
事件,以便在所有情况下继续进行,包括当Connection
已经“重置”连接时。
这两个更改共同允许使用PoolEvents.reset()
事件来实现自定义重置方案,而不是使用PoolEvents.checkin()
事件(其功能与以往一样)。
参考资料:#8717 - [engine] [bug] [regression]
修复了一个问题,即当Connection
关闭并且正在将其 DBAPI 连接返回到连接池时,在某些情况下不会调用PoolEvents.reset()
事件钩子。
当Connection
已经在将连接返回到池的过程中在其 DBAPI 连接上发出.rollback()
时,场景是它随后会指示连接池放弃执行自己的“重置”以节省额外的方法调用。但是,这会阻止在此钩子中使用自定义池重置方案,因为此类钩子根据定义正在执行的不仅仅是调用.rollback()
,而且需要在所有情况下调用。这是在版本 1.4 中出现的一种退化。
对于版本 1.4,PoolEvents.checkin()
仍然可作为用于自定义“重置”实现的备用事件钩子。版本 2.0 将提供一个改进版本的PoolEvents.reset()
,它将被调用用于额外的场景,例如终止 asyncio 连接,并且还传递有关重置的上下文信息,以允许对不同的重置方案作出响应以不同的方式处理不同的重置场景。
此更改也被回溯到:1.4.43
参考资料:#8717
sql
- [sql] [bug]
修复了一个问题,它阻止literal_column()
构造在Select
构造的上下文中正常工作,以及其他可能生成“匿名标签”的地方,如果文字表达式包含可能干扰格式字符串的字符,例如括号,由于“匿名标签”的实现细节。
此更改也被回溯到:1.4.43
参考资料:#8724
typing
- [typing] [bug]
更正了引擎和异步引擎包中的各种类型问题。
postgresql
- [postgresql] [feature]
添加了新方法Range.contains()
和Range.contained_by()
到新的Range
数据对象中,这些方法与 PostgreSQL 的@>
和<@
操作符的行为相同,以及comparator_factory.contains()
和comparator_factory.contained_by()
SQL 操作符方法。感谢 Lele Gaifax 提供的拉取请求。
参考:#8706 - [postgresql] [usecase]
优化了对 PostgreSQL 后端的新 RANGE / MULTIRANGE 支持和更改 中描述的范围对象的新方法,以适应驱动程序特定的范围和多范围对象,更好地适应传统代码以及将结果从原始 SQL 结果集传递回新范围或多范围表达式时。
参考:#8690
mssql
- [mssql] [bug]
修复了与使用 SQL Server 方言的临时表时使用Inspector.has_table()
相关的问题,这会导致某些 Azure 变体上失败,因为不支持那些服务器版本上的一个不必要的信息模式查询。感谢 Mike Barry 提供的拉取请求。
此更改还回溯到:1.4.43
参考:#8714 - [mssql] [bug] [reflection]
修复了与Inspector.has_table()
相关的问题,当对使用 SQL Server 方言的视图使用时,错误地返回False
,这是由于 1.4 系列中的一个回归导致的,该系列在 SQL Server 上删除了对此的支持。这个问题在使用不同反射架构的 2.0 系列中不存在。添加了测试支持,以确保has_table()
符合视图的规范。
此更改还回溯到:1.4.43
参考:#8700
oracle
- [oracle] [bug]
修复了一个问题,其中包含需要在 Oracle 中用引号引起的字符的绑定参数名称,包括那些从同名数据库列自动生成的名称,在使用 Oracle 方言的“扩展参数”时不会被转义,导致执行错误。 Oracle 方言使用的绑定参数的通常“引用”不与“扩展参数”架构一起使用,因此使用了大范围字符的转义,现在使用了一个针对 Oracle 的字符/转义列表。
此更改也回溯到:1.4.43
参考:#8708 - [oracle] [bug]
修复了一个问题,在新的 ORM 类型声明映射中,没有实现在关系配置中使用Optional[MyClass]
或类似形式(例如MyClass | None
)的类型注释的能力,导致错误。 文档还为这种用例添加了关于关系配置的文档。
此更改也回溯到:1.4.43
参考:#8744
2.0.0b2
发布日期:2022 年 10 月 20 日
orm
- [orm] [bug]
移除了在使用 ORM 启用的更新/删除时发出的警告,该警告首次出现在#4073中;这个警告实际上掩盖了一个场景,否则可能会根据实际列而为 ORM 映射的属性填充错误的 Python 值,因此移除了这个不建议使用的情况。在 2.0 中,ORM 启用的更新/删除使用“auto”作为“synchronize_session”,这应该会自动为任何给定的 UPDATE 表达式执行正确的操作。
参考:#8656
orm 声明
- [orm] [declarative] [usecase]
添加了对映射类也是Generic
子类的支持,可以在语句和调用inspect()
时指定为GenericAlias
对象(例如MyClass[str]
)。
参考:#8665 - [orm] [declarative] [bug]
改进了DeclarativeBase
类,以便与其他混入类(如MappedAsDataclass
)结合使用时,类的顺序可以是任意顺序。
参考:#8665 - [orm] [declarative] [bug]
修复了一个问题,在新的 ORM 类型声明映射中,没有实现在关系配置中使用Optional[MyClass]
或类似形式(例如MyClass | None
)的类型注释的能力,导致错误。 文档还为这种用例添加了关于关系配置的文档。
参考:#8668 - [orm] [declarative] [bug]
修复了新的 dataclass 映射功能中的问题,当处理覆盖mapped_column()
声明的混入时,传递给 dataclasses API 的参数有时可能被错误排序,导致初始化问题。
参考:#8688
sql
- [sql] [bug] [regression]
修复了新的“insertmanyvalues”功能中的 bug,其中包含使用bindparam()
的子查询的 INSERT 在“insertmanyvalues”格式中无法正确呈现的问题。这直接影响了 psycopg2,因为“insertmanyvalues”在此驱动程序中无条件使用。
参考:#8639
类型
- [typing] [bug]
修复了 pylance 严格模式下报告“实例变量覆盖类变量”的类型问题,当使用方法定义__tablename__
、__mapper_args__
或__table_args__
时。
参考:#8645 - [typing] [bug]
修复了 pylance 严格模式下报告“部分未知”数据类型的mapped_column()
构造的类型问题。
参考:#8644
mssql
- [mssql] [bug]
由于 SQL Server pyodbc 更改 #8177 引起的回归问题已修复,现在默认使用setinputsizes()
;对于 VARCHAR,如果字符大小大于 4000(或 2000,取决于数据),则会失败,因为传入的数据类型是 NVARCHAR,其限制为 4000 个字符,尽管 VARCHAR 可以处理无限字符。 当数据类型的大小> 2000 个字符时,现在还将传递额外的 pyodbc 特定的类型信息给setinputsizes()
。 这个更改也适用于受此问题影响的JSON
类型,用于大型 JSON 序列化。
参考:#8661 - [mssql] [bug]
Sequence
构造恢复到了 1.4 系列之前的 DDL 行为,即创建一个没有额外参数的Sequence
将会发出一个简单的CREATE SEQUENCE
指令,没有任何额外的“起始值”参数。对于大多数后端来说,无论如何,这都是之前的工作方式;然而,对于 MS SQL Server,此数据库上的默认值是-2**63
;为了防止这个通常不实用的默认值在 SQL Server 上生效,应该提供Sequence.start
参数。由于对于多年以来一直在IDENTITY
上标准化的 SQL Server 来说,对Sequence
的使用是不寻常的,希望这个变化影响最小。
另请参阅
Sequence 构造不再具有任何显式默认的 “start” 值;影响 MS SQL Server
参考:#7211
SqlAlchemy 2.0 中文文档(五十八)(4)https://developer.aliyun.com/article/1563136