60 个版本 (1 个稳定版)
1.1.0-rc.1 | 2024年8月9日 |
---|---|
1.0.0-rc.7 | 2024年6月25日 |
1.0.0-rc.3 | 2024年3月26日 |
0.12.15 | 2024年3月15日 |
0.4.0 | 2021年11月19日 |
#2987 在 数据库接口
194,583 每月下载量
被 145 个crate使用(通过 sea-orm)
185KB
4K SLoC
SeaORM
SeaORM 是一个关系型 ORM,可以帮助你使用动态语言的熟悉度在 Rust 中构建网络服务。
请帮助我们维护 SeaORM,完成 SeaQL 社区调查 2024!
加入我们的 Discord 服务器与其他 SeaQL 社区成员聊天!
入门
集成示例
- Actix v4 示例
- Axum 示例
- GraphQL 示例
- jsonrpsee 示例
- Loco TODO 示例 / Loco REST 入门
- 诗歌示例
- Rocket 示例 / Rocket OpenAPI 示例
- Salvo 示例
- Tonic 示例
- Seaography 示例
特性
-
异步
SeaORM 基于 SQLx,是一个从第一天就支持异步的库。
-
动态
SeaORM 基于 SeaQuery,允许你构建复杂的动态查询。
-
可测试
使用模拟连接和/或 SQLite 编写测试以测试你的应用程序逻辑。
-
面向服务
快速构建可以在 REST、GraphQL 和 gRPC API 中连接、过滤、排序和分页数据的服务。
SeaORM 快速体验
实体
use sea_orm::entity::prelude::*;
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "cake")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub name: String,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
#[sea_orm(has_many = "super::fruit::Entity")]
Fruit,
}
impl Related<super::fruit::Entity> for Entity {
fn to() -> RelationDef {
Relation::Fruit.def()
}
}
选择
// 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?;
插入
let apple = fruit::ActiveModel {
name: Set("Apple".to_owned()),
..Default::default() // no need to set primary key
};
let pear = fruit::ActiveModel {
name: Set("Pear".to_owned()),
..Default::default()
};
// insert one
let pear = pear.insert(db).await?;
// insert many
Fruit::insert_many([apple, pear]).exec(db).await?;
更新
use sea_orm::sea_query::{Expr, Value};
let pear: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let mut pear: fruit::ActiveModel = pear.unwrap().into();
pear.name = Set("Sweet pear".to_owned());
// update one
let pear: fruit::Model = pear.update(db).await?;
// update many: UPDATE "fruit" SET "cake_id" = NULL WHERE "fruit"."name" LIKE '%Apple%'
Fruit::update_many()
.col_expr(fruit::Column::CakeId, Expr::value(Value::Int(None)))
.filter(fruit::Column::Name.contains("Apple"))
.exec(db)
.await?;
保存
let banana = fruit::ActiveModel {
id: NotSet,
name: Set("Banana".to_owned()),
..Default::default()
};
// create, because primary key `id` is `NotSet`
let mut banana = banana.save(db).await?;
banana.name = Set("Banana Mongo".to_owned());
// update, because primary key `id` is `Set`
let banana = banana.save(db).await?;
删除
// delete one
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let orange: fruit::Model = orange.unwrap();
fruit::Entity::delete(orange.into_active_model())
.exec(db)
.await?;
// or simply
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?;
let orange: fruit::Model = orange.unwrap();
orange.delete(db).await?;
// delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange'
fruit::Entity::delete_many()
.filter(fruit::Column::Name.contains("Orange"))
.exec(db)
.await?;
🧭 海图学:GraphQL集成(预览)
海图学是一个基于SeaORM构建的GraphQL框架。海图学允许您快速构建GraphQL解析器。只需几个命令,您就可以从SeaORM实体启动GraphQL服务器!
从0.12版本开始,0.12
,seaography
集成已内置到sea-orm
中。虽然海图学还在早期开发阶段,但在原型设计和构建内部使用的管理面板方面特别有用。
查看海图学示例了解更多信息。
了解更多
谁在使用SeaORM?
许可证
根据您的选择,许可协议为
- Apache License,版本2.0(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则任何旨在包含在作品中并由您提交的贡献(根据Apache-2.0许可证定义),均应按上述方式双许可,不附加任何额外条款或条件。
SeaORM是一个由社区推动的项目。我们欢迎您参与、贡献,并共同帮助构建Rust的未来。
向我们的贡献者致以最诚挚的问候!
赞助
SeaQL.org是一个由热情的开发者运营的独立开源组织。如果您喜欢使用我们的库,请星标并分享我们的仓库。如果您慷慨解囊,通过GitHub Sponsor进行小额捐赠将非常感谢,这对维持组织大有裨益。
我们邀请您参与、贡献,并共同帮助构建Rust的未来。
金牌赞助商
吉祥物
费里斯的朋友,海螺蟹特瑞斯是SeaORM的官方吉祥物。他的爱好是收集贝壳。
依赖关系
~290–750KB
~18K SLoC