一、Sea-ORM简介

Sea-ORM 是一个基于 Rust 语言开发的异步 ORM(对象关系映射)框架,专为 Rust 生态设计,旨在简化与关系型数据库的交互。它结合了 sqlx(异步 SQL 执行库)和 SeaQuery(动态 SQL 生成器)的优势,提供类型安全、高性能且符合 Rust 习惯的数据库操作体验。

主要特性

异步支持

基于 async/await 语法,天然适配 Rust 异步运行时(如 tokio 或 async-std),适合高并发场景。

基于 Rust 的模型定义

使用 Rust 结构体和宏(derive)定义数据模型,自动生成数据库表结构,代码与数据库 Schema 强关联。

Active Record 模式

提供类似 ActiveRecord 的 API,支持链式调用构建查询

事务与错误处理

内置事务管理,支持嵌套事务,错误处理与 Rust 的 Result 类型无缝集成。

多数据库支持

兼容 PostgreSQL、MySQL、SQLite 等主流数据库,通过配置切换数据源。

日志与调试

集成 tracing 库,可输出 SQL 执行日志,方便调试。

适用场景

  • List item
  • 需要异步数据库操作的 Rust 后端服务(如 Web API、微服务)。
  • 强调类型安全和编译时检查的项目。
  • 需要灵活构建动态查询的应用(如复杂过滤、分页)。

更多内容请移步Sea-ORM官网

优势对比

  • Diesel:Sea-ORM 完全异步,无需编译时连接数据库,更适合现代异步应用。
  • sqlx:提供更高层次的抽象(如模型和关系),减少手写 SQL 的繁琐。

二、创建Rust Axum项目

详见新建Rust Axum项目


三、添加项目依赖

  1. 使用配置文件添加依赖
    在Cargo.toml中添加以下内容(以postgresql为例)
[dependencies]
sea-orm = { version = "1.1.10", features = ["chrono", "macros", "runtime-tokio-rustls", "sqlx-postgres"] }
...其他依赖
  1. 使用shell命令添加依赖
# sqlite
cargo add sea-orm -F chrono,macros,runtime-tokio-rustls,sqlx-postgres

四、安装sea-orm-cli客户端

cargo install sea-orm-cli@1.1.0

五、连接数据库

编辑src/db/postgres.rs

use std::process::exit;

use sea_orm::{Database, DatabaseConnection};
use tracing::{error, info};
///@param path: &str 数据库连接地址
pub async fn get_db(path: &str) -> DatabaseConnection {
    match Database::connect(path).await {
        Ok(conn) => {
            info!("数据库连接成功");
            conn
        }
        Err(err) => {
            error!("数据库连接失败:{}", err);
            // 这里可以换成自定义的错误代码,这里不代表任何含义的错误
            exit(1)
        }
    }
}

六、调用数据库连接并绑定到axum中

  1. 在lib.rs中定义state状态
pub struct AppState {
  db: DatabaseConnection
}
  1. 绑定状态到路由中
use std::sync::Arc;

use axum::{Router, response::Html, routing::get};
use db::postgres;
use sea_orm::DatabaseConnection;
use tokio::sync::Mutex;
use tower_http::trace::TraceLayer;
use tracing::info;
pub mod db;

pub struct AppState {
    db: DatabaseConnection,
}

pub async fn run_http_server() {
    // 初始化日志输出
    tracing_subscriber::fmt::init();
    // 连接postgres数据库
    let db = postgres::get_db("postgres://postgres:postgres@192.168.1.99:3306/hotline").await;
    // 定义state
    let state = Arc::new(Mutex::new(AppState { db }));
    // 初始化路由
    let app = Router::new()
        .route("/hello", get(get_str))
        // 配置日志中间件
        .layer(TraceLayer::new_for_http())
        // 定义全局状态
        .with_state(state);
    // 监听tcp端口
    let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
    info!("服务器启动在:{}", listener.local_addr().unwrap());
    // 启动axum服务
    axum::serve(listener, app).await.unwrap();
}

async fn get_str() -> Html<&'static str> {
    Html("<h1>Hello World</h1>".into())
}
  1. 运行测试
    连接数据库
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐