功能和哲学
关于 SQLAlchemy 的概述。
SQLAlchemy 的关键功能
一些关键功能一览
- 无需 ORM
-
SQLAlchemy 由两个不同的组件组成,分别称为 核心 和 ORM。 核心本身就是一个功能齐全的 SQL 抽象工具包,它为各种 DBAPI 实现和行为提供了一个平滑的抽象层,并提供了一种 SQL 表达式语言,允许通过生成性的 Python 表达式来表达 SQL 语言。 一个可以同时发出 DDL 语句和反向解析现有模式的模式表示系统,以及一个允许将任何 Python 类型映射到数据库类型的类型系统,完善了整个系统。 然后,对象关系映射是一个可选的包,它建立在核心之上。 许多应用程序都是严格基于核心构建的,使用 SQL 表达式系统来提供对数据库交互的简洁而精确的控制。
- 成熟、高性能的架构
-
经过七年的不断开发、分析和重构,该工具包已经成为一个高性能、准确、测试覆盖率高、部署在数千个环境中的工具包。 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 语句编译和事务服务等元素可以相互独立使用,也可以通过各种插件点进行扩展。 集成的事件系统允许在超过 50 个交互点注入自定义代码,包括核心语句执行、模式生成和反向解析、连接池操作、对象关系配置、持久化操作、属性变异事件和事务阶段。 可以构建和无缝集成新的 SQL 表达式元素和自定义数据库类型。
- 映射和类设计分离
-
ORM 在“声明式”配置系统上进行了标准化,该系统允许与它们映射到的表元数据内联构建用户定义的类,这与大多数其他对象关系工具提供的相同方式。 但是,此系统完全是可选的——从本质上讲,ORM 将用户定义的类、关联的表元数据以及二者的映射视为完全独立的。 通过使用
mapper()
函数,任何任意 Python 类都可以映射到数据库表或视图。 映射的类还保留了可序列化性(腌制),以便用于各种缓存系统。 - 急切加载和缓存相关对象和集合
-
ORM 一旦加载就会缓存对象之间的集合和引用,因此无需在每次访问时发出 SQL。 急切加载功能允许通过少量或仅一个查询加载由集合和引用链接的整个对象图,可以在每个映射或每个查询的基础上配置为确切的语句数量,而无需对现有查询进行任何更改。 过去,ORM 需要为集合中的所有对象发出单独的语句,而“N+1”问题已随着 SQLAlchemy 的出现而成为过去。
- 复合(多列)主键
-
在 SQLAlchemy 中,主键和外键表示为一组列;真正的复合行为是从头开始实现的。 ORM 对有意义的(非代理)主键提供了工业级支持,包括可变性和与 ON UPDATE CASCADE 的兼容性,以及对其他常见复合 PK 模式(如“关联”对象(具有附加到每个关联的额外含义的多对多关系))的显式支持。
- 自引用对象映射
-
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 支持