新闻和更新
SQLAlchemy 2.0.1 发布
2023年2月1日 永久链接
SQLAlchemy 2.0.1 版本现已发布。
2.0 版本的发布受到了热烈欢迎,每日下载量(60万次/天)中约有一半流向了 2.0 系列。ORM 声明式注解特性尤其受到关注,2.0 的重点是对这个新系统的改进和修复,以及对主源代码中内联应用的通用 pep-484 类型标注的持续改进和修复。
此版本还修复了新的“批量插入”机制中的一个问题,修复了包含嵌套 CTE 且自身也可能包含 INSERT 语句的复杂 INSERT 语句的编译。
到目前为止,该版本的发布非常顺利,只有少数已被修复的微不足道的回退。
2.0.1 详细的变更日志链接位于 变更日志。
SQLAlchemy 2.0.1 可在下载页面上获取。
SQLAlchemy 2.0.0 发布
2023年1月26日 永久链接
SQLAlchemy 2.0 的首个生产版本 SQLAlchemy 2.0.0 现已发布。
在此版本中,当运行以下命令时,将安装的默认 SQLAlchemy 版本为pip install sqlalchemy将是 2.0 版本。请注意,与 1.4 系列相比,2.0 版本具有重大的 API 更改,因此在 1.x 系列 SQLAlchemy 上运行且尚未完成迁移过程的应用程序应寻求确保 requirements 设置为维护所需的 SQLAlchemy 主要发布系列。
SQLAlchemy 2.0 系列的历史始于四年多前的 2018 年 8 月 8 日,当时提出了一些关于如何统一 SQLAlchemy 的 Core 和 ORM 查询概念的简短想法。第一个真正的“SQLAlchemy 2.0”概念计划于当年 11 月形成,重点关注大幅简化 Core 执行和事务 API 以及寻求统一 Core 和 ORM 之间的查询这两个领域。
基础概念的更改非常巨大,以至于 SQLAlchemy 2.0 分为两个主要阶段。第一阶段是 SQLAlchemy 1.4 系列,它提供了一个全新的统一 Core / ORM SQL 查询系统,所有这些都建立在新的通用语句缓存架构之上。此阶段为 SQLAlchemy 2.0 的 SQL 构建方法提供了完整的实现(减去 pep-484 类型标注支持),同时保留了传统的QueryAPI。与此版本一起发布的是一个全面的迁移路径,其灵感来自 Python 2->3 迁移过程中吸取的教训,其中描述了如何移植应用程序,以便它们可以在 SQLAlchemy 1.4 中继续运行,同时完全向前兼容 SQLAlchemy 2.0。
第二阶段是 SQLAlchemy 2.0 系列,它删除了大部分已弃用的元素,将剩余的元素(主要是Query)降级为长期“遗留”状态,完全转向仅支持 Python 3,同时添加了许多建立在新的架构之上的新特性,充分利用了 Python 3 特性(包括数据类、枚举、内联注解)以及新的统一查询架构。
这种方法的主要优势在于,最重要且风险最高的架构更改,即在新的缓存层之上重写 Core/ORM 查询,已经在 SQLAlchemy 1.4 中生产环境中使用了近两年。因此,虽然 SQLAlchemy 2.0 一旦被所有开发者受众使用,肯定会出现许多新问题,但它们不应该是“基础方法出现新的裂缝”这类问题,因为架构基础已经在广泛使用。我们预计,绝大多数问题都将与新的类型标注系统以及现有应用程序调整为使用新 API 的问题有关。
SQLAlchemy 2.0 是一个足够大的版本,它有两个迁移指南;主要迁移指南文档介绍了如何实现应用程序的 API 兼容性,以便能够在 SQLAlchemy 1.4 或 2.0 中同等运行;SQLAlchemy 2.0 中的新功能?指南然后提供了应用程序在 SQLAlchemy 2.0 上运行时可用的所有新特性和 API。
考虑到以上介绍,以下是 SQLAlchemy 2.0 中全新的顶级要点列表
- 全新的无插件 pep-484 兼容 ORM 语法 - ORM 声明式映射器配置现在有了全新的外观,大量借鉴了 Python 数据类 和 SQLModel 等系统,以提供 注解驱动的 ORM 声明,使用 pep-484 注解的运行时解释来生成完全类型化且与任何类型检查器或 IDE 兼容的映射类。
- 新式和旧式 ORM 查询的 pep-484 支持 - 使用注解声明式模型,您创建的 SQL 构造,例如select()对象或旧式Query构造,本身就类型化为行中返回的列的类型,并且这种类型标注一直延续到从执行查询后返回的结果对象中提取的 Python 值。虽然 Python 类型标注在执行此类操作方面仍然存在局限性,但新的类型标注支持借鉴了 SQLModel 使用的一些技术,因此它在没有额外注解的情况下适用于从 ORM 模型类生成的大多数查询,并且对面向 Core 或混合 Core/ORM 查询的结果集类型化提供不同程度的支持。一些示例位于 SQL 表达式类型标注 - 示例。
- 声明式与 Python 数据类完全集成 - SQLAlchemy 2.0 引入了对将注解声明式映射类直接生成为 Python 数据类 的支持;这将提供一个像任何其他类一样声明的 ORM 映射类,该类具有自动生成的数据类方法,例如__init__(), __repr__(), __eq__()等等。这种 新方法 比 SQLAlchemy 1.4 中引入的临时“混合”方法有了极大的改进。
- 一种全新的、完全 ORM 集成的批量 INSERT 方法,在大多数后端通常速度快一个数量级 - SQLAlchemy 支持的大多数数据库和驱动程序现在都添加或改进了对INSERT RETURNING语法的支持,SQLAlchemy 2.0 利用了这一点,通过支持和改进所有后端的 RETURNING 支持,MySQL 除外(仅限 MySQL;MariaDB 支持 RETURNING)。此改进的一部分是能够在一个批处理语句中 INSERT 数千行,该语句还返回 ORM 所需的服务器生成值的完整结果集,这在以前是不可能的,唯一的例外是依赖于psycopg2驱动程序的临时实现。在 2.0 中,已经完成了优化INSERT的工作,以便 可以使用一次数据库往返插入数千个带或不带主键的 ORM 对象,并且此功能已完全集成到 ORM 中,用于所有 INSERT 操作,包括“常规”ORM 工作单元操作以及“批量”方法,这些方法在 2.0 版本中也进行了新的修订。
- 一种全新的批量优化的模式反射架构 - 一次性反射完整模式的操作,例如MetaData.reflect(engine)以及使用inspect(engine)构造新添加的模式范围操作,现在都建立在假设一次处理数百或数千个表的操作的基础之上,而不是一次处理一个表。方言可以通过提供跨多个表工作的新反射查询来“选择加入”新架构,从而可以更有效地完全反射非常大的模式。新架构已为 PostgreSQL 和 Oracle 后端启用,这两个后端在大型模式方面存在最大的性能问题,其中 PostgreSQL 提高了 250%,Oracle 提高了 900%。SQL Server 方言是新架构的下一个目标。任何第三方方言都可以选择加入新的“一次处理多个表”系统,或保留以前的“一次处理一个表”方法,该方法仍然完全兼容,无需任何更改。
- 原生扩展已移植到 Cython - SQLAlchemy 的 C 扩展已替换为使用 Cython 的更新方法。在大多数情况下,Cython 版本的扩展与以前的 C 扩展一样快,有时甚至更快,并且允许 SQLAlchemy 更轻松地在库的更多领域中提供新的原生扩展,而不会有内存或稳定性问题的风险。
SQLAlchemy 2.0 包含更多特性,并且采用了新的架构,摆脱了许多旧的包袱,希望为未来留出充足的空间。
2.0.0 详细的变更日志链接位于 变更日志 - 请注意,2.0 系列变更日志跨越四个 beta 版和三个候选发布版。
SQLAlchemy 2.0.0 可在下载页面上获取。