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日

#5 in #entity-id

每月 25 次下载
用于 dodo

MIT 许可证

4KB

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 的意思是 to sleep。从某种意义上说,这个库将数据放入存储(如硬盘或SSD)中“睡眠”。它也是一种已经灭绝的无翼鸟类。

为什么当找不到东西时,你会返回一个错误?

为了更好的用户体验。使用 Result<Option<T>> 在迭代器中可能会很麻烦。这也使 match 语句更加简洁。

为什么我必须使用 UUID 作为实体的ID?

这种方式更简单。目前,分配每个实体的id是集合的责任。因此,集合必须有一种动态生成新id的方式,这对于每种类型来说并不简单。这就是为什么Dodo使用UUIDs:生成新的UUID很简单,且碰撞很少。

能否将数据序列化为除了JSON以外的格式?

当然可以。创建自己的Serializer trait实现,然后就可以了。使用Serde应该没问题。如果你激活了yaml功能,也可以使用YAML

更新日志

查看CHANGELOG.md文件以获取版本详细信息。

许可证

本项目采用MIT许可证 - 详细内容请见LICENSE.md文件。

依赖项

约1.5MB
约35K SLoC