Rust Axum前后端分离项目-使用sea-orm连接数据库
Sea-ORM 是一个基于 Rust 语言开发的异步 ORM(对象关系映射)框架,专为 Rust 生态设计,旨在简化与关系型数据库的交互。它结合了 sqlx(异步 SQL 执行库)和 SeaQuery(动态 SQL 生成器)的优势,提供类型安全、高性能且符合 Rust 习惯的数据库操作体验。使用 Rust 结构体和宏(derive)定义数据模型,自动生成数据库表结构,代码与数据库 Schema 强
Axum前后端分离项目-使用sea-ORM连接数据库
一、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项目
三、添加项目依赖
- 使用配置文件添加依赖
在Cargo.toml中添加以下内容(以postgresql为例)
[dependencies]
sea-orm = { version = "1.1.10", features = ["chrono", "macros", "runtime-tokio-rustls", "sqlx-postgres"] }
...其他依赖
- 使用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中
- 在lib.rs中定义state状态
pub struct AppState {
db: DatabaseConnection
}
- 绑定状态到路由中
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())
}
- 运行测试

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