PROD欧洲主权BaaS平台打开仪表板 →

性能 · 10 最小读取值

SQLx、Diesel 与 SeaORM 的快速 Rust 后端

Affane Daylami · Fondateur · 2026年6月29日

返回博客

SQLx、Diesel 和 SeaORM 没有回答同一个问题。 SQLx 是一个异步 SQL 工具包,没有 DSL:您编写 SQL,如果需要的话可以在编译时检查。 Diesel 是一个类型安全、主要是同步的查询构建器,可以根据 Rust 类型系统检查您的查询。 SeaORM 是一种异步 ActiveRecord 风格的 ORM — 并且通常在内部依赖于 SQLx。 Aurabase aura-db 服务使用 SQLx。这就是为什么,有代码来支持它——以及为什么这个选择不一定是你的。

该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。

本文比较了这三个库的可验证标准——验证理念、异步支持、生态系统成熟度(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、SQLitePostgreSQL、MySQL、SQLite(+第三方 Oracle/Firebird/DuckDB)PostgreSQL、MySQL、MariaDB、SQLite
当前版本0.9.02.3.122.0.2
下载次数/90 天33,4 M6,3 M3,8 M
GitHub 之星17 40514 1599 870
许可证阿帕奇-2.0阿帕奇-2.0阿帕奇-2.0

版本、下载和星级:crates.io API 和 GitHub API,于 2026 年 8 月 23 日查询。SQLx 存储库在 transact-rs/sqlx (以前称为 launchbadge/sqlx)下跟踪。

crates.io 在过去 90 天内的下载量,由 Postgres Access Rust 库提供SQLx33.4 M柴油机6.3 M海ORM3.8 M

过去 90 天内的下载量(以百万计)(crates.io API 的recent_downloads 字段)。资料来源:crates.io,采访于 2026 年 8 月 23 日。

#
SQLx

SQL 就是 SQL — 是否经过验证,取决于您

SQLx 将自己描述为“一个异步、纯 Rust SQL 包,具有无需 DSL 的编译时检查查询”(官方自述文件,github.com/transact-rs/sqlx,于 2026 年 8 月 23 日访问)。没有查询生成器,没有实体:您编写 SQL,SQLx 提供两种执行它的方法。

SQLx 示例(通用,不包括 Aurabase 代码)rust
// 模式 1 — 编译时宏:根据真实的开发数据库进行检查
let user = sqlx::query_as!(User, "SELECT id, email FROM users WHERE id = $1", user_id)
    .fetch_one(&pool)
    .await?;

// 模式 2 — 动态:表/列在运行时决定
let sql = format!("SELECT * FROM {table} WHERE id = $1");
let row = sqlx::query(&sql).bind(user_id).fetch_one(&pool).await?;

模式 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 日查阅):

  1. 在本地,连接开发数据库后,启动 cargo sqlx prepare:每个已验证请求的元数据都写入 .sqlx文件夹中。
  2. 将此 .sqlx 文件夹提交到代码旁边的存储库。
  3. 在 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 — 类型安全查询构建器的其余部分随后使用该部分来检查编译时查询。

#
海ORM

像 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 兼容过滤器的构造。

简化的架构 - 每个项目的 search_pathrust
// 目标架构由查询解析,在构建时未知
sqlx::query("SET LOCAL search_path TO $1, public")
    .bind(project_schema)
    .execute(&mut *tx).await?;

// 表/列由动态 REST 层决定(PostgREST 兼容)
let sql = format!("SELECT * FROM {} WHERE {}", table, where_clause);

Diesel 的静态验证模型在编译二进制文件时假定已知模式。相反:单个二进制文件为每个项目提供无限数量的模式,在运行时发现。 SeaORM 的实体生成对固定模式做出了相同的假设。这并不是对 SQLx 与 Diesel 的绝对判定 — 这是一种架构选择:构建时已知的模式与运行时解析的模式。有关每个项目架构分区和相关 RLS 策略的详细信息,请参阅我们的 数据库文档 和 RLS 指南。

产品目标,而非已验证的事实

Aurabase 今天没有发布任何在其自己的生产负载上比较 SQLx、Diesel 和 SeaORM 的延迟数据。引言中引用的我们的基准页面记录了该支柱所使用的方法——而不是简单的数字。

#
常见问题

我们最常被问到的问题

SQLx 是 ORM 吗?+
不。SQLx 不提供查询 DSL 或自动对象关系映射 - 它是一个异步 SQL 工具包,具有可选的编译时检查(官方自述文件,github.com/transact-rs/sqlx,于 2026 年 8 月 23 日访问)。
我们可以异步使用 Diesel 吗?+
是的,但不在主 diesel 箱中,默认情况下保持同步。异步通过单独的 diesel-async箱,由 Diesel 生态系统维护,它还添加了 PostgreSQL 管道。
SeaORM 可以在没有 SQLx 的情况下工作吗?+
在 crates.io 上, sqlx 和 sqlx-core 显示为 sea-orm的可选依赖项,由 sqlx-postgres 等功能激活 - 在标准 Postgres 配置中,SeaORM 因此依赖 SQLx 作为执行驱动程序。
2026 年哪个图书馆的采用率最高?+
按超过 90 天的下载量计算(crates.io API,2026 年 8 月 23 日):SQLx(3340 万)领先于 Diesel(630 万)和 SeaORM(380 万)。采用没有说明您的方案的最佳选择 - 请参阅第 05 节。
#
综上所述

没有普遍的赢家

SQLx、Diesel 和 SeaORM 满足三种不同的需求,而不是同一个讲台上的三个位置。 Diesel 会尽早检查您事先知道的模式。如果您接受多一层抽象(通常是在 SQLx 本身之上),SeaORM 可以节省您在对象可用性方面的时间。 SQLx 仍然是三者中最简单的:这就是它适合仅在运行时才知道的模式的原因,例如aura-db多租户路由。

如果您要将现有项目迁移到 Postgres,并且正在寻找 RLS 架构和策略方面的真正变化,我们的 迁移指南 Supabase → Aurabase 详细介绍了该主题。

准备好部署了吗?

五分钟内完成您的后端。

无需信用卡 · 500 MB 免费 · 50,000 MAU