#serialization #repository #derive-debug #collection #person #basic #entity

dodo

一个基本的持久化库,旨在为创建持久存储提供快速简单的方法。

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编码

MIT 许可证

105KB
1.5K SLoC

Dodo

多哆(发音为 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