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 魔法