66 个版本 (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日

#8 in 数据库接口

Download history 94683/week @ 2024-05-02 92875/week @ 2024-05-09 101066/week @ 2024-05-16 85356/week @ 2024-05-23 43063/week @ 2024-05-30 49523/week @ 2024-06-06 38175/week @ 2024-06-13 40489/week @ 2024-06-20 44773/week @ 2024-06-27 39300/week @ 2024-07-04 41788/week @ 2024-07-11 36899/week @ 2024-07-18 39517/week @ 2024-07-25 42576/week @ 2024-08-01 48631/week @ 2024-08-08 50841/week @ 2024-08-15

每月下载量:188,455
用于 160 个 Crates(直接使用 103 个)

MIT/Apache

2MB
19K SLoC

SeaORM

🐚 一个异步且动态的 Rust ORM

crate docs build status

SeaORM

SeaORM 是一个关系型 ORM,帮助您使用动态语言的可视化特性在 Rust 中构建 Web 服务。

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?;

🧭 Seaography:GraphQL 集成(预览)

Seaography 是一个建立在 SeaORM 之上的 GraphQL 框架。Seaography 允许您快速构建 GraphQL 解析器。只需几个命令,您就可以从 SeaORM 实体启动 GraphQL 服务器!

0.12 开始,seaography 集成已内置到 sea-orm 中。虽然 Seaography 的发展仍处于早期阶段,但它特别适用于原型设计和构建内部使用的管理面板。

查看 Seaography 示例 以了解更多信息。

了解更多

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

谁在使用 SeaORM?

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

许可证

根据您的选择,许可协议为以下之一

贡献

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

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

向我们的贡献者表示衷心的感谢!

Contributors

赞助

SeaQL.org 是由充满激情的开发者运营的独立开源组织。如果您喜欢使用我们的库,请为我们点赞并分享我们的仓库。如果您慷慨解囊,通过 GitHub Sponsor 的微小捐赠将非常感谢,这将大大有助于维持组织的运营。

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

金牌赞助商

吉祥物

法里斯的朋友,寄居蟹特雷斯是 SeaORM 的官方吉祥物。他的爱好是收集贝壳。

Terres

依赖

~4–22MB
~338K SLoC