Skip to main content

One post tagged with "Diesel"

View All Tags

本文旨在比较 Diesel 与其他连接关系型数据库的 Rust 库。

汇总对比表

特性DieselSQLxSeaORMtokio-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 状态。

安全性保证

根据提供的安全级别,可以将这些库分为三类:

  1. 纯数据库接口:接受 SQL 字符串,但语法错误需用户自行处理。
  2. 未验证的查询生成器:提供 DSL,但无法验证类型和约束。
  3. 编译时检查:通过编译时检查验证查询。

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 库,需预先安装。

性能

各库性能概述:

  1. 异步 SQLite 表现较差:SQLite 缺乏异步 API。
  2. 小数据输出性能相似,大数据输出差异明显:Diesel 在数据反序列化方面表现优异。
  3. 查询流水线:Diesel-async 和 tokio-postgres 支持查询流水线,可提升 PostgreSQL 性能 20%。

关于异步数据库库的必要性

异步库的性能优势主要体现在高网络延迟或需要中断请求的场景。 对于 SQLite,使用同步库更高效。 Diesel-async 可支持异步场景。

链接

鱼雪