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数据库实现

Download history 160/week @ 2024-05-03 71/week @ 2024-05-10 56/week @ 2024-05-17 62/week @ 2024-05-24 62/week @ 2024-05-31 59/week @ 2024-06-07 63/week @ 2024-06-14 217/week @ 2024-06-21 73/week @ 2024-06-28 60/week @ 2024-07-05 180/week @ 2024-07-12 73/week @ 2024-07-19 77/week @ 2024-07-26 97/week @ 2024-08-02 64/week @ 2024-08-09 24/week @ 2024-08-16

每月下载量 275
用于 5 个 crate(直接使用 2 个)

MIT 许可

400KB
3K SLoC

Native DB

)

Crates.io Documentation License

All Contributors

这是一个适用于多平台应用(服务器、桌面、移动设备)的快速嵌入式数据库。轻松同步 Rust 类型。享受吧!😌🍃.

特性

  • 简单的 API 🦀。
  • 支持 多个索引(主索引、辅助索引、唯一索引、非唯一索引、可选索引)。
  • 最小化样板代码,请参阅 基准测试
  • 使用 native_model 进行透明的序列化和反序列化。
  • 自动模型迁移 🌟。
  • 线程安全 和完全 ACID 兼容 事务由 redb 提供。
  • 实时 订阅带有过滤器的 insertupdatedelete 操作。
  • 与所有 Rust 类型兼容(enumstructtuple 等)。
  • 热快照.

安装

将以下内容添加到您的 Cargo.toml

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

注意:native_db 需要 native_model 才能正常工作。

状态

积极开发。API 还不稳定,将来可能会发生变化。

如何使用?

示例

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
Akshith Madhur

💻

依赖关系

~2–5.5MB
~99K SLoC