60 个版本 (1 个稳定版)

1.1.0-rc.12024年8月9日
1.0.0-rc.72024年6月25日
1.0.0-rc.32024年3月26日
0.12.15 2024年3月15日
0.4.0 2021年11月19日

#2987数据库接口

Download history 87701/week @ 2024-05-04 105803/week @ 2024-05-11 103550/week @ 2024-05-18 55757/week @ 2024-05-25 43801/week @ 2024-06-01 49119/week @ 2024-06-08 36626/week @ 2024-06-15 41461/week @ 2024-06-22 41347/week @ 2024-06-29 45942/week @ 2024-07-06 35897/week @ 2024-07-13 40389/week @ 2024-07-20 38967/week @ 2024-07-27 44170/week @ 2024-08-03 48836/week @ 2024-08-10 56086/week @ 2024-08-17

194,583 每月下载量
145 个crate使用(通过 sea-orm

MIT/Apache

185KB
4K SLoC

SeaORM

🐚 一个异步且动态的 Rust ORM

crate docs build status

SeaORM

SeaORM 是一个关系型 ORM,可以帮助你使用动态语言的熟悉度在 Rust 中构建网络服务。

GitHub stars 如果你喜欢我们的工作,请考虑给它加星、分享并贡献!

请帮助我们维护 SeaORM,完成 SeaQL 社区调查 2024

Discord 加入我们的 Discord 服务器与其他 SeaQL 社区成员聊天!

入门

集成示例

特性

  1. 异步

    SeaORM 基于 SQLx,是一个从第一天就支持异步的库。

  2. 动态

    SeaORM 基于 SeaQuery,允许你构建复杂的动态查询。

  3. 可测试

    使用模拟连接和/或 SQLite 编写测试以测试你的应用程序逻辑。

  4. 面向服务

    快速构建可以在 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.12seaography集成已内置到sea-orm中。虽然海图学还在早期开发阶段,但在原型设计和构建内部使用的管理面板方面特别有用。

查看海图学示例了解更多信息。

了解更多

  1. 设计
  2. 架构
  3. 工程
  4. 变更日志

谁在使用SeaORM?

查看用SeaORM构建。欢迎您提交您的

许可证

根据您的选择,许可协议为

贡献

除非您明确表示,否则任何旨在包含在作品中并由您提交的贡献(根据Apache-2.0许可证定义),均应按上述方式双许可,不附加任何额外条款或条件。

SeaORM是一个由社区推动的项目。我们欢迎您参与、贡献,并共同帮助构建Rust的未来。

向我们的贡献者致以最诚挚的问候!

Contributors

赞助

SeaQL.org是一个由热情的开发者运营的独立开源组织。如果您喜欢使用我们的库,请星标并分享我们的仓库。如果您慷慨解囊,通过GitHub Sponsor进行小额捐赠将非常感谢,这对维持组织大有裨益。

我们邀请您参与、贡献,并共同帮助构建Rust的未来。

金牌赞助商

吉祥物

费里斯的朋友,海螺蟹特瑞斯是SeaORM的官方吉祥物。他的爱好是收集贝壳。

Terres

依赖关系

~290–750KB
~18K SLoC