Rust 嵌入式數據庫:Native DB

Native DB 是一個插入式、快速的嵌入式數據庫,適用於多平臺應用程序 (服務器、桌面、移動端)。

Native DB 是一個完全用 Rust 開發的數據庫,它提供了一個簡單、快速的嵌入式數據庫解決方案,專注於用最少的樣板文件維護 Rust 類型和存儲數據之間的一致性。它支持多個索引、帶過濾器的實時監測、模型遷移、熱點快照等。

Native DB 特性如下:

例子

使用以下命令創建一個 Rust 新項目:

cargo new nativedb-example

在 Cargo.toml 文件中加入依賴項:

[dependencies]
native_db = "0.7.0"
native_model = "0.4.19"

在 src/main.rs 文件中,寫入以下代碼:

use native_db::*;
use native_model::{native_model, Model};
use once_cell::sync::Lazy;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[native_model(id = 1, version = 1)]
#[native_db]
struct Item {
    #[primary_key]
    id: u32,
    #[secondary_key]
    name: String,
}

static MODELS: Lazy<Models> = Lazy::new(|| {
    let mut models = Models::new();
    models.define::<Item>().unwrap();
    models
});

在這裏我們先定義一個數據模型結構體:Item。模型的生命週期需要更長或等於數據庫的生命週期。在許多情況下,使用靜態變量更簡單,但這不是強制性的。這裏使用了 once_cell 庫的 Lazy 類型。

接下來我們看一下 main 函數代碼:

fn main() -> Result<(), db_type::Error> {
    // 在內存中創建數據庫
    let db = Builder::new().create_in_memory(&MODELS)?;

    // 插入數據(打開讀寫事務)
    let rw = db.rw_transaction().unwrap();
    rw.insert(Item {
        id: 1,
        name: "red".to_string(),
    })?;
    rw.insert(Item {
        id: 2,
        name: "green".to_string(),
    })?;
    rw.insert(Item {
        id: 3,
        name: "blue".to_string(),
    })?;
    rw.commit()?;

    // 打開只讀事務
    let r = db.r_transaction()?;
    // 檢索id=3的數據
    let retrieve_data: Item = r.get().primary(3_u32)?.unwrap();
    println!("data id='3': {:?}", retrieve_data);
    // 迭代名稱以“red”開頭的項
    for item in r.scan().secondary::<Item>(ItemKey::name)?.start_with("red") {
        println!("data name=\"red\": {:?}", item);
    }

    // Remove data (open a read-write transaction)
    let rw = db.rw_transaction()?;
    rw.remove(retrieve_data)?;
    rw.commit()?;

    Ok(())
}

結果如下:

data id='3': Item { id: 3, name: "blue" }
data : Ok(Item { id: 1, name: "red" })
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Nzm3MB5R4DSRIRjzlD0kuQ