5个版本
0.2.0 | 2023年9月12日 |
---|---|
0.1.3 | 2023年9月12日 |
0.1.2 | 2023年9月12日 |
0.1.1 | 2023年9月11日 |
0.1.0 | 2023年9月11日 |
#2699 在 数据库接口
17KB
118 行
CSV DB
使用CSV文件进行存储的简单嵌入式NoSQL数据库。
它允许使用CSV文件对文档集合执行以下操作
- 查找
- 插入
- 删除
- 更新
设计
csv_db
在 csv
crate周围包装了一层薄层,提供一个具有数据库库期望的常用方法的Database结构。其主要目的是进一步抽象用户远离CSV文件的低级细节,即处理打开文件和记录。此外,该crate试图尽可能通用,允许用户无缝使用任何自定义类型作为文档。为了实现这一点,csv_db
的方法期望泛型文档实现使用serde
的 derive宏的Serialize
/Deserialize
特质。
所有方法都是异步的,因此您可以轻松地将此crate集成到异步代码中。为了实现这一点,由于csv
crate不是异步的,因此csv_db
的每个方法都将任何可能阻塞的代码(例如打开文件或处理记录)包装在tokio::task::spawn_blocking
函数中。
从版本0.2.0开始,所有写入数据的方法调用,即插入、删除和更新,将自动尝试创建集合文件(如果尚不存在),包括所有父文件夹。例如,如果您尝试向用户集合中插入,如果不存在,则将创建文件{path}/users.csv
,包括所有在{path}
中的文件夹。
示例
use csv_db::Database;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, PartialEq, Serialize)]
struct User {
id: usize,
first_name: String,
last_name: String,
age: u32,
}
#[tokio::main]
async fn main() {
// Create a new Database with a path for the base folder.
// Optionally provide an extension for the files (csv by default).
let db = Database::new("data", None);
let user = User {
id: 1,
first_name: String::from("First"),
last_name: String::from("Last"),
age: 20,
};
// Insert a new user into the users collection.
db.insert("users", user)
.await
.expect("Problem inserting user.");
// Find users by filtering with a predicate on the users collection.
let adults = db
.find("users", |u: &User| u.age >= 18)
.await
.expect("Problem searching user.");
let user = User {
id: 1,
first_name: String::from("First"),
last_name: String::from("Last"),
age: 21,
};
// Update a user by filtering with a predicate on the users collection.
db.update("users", user, |u: &&User| u.id == 1)
.await
.expect("Problem updating user.");
// Delete a user by filtering with a predicate from the users collection.
db.delete("users", |u: &&User| u.id == 1)
.await
.expect("Problem deleting user.");
}
依赖项
~4–12MB
~92K SLoC