#csv #nosql #db #嵌入式数据库

csv_db

使用CSV文件进行存储的简单嵌入式NoSQL数据库

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数据库接口

MIT/Apache

17KB
118

CSV DB

使用CSV文件进行存储的简单嵌入式NoSQL数据库。

它允许使用CSV文件对文档集合执行以下操作

  • 查找
  • 插入
  • 删除
  • 更新

设计

csv_dbcsv 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