66 个版本 (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日 |
#8 in 数据库接口
每月下载量:188,455
用于 160 个 Crates(直接使用 103 个)
2MB
19K SLoC
SeaORM
SeaORM 是一个关系型 ORM,帮助您使用动态语言的可视化特性在 Rust 中构建 Web 服务。
请帮助我们维护 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?;
🧭 Seaography:GraphQL 集成(预览)
Seaography 是一个建立在 SeaORM 之上的 GraphQL 框架。Seaography 允许您快速构建 GraphQL 解析器。只需几个命令,您就可以从 SeaORM 实体启动 GraphQL 服务器!
从 0.12
开始,seaography
集成已内置到 sea-orm
中。虽然 Seaography 的发展仍处于早期阶段,但它特别适用于原型设计和构建内部使用的管理面板。
查看 Seaography 示例 以了解更多信息。
了解更多
谁在使用 SeaORM?
查看 用 SeaORM 构建的项目。欢迎您 提交您的项目!
许可证
根据您的选择,许可协议为以下之一
- Apache License, Version 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 的官方吉祥物。他的爱好是收集贝壳。
依赖
~4–22MB
~338K SLoC