Rust 嵌入式數據庫:Native DB
Native DB 是一個插入式、快速的嵌入式數據庫,適用於多平臺應用程序 (服務器、桌面、移動端)。
Native DB 是一個完全用 Rust 開發的數據庫,它提供了一個簡單、快速的嵌入式數據庫解決方案,專注於用最少的樣板文件維護 Rust 類型和存儲數據之間的一致性。它支持多個索引、帶過濾器的實時監測、模型遷移、熱點快照等。
Native DB 特性如下:
-
簡單的 API
-
支持多個索引 (主索引、輔助索引、唯一索引、非唯一索引、可選索引)。
-
最小樣板文件
-
使用 native_model 的透明序列化 / 反序列化。
-
自動模型遷移
-
線程安全和由 redb 庫提供的完全符合 ACID 的事務。
-
帶有插入、更新和刪除操作過濾器的實時監測。
-
兼容所有 Rust 類型 (enum, struct, tuple 等)。
-
熱點快照
例子
使用以下命令創建一個 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