本文旨在比较 Diesel 与其他连接关系型数据库的 Rust 库。
汇总对比表
特性 | Diesel | SQLx | SeaORM | tokio-postgres/mysql/rusqlite |
---|---|---|---|---|
稳定性 | 稳定 (2.0 版发布于 2022 年) | 不稳定 (0.x 版本) | 稳定 (1.0 版发布于 2024 年) | 不稳定 (0.x 版本) |
安全性 | 编译时检查,类型系统支持 | 编译时检查,需运行数据库 | 部分语法检查,无类型验证 | 仅语法验证 |
灵活性 | 支持动态查询和扩展 | 静态查询检查,不支持动态查询 | DSL 支持有限,扩展性弱 | 支 持所有 SQL 查询 |
可扩展性 | 高,可自定义扩展 DSL/后端 | 低,无法扩展核心功能 | 低,无法扩展 DSL/后端 | 不适用 |
可用性 | 需 C 库支持 (SQLite) | 需 C 库支持 (SQLite) | 易于使用,无需额外依赖 | 易于使用 |
性能 | 高性能,支持查询流水线 | 性能良好,不支持流水线 | 性能一般,不支持流水线 | 性能一般 |
详细分析
稳定性
Rust 库通常遵循语义版本控制(SemVer),其稳定性由版本决定。版本号高于 1.0 的库承诺在主版本升级前不做破坏性变更。以下是库的现状:
- Diesel:1.0 发布于 2018 年,2.0 于 2022 年发布。
- SeaORM:1.0 发布于 2024 年夏季。
- 其他库仍处于 0.x 状态。
安全性保证
根据提供的安全级别,可以将这些库分为三类:
- 纯数据库接口:接受 SQL 字符串,但语法错误需用户自行处理。
- 未验证的查询生成器:提供 DSL,但无法验证类型和约束。
- 编译时检查:通过编译时检查验证查询。
Diesel 和 SQLx 的实现差异:
- Diesel 使用 Rust 类型系统进行检查,支持动态构建查询。
- SQLx 使用宏检查静态查询,但需要运行数据库实例。
灵活性
各库 API 的灵活性差异:
- tokio-postgres、rusqlite 和 mysql:接受 SQL 字符串,因此支持所有查询。
- SeaORM:DSL 支持常见 SQL 功能,但限制了高级查询(如超过 3 个表的联接)。
- SQLx:宏检查静态查询,不支持基于运行时信息的动态查询。
- Diesel:DSL 覆盖大部分常见 SQL 功能,并支持自定义扩展。
可扩展性
以下是库的可扩展性差异:
- SeaORM:通过枚举实现 DSL,不支持自定义扩展。
- SQLx:依赖宏,无法轻松扩展。
- Diesel:广泛使用特性(traits),支持自定义 DSL 和后端扩展。
可用性
- Diesel、Diesel-async、SQLx、SeaORM、tokio-postgres 等提供纯 Rust 实现,易于编译。
- Diesel 和 rusqlite 的 SQLite 后端依赖 C 库,需预先安装。
性能
各库性能概述:
- 异步 SQLite 表现较差:SQLite 缺乏异步 API。
- 小数据输出性能相似,大数据输出差异明显:Diesel 在数据反序列化方面表现优异。
- 查询流水线:Diesel-async 和 tokio-postgres 支持查询流水线,可提升 PostgreSQL 性能 20%。
关于异步数据库库的必要性
异步库的性能优势主要体现在高网络延迟或需要中断请求的场景。 对于 SQLite,使用同步库更高效。 Diesel-async 可支持异步场景。