Rust ORM:Diesel、SeaORM 和 SQLx 的比较与使用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust ORM:详细比较与使用示例



Rust 生态系统提供了多种强大的数据库解决方案。在本文中,我们将介绍三种最流行的 Rust ORM(对象关系映射):Diesel、SeaORM 和 SQLx。它们各有优势,适用于不同的场景。我们将根据关键特性进行比较,并提供实用的代码示例。



1. Diesel —— 性能卓越的经典 ORM



Diesel 是 Rust 生态中最成熟的 ORM。它同步运行(通过 diesel-async 支持异步),以其高性能和类型安全而闻名。



主要特点:

  • 完全类型安全:SQL 错误在编译阶段即可发现
  • 支持 PostgreSQL、MySQL、SQLite
  • 通过 CLI 工具 diesel_cli 生成模式
  • 针对复杂查询和事务进行了优化


Diesel 代码示例:

// 定义模型#[derive(Queryable, Insertable)]#[diesel(table_name = crate::schema::users)]struct User {    id: i32,    name: String,    email: String,}

// 插入新用户fn create_user(conn: &mut PgConnection, name: &str, email: &str) -> User { let new_user = NewUser { name, email }; diesel::insert_into(users::table) .values(&new_user) .get_result(conn) .expect("Error saving new user")}

// 查询所有用户fn get_all_users(conn: &mut PgConnection) -> Vec<User> { users::table .load::<User>(conn) .expect("Error loading users")}


2. SeaORM —— 异步 ORM 与活动记录模式



SeaORM 是一个现代化的异步 ORM,受 Entity Framework 和 Active Record 启发。它提供了便捷的查询构建 API,并内置了迁移支持。



主要特点:

  • 默认异步(基于 Tokio)
  • 活动记录模式:可在实体上调用方法
  • 支持关系(has_many、belongs_to、many_to_many)
  • 内置迁移和 CLI 工具


SeaORM 代码示例:

use sea_orm::{entity::prelude::*, Database, EntityTrait};

// 定义实体#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]#[sea_orm(table_name = "users")]pub struct Model { #[sea_orm(primary_key)] pub id: i32, pub name: String, pub email: String,}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

// 在代码中使用async fn run() { let db = Database::connect("postgres://user:pass@localhost/db").await.unwrap(); // 插入 let user = ActiveModel { name: Set("Alice".to_owned()), email: Set("alice@example.com".to_owned()), ..Default::default() }; let result = Entity::insert(user).exec(&db).await.unwrap(); // 查询所有 let users: Vec<Model> = Entity::find().all(&db).await.unwrap();}


3. SQLx —— 非 ORM,而是编译时检查的异步 SQL 驱动



SQLx 处于中间位置:它不是完整的 ORM,但提供了强大的 SQL 工具,并在编译时检查查询。它非常适合那些喜欢编写纯 SQL 但希望避免错误的人。



主要特点:

  • 异步(Tokio、async-std)
  • 通过宏 sqlx::query! 在编译时检查 SQL 查询
  • 支持 PostgreSQL、MySQL、SQLite、MSSQL
  • 轻量级,无 ORM 魔法


SQLx 代码示例:

推荐