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
每月下载量 141
28KB
495 行
Spark-ORM: Rust 的 MongoDB ORM
Spark-ORM 是一个高性能、开源的对象关系映射(ORM)库,专为 Rust 中的 MongoDB 设计。它无缝地将 Rust 结构体与 MongoDB 集合连接起来,轻松地将结构体转换为模型。
特性
-
派生模型:使用
Model
特性轻松地将 Rust 结构体转换为 MongoDB 模型。 -
自定义集合名称:使用
#[coll_name]
属性为模型定制集合名称。 -
内存效率:Spark-ORM 以速度和内存效率为设计目标,为 MongoDB 提供了非堆复制 ORM 解决方案。
入门
-
通过简单地应用
Model
属性并设置集合名称(coll_name
)来定义您的模型。#[Model(coll_name = "users")] #[derive(Serialize, Deserialize, Default, Debug)] struct User { age: u32, name: String, email: String, }
-
以两种方式之一连接到数据库
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