8 个版本
0.7.1 | 2024年7月15日 |
---|---|
0.7.0 | 2024年6月24日 |
0.6.1 | 2024年5月9日 |
0.5.3 | 2023年12月27日 |
#24 在 数据库实现 中
每月下载量 275
用于 5 个 crate(直接使用 2 个)
400KB
3K SLoC
Native DB
这是一个适用于多平台应用(服务器、桌面、移动设备)的快速嵌入式数据库。轻松同步 Rust 类型。享受吧!😌🍃.
特性
- 简单的 API 🦀。
- 支持 多个索引(主索引、辅助索引、唯一索引、非唯一索引、可选索引)。
- 最小化样板代码,请参阅 基准测试。
- 使用 native_model 进行透明的序列化和反序列化。
- 自动模型迁移 🌟。
- 线程安全 和完全 ACID 兼容 事务由 redb 提供。
- 实时 订阅带有过滤器的
insert
、update
和delete
操作。 - 与所有 Rust 类型兼容(
enum
、struct
、tuple
等)。 - 热快照.
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
native_db = "0.7.1"
native_model = "0.4.19"
注意:native_db
需要 native_model
才能正常工作。
状态
积极开发。API 还不稳定,将来可能会发生变化。
如何使用?
- 文档 API
- 快速入门
- 带有 Tauri 的完整示例: native_db_tauri_vanilla
示例
use serde::{Deserialize, Serialize};
use native_db::*;
use native_model::{native_model, Model};
use once_cell::sync::Lazy;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[native_model(id = 1, version = 1)]
#[native_db]
struct Item {
#[primary_key]
id: u32,
#[secondary_key]
name: String,
}
// Define the models
// The lifetime of the models needs to be longer or equal to the lifetime of the database.
// In many cases, it is simpler to use a static variable but it is not mandatory.
static MODELS: Lazy<Models> = Lazy::new(|| {
let mut models = Models::new();
models.define::<Item>().unwrap();
models
});
fn main() -> Result<(), db_type::Error> {
// Create a database in memory
let mut db = Builder::new().create_in_memory(&MODELS)?;
// Insert data (open a read-write transaction)
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()?;
// Open a read-only transaction
let r = db.r_transaction()?;
// Retrieve data with id=3
let retrieve_data: Item = r.get().primary(3_u32)?.unwrap();
println!("data id='3': {:?}", retrieve_data);
// Iterate items with name starting with "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(())
}
贡献者
Akshith Madhur 💻 |
依赖关系
~2–5.5MB
~99K SLoC