功能和理念

SQLAlchemy 是关于什么的概述。

SQLAlchemy 的主要功能

一些主要功能一览

无需 ORM

SQLAlchemy 由两个不同的组件组成,称为 CoreORM。 Core 本身是一个功能齐全的 SQL 抽象工具包,为各种 DBAPI 实现和行为提供了一个平滑的抽象层,以及一种 SQL 表达式语言,允许通过生成式 Python 表达式来表达 SQL 语言。一个可以发出 DDL 语句以及自省现有模式的模式表示系统,以及一个允许将 Python 类型映射到数据库类型的类型系统,完善了这个系统。对象关系映射器是建立在 Core 之上的一个可选包。许多应用程序完全基于 Core 构建,使用 SQL 表达式系统来提供对数据库交互的简洁而精确的控制。

成熟、高性能的架构

经过七年多的不断开发、性能分析和重构,SQLAlchemy 工具包变得高性能、准确,测试覆盖率高,并部署在数千个环境中。几乎每个主要组件都经历了第二次或第三次全面迭代,SQLAlchemy 0.6 的速度大约是几年前旧版本 0.4 的两倍,并且版本 0.7 和 0.8 继续改进。其原始执行速度与同类工具相比具有竞争力,并且高级 ORM 功能(如其工作单元、内存集合、通过连接或二级子查询进行集合的预加载以及其他优化)使 SQLAlchemy 的 ORM 能够发出比以往任何版本更少且更高效的查询。

DBA 认可

旨在符合 DBA 的需求,包括能够将生成的 SQL 替换为手工优化的语句,对所有字面值完全使用绑定参数,使用工作单元模式完全事务化和批处理数据库写入。所有对象关系模式都围绕正确的使用引用完整性而设计,并且外键是其使用的组成部分。

非教条主义

SQLAlchemy 最重视的是不妨碍数据库和应用程序架构。与许多工具不同,它从不“生成”模式(不要与发出用户定义的 DDL 混淆,这方面它非常出色)或依赖任何类型的命名约定。SQLAlchemy 在合理可能的范围内支持最广泛的数据库和架构设计。

工作单元

工作单元系统是 SQLAlchemy 对象关系映射器 (ORM) 的核心部分,它将待处理的插入/更新/删除操作组织到队列中,并将它们全部一次性刷新。为了实现这一点,它对队列中所有修改过的项目执行拓扑“依赖排序”,以便尊重行间依赖关系,并将冗余语句分组在一起,在某些情况下甚至可以进一步批处理。这产生了最高的效率和事务安全性,并最大限度地减少了死锁的机会。以 Fowler 的“工作单元”模式 以及 Hibernate(Java 领先的对象关系映射器)为模型。

基于函数的查询构建

基于函数的查询构建允许通过 Python 函数和表达式构建 SQL 子句。可能的全部范围包括布尔表达式、运算符、函数、表别名、可选择的子查询、插入/更新/删除语句、相关更新、选择和 EXISTS 子句、UNION 子句、内连接和外连接、绑定参数以及表达式中自由混合的字面文本。构造的表达式可以针对任意数量的供应商数据库实现(例如 PostgreSQL 或 Oracle)进行编译,这由实现提供的“方言”和“编译器”的组合决定。

模块化和可扩展

SQLAlchemy 的不同部分可以独立于其余部分使用。连接池、SQL 语句编译和事务服务等元素可以彼此独立使用,也可以通过各种插件点进行扩展。集成的事件系统允许在超过五十个交互点注入自定义代码,包括核心语句执行、模式生成和自省、连接池操作、对象关系配置、持久化操作、属性突变事件和事务阶段。可以构建新的 SQL 表达式元素和自定义数据库类型并无缝集成。

分离映射和类设计

ORM 标准化了一个“声明式”配置系统,该系统允许用户定义的类与其映射到的表元数据内联构建,这与大多数其他对象关系工具提供的方式相同。然而,此系统是完全可选的 - 在其核心,ORM 认为用户定义的类、关联的表元数据以及两者的映射是完全分离的。通过使用 mapper() 函数,任何任意的 Python 类都可以映射到数据库表或视图。映射的类还保留了序列化能力(pickle),以便在各种缓存系统中使用。

相关对象和集合的预加载和缓存

ORM 在加载后缓存对象之间的集合和引用,因此每次访问都不需要发出 SQL。预加载功能允许通过少量或仅一个查询加载由集合和引用链接的整个对象图,可以根据每个映射或每个查询配置到精确的语句计数,而无需更改现有查询。 “N+1”问题,即 ORM 需要为集合中的所有对象发出单独的语句,在 SQLAlchemy 中已成为过去。

复合(多列)主键

在 SQLAlchemy 中,主键和外键表示为列的集合;真正的复合行为是从头开始实现的。ORM 对有意义的(非代理)主键具有工业级强度支持,包括可变性和与 ON UPDATE CASCADE 的兼容性,以及对其他常见复合主键模式(例如“关联”对象(具有附加到每个关联的额外含义的多对多关系))的显式支持。

自引用对象映射

ORM 支持自引用映射。可以创建、保存和删除邻接表结构,并具有适当的级联,除了非自引用结构之外,没有额外的代码开销。任何深度的自引用结构的加载都可以进行调整,以通过一系列连接(即 joinedload)通过单个语句递归加载集合,或者通过多个语句加载,其中每个语句在不同的深度级别加载完整的记录集(即 subqueryload)。本地支持使用“后更新”功能,对具有相互依赖的外键对(即“多 x”/“一个特定 x”)的表的持久化也得到本地支持。

继承映射
显式支持单表、具体表和连接表继承。多态加载(即返回多种后代类型的对象的查询)支持所有三种样式。可以优化每种加载,以便仅使用一次往返来完全加载多态结果集。
原始 SQL 语句映射

SQLA 的对象关系查询工具可以容纳原始 SQL 语句以及普通结果集,并且可以从这些结果生成对象实例,方式与任何其他 ORM 操作相同。您或您的 DBA 可以想出的任何超优化查询,都可以在 SQLAlchemy 中运行,并且只要它在行集中返回预期的列,就可以从中获取对象。也可以使用表示多种对象的语句,结果可以接收为命名元组,或者将依赖对象路由到父对象上的集合中。

数据预处理和后处理

类型系统允许在绑定参数和结果集级别对数据进行预处理和后处理。用户定义的类型可以与内置类型自由混合。通用类型以及 SQL 特定类型均可用。

支持的平台

SQLAlchemy 支持 Python 3.7+ 和 Pypy。

支持的数据库

SQLAlchemy 包括用于 SQLite、Postgresql、MySQL 和 MariaDB、Oracle 和 MS-SQL 的方言,其中大多数支持多个 DBAPI。SQLAlchemy 支持同步和异步驱动程序,允许与 asyncio 一起使用。其他方言作为外部项目发布。需要相应的 DB-API 2.0 实现(有时是多个可用实现之一)才能使用每个特定的数据库。 查看当前 DBAPI 支持