本文比较了这三个库的可验证标准——验证理念、异步支持、生态系统成熟度(crates.io 下载量、GitHub 活动)——来源和日期为 2026 年 8 月 23 日。不包含 Aurabase 性能数据:对于这一支柱,请参阅我们的 基准页面,该页面记录了方法而不是简单的数字。
- SQLx 是一个 SQL 工具包,而不是 ORM:没有 DSL,两种模式 - 在编译时检查宏(需要开发数据库)或在运行时构建动态查询。
- Diesel 检查 Rust 类型系统中的查询,而无需在编译时连接到数据库。但是,默认情况下它保持同步(异步通过单独的包
diesel-async)。 - SeaORM 是一种 ActiveRecord 风格的异步 ORM,它将
sqlx/sqlx-core声明为 crates.io 上的可选依赖项。根据配置,它可以作为低级驱动程序完全在 SQLx 上运行。 - Aurabase 在 100% 动态模式下使用 SQLx — 代码中的 532 次查询调用中对
query!宏的调用为零。原因:目标架构随每个请求而变化(通过search_path进行多租户路由)。 - 从绝对意义上来说,这三个都不是“最快的”:真正的标准是你的模式是在编译时固定的还是在运行时决定的。
从 Rust 攻击 Postgres 的三种方法
SQLx、Diesel 和 SeaORM 不是同一工具的三个变体。 SQLx 是一个低级工具包——一个带有可选检查功能的 Postgres 驱动程序。 Diesel 是 Rust 意义上的经典 ORM:SQL 之上的一层类型。 SeaORM 是 Ruby/Python 意义上的 ORM:实体、关系、对象加载。下表列出了可核实的事实,日期均为 2026 年 8 月 23 日。
| 类型 | SQL 工具包(不是 ORM) | 查询生成器 ORM 类型安全 | 异步 ORM,如 ActiveRecord |
|---|---|---|---|
| 检查查询 | 宏编译时(需要开发数据库)或动态 | Rust 类型系统,没有编译时基础 | 运行时——从模式生成的实体 |
| 原生异步 | 是的,项目基础 | 默认情况下否 - 通过单独的柴油异步板条箱 | 是的 |
| 支持的基地 | PostgreSQL、MySQL、SQLite | PostgreSQL、MySQL、SQLite(+第三方 Oracle/Firebird/DuckDB) | PostgreSQL、MySQL、MariaDB、SQLite |
| 当前版本 | 0.9.0 | 2.3.12 | 2.0.2 |
| 下载次数/90 天 | 33,4 M | 6,3 M | 3,8 M |
| GitHub 之星 | 17 405 | 14 159 | 9 870 |
| 许可证 | 阿帕奇-2.0 | 阿帕奇-2.0 | 阿帕奇-2.0 |
版本、下载和星级:crates.io API 和 GitHub API,于 2026 年 8 月 23 日查询。SQLx 存储库在 transact-rs/sqlx (以前称为 launchbadge/sqlx)下跟踪。
过去 90 天内的下载量(以百万计)(crates.io API 的recent_downloads 字段)。资料来源:crates.io,采访于 2026 年 8 月 23 日。
SQL 就是 SQL — 是否经过验证,取决于您
SQLx 将自己描述为“一个异步、纯 Rust SQL 包,具有无需 DSL 的编译时检查查询”(官方自述文件,github.com/transact-rs/sqlx,于 2026 年 8 月 23 日访问)。没有查询生成器,没有实体:您编写 SQL,SQLx 提供两种执行它的方法。
模式 1 需要在 cargo build 时可访问数据库 — 宏连接到它以检查类型。模式 2 没有静态检查,但接受运行时构造的任何 SQL 字符串 — 包括表名。这是 Aurabase 使用的模式(第 06 节)。
支持的运行时:tokio、async-std、actix(本机 TLS 或 rustls)。基础:PostgreSQL、MySQL、MariaDB、SQLite — 自 0.7 版本以来,MSSQL 支持已被删除。该板条箱使用 #![forbid(unsafe_code)] ,不包括 SQLite 集成(官方自述文件,于 2026 年 8 月 23 日访问)。
对模式 1 的常见反对意见:如何在没有可访问的开发基础的情况下构建 CI? sqlx-cli 以离线模式响应(官方 sqlx-cli 文档,于 2026 年 8 月 23 日查阅):
- 在本地,连接开发数据库后,启动
cargo sqlx prepare:每个已验证请求的元数据都写入.sqlx文件夹中。 - 将此
.sqlx文件夹提交到代码旁边的存储库。 - 在 CI 中,定义
SQLX_OFFLINE=true:构建读取版本化元数据,不再尝试连接到真实数据库。
同一工具还管理迁移 (sqlx migrate add / run / revert) — aura-migrations 在 Aurabase 端单独承担的角色。
类型安全的查询构建器,主要是同步的
Diesel 将自己定位为“一个安全、可扩展的 ORM 和 Rust 查询构建器”(官方网站 diesel.rs,访问日期:2026 年 8 月 23 日)。该项目还声称它“消除了编译时数据库交互不正确的可能性”。与 SQLx 的基本区别:Diesel 在 Rust 类型系统本身中检查您的查询,无需在构建时连接数据库。
官方 Diesel 比较页面(2026 年 8 月 23 日访问)本身定位了差异:Diesel“还可以在编译时检查部分查询”。这允许您构建已经验证的动态查询 - Rust 向量上的 IN、批量插入、条件子句。相反,SQLx 的宏“始终需要在编译时了解整个查询”:这三种情况仍然超出了上面看到的模式 1 的范围。
Diesel默认是同步的;异步通过单独的板条箱 diesel-async。同一页报告称,crates.io 团队在切换到diesel-async 的 PostgreSQL 管道后,在其一个端点上测量到了 20% 的增益。该页面表明 SQLx 和 SeaORM 缺少此功能。这是 Diesel 在其自己的网站上关于单一终点的声明,而不是我们复制或概括的独立测量:应如此对待。
Diesel 还包括自己的迁移和模式生成工具(官方自述文件,于 2026 年 8 月 23 日访问)。 diesel migration run 应用版本化 SQL 文件。 diesel print-schema 重新生成描述表的 Rust 模块 schema.rs — 类型安全查询构建器的其余部分随后使用该部分来检查编译时查询。
像 ActiveRecord 这样的异步 ORM,通常构建在 SQLx 上
SeaORM 将自己描述为“Rust 的异步动态 ORM”(官方网站 sea-ql.org/SeaORM,于 2026 年 8 月 23 日访问),其 ActiveModel 模型受到 Ruby/Python/Node ORM 的启发。 1-1、1-N、M-N 和自引用关系,通过连接或数据加载器智能加载,可以通过 sea-orm-cli从现有数据库生成实体。验证是在运行时完成的,而不是在编译时完成的。
经常被忽视的一点:SeaORM并不总是SQLx的替代品,有时它是顶层的两层。 SQL 生成通过 sea-query,它自己的动态查询生成器。它是 sea-orm 2.0.2 的非可选依赖项(crates.io 描述:“适用于 MySQL、Postgres 和 SQLite 的动态查询构建器”,2026 年 8 月 23 日验证)。执行经过 sqlx/sqlx-core 和 sea-query-sqlx — 三个声明为可选的依赖项,由功能激活(sqlx-postgres等 — crates.io API,2026 年 8 月 23 日验证)。具体来说:选择带有标准 Postgres 后端的 SeaORM 意味着在 SQLx 之上添加查询构建器和实体/关系,而不是替换它。
迁移遵循相同的专用工具逻辑:sea-orm-cli migrate generate/up/down 管理架构版本控制。 然后,sea-orm-cli generate entity 从更新的数据库重新生成实体文件 — 模式到代码的往返过程更接近 diesel print-schema,而不是 SQLx 的动态模式。
SeaORM 在其自己的主页上声称“每周下载量超过 25 万次”(自我报告来源,2026 年 8 月 23 日访问)。该数字与通过 crates.io API 独立测量的 90 天内 380 万次下载量一致。
何时选择 SQLx、Diesel 或 SeaORM
如果...选择 SQLx
- 架构在执行时决定(多租户、动态内省)
- 您想要靠近 SQL,而不需要学习 DSL
- 不可协商的本机异步
如果...选择柴油机
- 稳定的架构,在构建时已知
- 推送静态验证,无需数据库连接到编译时
- 可接受默认同步,或用于管道传输的柴油异步
如果...选择 SeaORM
- ActiveRecord 人体工程学:关系、对象图
- 从现有数据库生成的实体
- 在 SQL 驱动程序之上多一层抽象是没有问题的
代码显示的内容:100% 动态模式下的 SQLx
Aurabase Cargo 工作区引脚 sqlx = "0.8" 具有 postgres、 runtime-tokio-rustls、 uuid、 chrono、 json、 derive 和 rust_decimal功能。 aura-db 和 aura-db-adapters 服务直接依赖于它(已在 Cargo.toml 存储库中验证,2026 年 8 月 23 日)。
比依赖行更重要的是: 在此代码中没有调用宏 sqlx::query! 或 query_as! (出现 0 次),而对动态形式 sqlx::query()/query_as()的调用有 532 次。原因是建筑方面的,而不是风格偏好。每个 Aurabase 项目都存在于自己的 Postgres 架构中,由 SET LOCAL search_path在登录时解析。查询的表名称在 HTTP 请求中到达,而不是在编译的二进制文件中。
连接池本身仍然是标准 SQLx:libs/aura-db-adapters 通过 PgPoolOptions::new() 打开其池(在 postgres/mod.rs中验证,2026 年 8 月 23 日),在此级别没有专有覆盖。上面的专有内容是:租户路由、注入动态 SQL 的表标识符的验证以及 WHERE子句/PostgREST 兼容过滤器的构造。
Diesel 的静态验证模型在编译二进制文件时假定已知模式。相反:单个二进制文件为每个项目提供无限数量的模式,在运行时发现。 SeaORM 的实体生成对固定模式做出了相同的假设。这并不是对 SQLx 与 Diesel 的绝对判定 — 这是一种架构选择:构建时已知的模式与运行时解析的模式。有关每个项目架构分区和相关 RLS 策略的详细信息,请参阅我们的 数据库文档 和 RLS 指南。
Aurabase 今天没有发布任何在其自己的生产负载上比较 SQLx、Diesel 和 SeaORM 的延迟数据。引言中引用的我们的基准页面记录了该支柱所使用的方法——而不是简单的数字。
我们最常被问到的问题
没有普遍的赢家
SQLx、Diesel 和 SeaORM 满足三种不同的需求,而不是同一个讲台上的三个位置。 Diesel 会尽早检查您事先知道的模式。如果您接受多一层抽象(通常是在 SQLx 本身之上),SeaORM 可以节省您在对象可用性方面的时间。 SQLx 仍然是三者中最简单的:这就是它适合仅在运行时才知道的模式的原因,例如aura-db多租户路由。
如果您要将现有项目迁移到 Postgres,并且正在寻找 RLS 架构和策略方面的真正变化,我们的 迁移指南 Supabase → Aurabase 详细介绍了该主题。