sea-orm:异步动态 ORM
SeaORM 是一种关系 ORM,可帮助您在 Rust 中构建轻量级和并发的 Web 服务。
异步:依赖 SQLx
动态:基于 SeaQuery
可测试
服务导向
来看个 Select 的例子:
// find all models
let cakes: Vec<cake::Model> = Cake::find().all(db).await?;
// find and filter
let chocolate: Vec<cake::Model> = Cake::find()
.filter(cake::Column::Name.contains("chocolate"))
.all(db)
.await?;
// find one model
let cheese: Option<cake::Model> = Cake::find_by_id(1).one(db).await?;
let cheese: cake::Model = cheese.unwrap();
// find related models (lazy)
let fruits: Vec<fruit::Model> = cheese.find_related(Fruit).all(db).await?;
// find related models (eager)
let cake_with_fruits: Vec<(cake::Model, Vec<fruit::Model>)> =
Cake::find().find_with_related(Fruit).all(db).await?;
设计思想:「分层抽象」,几乎所有的东西都是可配置的,编译时不知道底层数据库是什么(数据库无关)。使用 API 时有不同的阶段,有两个维度来导航 SeaORM 代码库,“阶段” 和 “抽象”。
首先是「申报阶段」,实体和它们之间的关系是用 EntityTrait、ColumnTrait 和 RelationTrait 等定义的。
其次是「查询构建阶段」
最顶层是
Entity
的find*
、insert
、update
、delete
方法,可以直观的进行基本的 CRUD 操作。再往下一层是
Select
、Insert
、Update
和Delete
结构,它们每个都有自己的 API 用于更高级的操作。再往下一层是 SeaQuery