5 个不稳定版本
0.3.1 | 2021 年 5 月 4 日 |
---|---|
0.3.0 | 2020 年 10 月 31 日 |
0.2.0 | 2020 年 10 月 27 日 |
0.1.1 | 2020 年 5 月 20 日 |
0.1.0 | 2020 年 3 月 21 日 |
#916 在 编码
105KB
1.5K SLoC
多哆(发音为 doe doe
)是一个非常基本的持久化库,旨在为创建持久存储提供快速简单的方法。它使用 Serde 来执行持久数据的序列化。
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
dodo = "0.3"
serde = { version = "1.0", features = ["derive"] }
uuid = { version = "0.8", features = ["serde", "v4"] }
示例
use std::error::Error;
use dodo::prelude::*;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
//The "Entity" derive implements the "Entity" trait for you.
#[derive(Debug, Entity, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
struct Person {
//Every entity must have an "id" field of type "Option<Uuid>".
id: Option<Uuid>,
name: String,
age: u64,
}
//You should create a type for shorter names
type PersonCollection = Collection<Person, Directory, JsonSerializer>;
fn main() -> Result<(), Box<dyn Error>> {
// Create collection
let mut collection = PersonCollection::new(Directory::new("./person/collection")?);
//Clear collection
collection.clear()?;
// Add a person
let mut person = Person { id: None, name: "John Smith".into(), age: 42 };
collection.insert(&mut person)?;
// Get a person
let id = person.id.unwrap();
let mut person = collection.find(id)?;
// Find persons older than 20
let _persons = collection.find_all()?.filter(|person| person.age > 20).collect()?;
// Update a person
person.name = "Mary Smith".into();
collection.update(&person)?;
// Delete a person
collection.delete(person.id.unwrap())?;
Ok(())
}
动机
并非总是需要完整的数据库。有时,它的功能过于丰富,超出了您的需求。这就是多哆发挥作用的地方:为基本应用程序提供基本的数据存储。
另一方面,当存储大量数据,具有复杂的关系和复杂的查询时,使用您喜欢的数据库实现,无论是 SQL 还是 NoSQL。在这些情况下,多哆无法提供帮助:它不是为此而设计的。
多哆不是设计为快速或高效的。您现在拥有的功能可能就是您将永远拥有的唯一功能。
常见问题解答
“多哆”是什么意思?
在法语中,faire dodo
的意思是 睡觉
。在某种程度上,这个库将数据“放置睡眠”在存储(如您的硬盘或 SSD)上。它也是一种灭绝的不会飞的鸟类。
为什么当找不到某些东西时你会返回一个错误?
为了更好的用户体验。在使用迭代器时,Result<Option<T>>
可能相当繁琐。这也使得 match
语句更加简洁。
为什么我必须使用 UUID
作为实体的 id?
这样做更简单。目前,集合负责为它拥有的每个实体分配一个 id。因此,集合必须有一种方法在运行时生成新的 id,这对每种类型来说都不是一件简单的事情。这就是为什么多哆使用 UUID:生成一个新的 UUID 很容易,并且很少发生冲突。
我可以在非 JSON 的东西中序列化我的数据吗?
当然。创建自己的Serializer
特质实现,然后你就完成了。使用Serde应该没问题。如果你激活了yaml
特性,也可以使用YAML。
更新日志
查看CHANGELOG.md文件以获取版本详细信息。
许可证
本项目采用MIT许可证 - 详细信息请参阅LICENSE.md文件。
依赖
约0.9-1.9MB
约34K SLoC