8 个版本

0.3.1 2024年7月23日
0.3.0 2024年7月5日
0.2.5 2024年6月17日
0.2.3 2024年5月22日
0.1.0 2024年5月1日

数据库接口 中排名 784

Download history 110/week @ 2024-04-28 164/week @ 2024-05-05 369/week @ 2024-05-12 112/week @ 2024-05-19 3/week @ 2024-05-26 295/week @ 2024-06-16 5/week @ 2024-06-23 85/week @ 2024-06-30 15/week @ 2024-07-07 1/week @ 2024-07-14 109/week @ 2024-07-21 32/week @ 2024-07-28

每月下载量 141

MIT/Apache

28KB
495

Spark-ORM: Rust 的 MongoDB ORM

Spark-ORM 是一个高性能、开源的对象关系映射(ORM)库,专为 Rust 中的 MongoDB 设计。它无缝地将 Rust 结构体与 MongoDB 集合连接起来,轻松地将结构体转换为模型。

特性

  • 派生模型:使用 Model 特性轻松地将 Rust 结构体转换为 MongoDB 模型。

  • 自定义集合名称:使用 #[coll_name] 属性为模型定制集合名称。

  • 内存效率:Spark-ORM 以速度和内存效率为设计目标,为 MongoDB 提供了非堆复制 ORM 解决方案。

入门

  1. 通过简单地应用 Model 属性并设置集合名称(coll_name)来定义您的模型。

    #[Model(coll_name = "users")]
    #[derive(Serialize, Deserialize, Default, Debug)]
    struct User {
    age: u32,
    name: String,
    email: String,
    }
    
  2. 以两种方式之一连接到数据库

    a. 建立全局连接

    Spark::global_connect("root", "123", "localhost", "6789", "rm_orm_db").await;
    

    b. 或本地连接

    Spark::connect("root", "123", "localhost", "6789", "rm_orm_db").await;
    

    对于全局连接,Spark 在整个程序中保留它,可以通过: Spark::get_db();

使用

实例化模型

    let mut user = User::new_model(Some(&db));

或者使用全局连接

 let mut user = User::new_model(None);

如果没有设置全局连接,则 new_model 函数会引发 panic


更新属性

   user.name = "Hossein".to_string();
   user.age = 22;

保存到数据库

   user.save().await.unwrap();

查找模型

        let mut user_model = User::new_model(Some(&db)); 
        let mut sample = User::default ();
        sample.name = "Hossein".to_string();
        let founded = user_model.find_one(
            sample,
            None,
            ).await.unwrap();
        println!("The founded object {:?} ", founded);

更新并保存

    let mut user = User::new_model(Some(&db));
    user.name = "Hossein".to_string();
    user.email = "spark_orm_test".to_string();

    user.save().await;

    user.name = "Nothing".to_string();

    user.save().await;

或者

      let db = get_db().await;
      let user_model = User::new_model(Some(&db));
      let updated = user_model.update(
      doc! {
                  "name": "Hossein",
              },
      doc! {
                  "$set": {
                      "name": "Hossein 33"
                  }
              },
      None,
      ).await.unwrap();
       println!("The Updated info {:?}", updated);

删除记录

        let mut user = User::new_model(Some(&db));
        user.delete().await;

注意:可以使用 ? 代替 unwrap

模型

模型特性为您的作用域添加 _id、时间戳(created_at、updated_at、deleted_at)并自动填充

属性

为结构体字段定义索引或唯一属性

   #[Model(coll_name = "products")]
   #[derive(Serialize, Deserialize, Default, Debug)]
   struct Product {
       #[index]
       age: u32,
       #[index]
       name: String,
       #[unique]
       email: String,
   }

这些索引在 Product 的第一次初始化时注册。

模型观察者

您可以在模型中对某些操作调用设置观察者

要使用观察者,只需在 Model 宏中放入 observer,例如:#[Model(coll_name='users' , observer)]

并为您的模型实现 Observer<T> ,支持的方法有 创建更新删除

    
#[Model(coll_name = "users", observer)]
#[derive(Serialize, Deserialize, Debug, Default)]
struct User {
    name: String,
}

#[Model(coll_name = "persons", observer)]
#[derive(Serialize, Deserialize, Debug, Default)]
struct Person {
    name: String,
}


impl Observer<User> for User {
    async fn created(model: &mut Model<'_, User>) -> MongodbResult<()> {
        let mut person_model = Person::new_model(None);
        if model.name == "Hello".to_string() {
            model.name = "Something".to_string();
            model.save(None).await?;
        }
        person_model.name = "Naruto".to_string();
        person_model.save(None).await?;
        Ok(())
    }
}

#[allow(clippy::assigning_clones)]
impl Observer<Person> for Person {
    async fn created(model: &mut Model<'_, Person>) -> MongodbResult<()> {
        let mut jobs = Jobs::new_model(None);
        jobs.person.name = model.name.clone();
        jobs.save(None).await?;
        Ok(())
    }

    async fn updated(model: &mut Model<'_, Person>) -> MongodbResult<()> {
        Ok(())
    }

    async fn deleted(model: &mut Model<'_, Person>) -> MongodbResult<()> {
        Ok(())
    }
}

非常感谢您在 GitHub 上的支持。请考虑给我一个 star 来表达您的支持。谢谢!

请注意,该库正在开发中,未来可能会有很多变化,甚至在其基本功能上

依赖关系

~25–36MB
~672K SLoC