19个不稳定版本 (3个重大更改)

0.4.6 2023年12月18日
0.4.4 2023年11月22日
0.3.13 2023年7月17日

#55数据库实现

Download history 83/week @ 2024-06-29 19/week @ 2024-07-27

每月100次下载

MIT 许可协议

81KB
1K SLoC

重要更新:此crate struct_db 已更名为 native_db,以更好地反映其功能和目的。请更新您的依赖项以使用 native_db 以获得最新功能和更新。

Struct DB 🔧🔩

Crates.io Linux/Windows/macOS/Android/iOS (Build/Test/Release) Documentation License

All Contributors

提供基于redb的快速、嵌入式数据库解决方案,专注于保持Rust类型和存储数据的最低冗余,支持多个索引、带有过滤器的实时监控、模式迁移,享受 😌🍃。

特性

  • 几乎与存储引擎redb一样快。
  • 嵌入式数据库(Linux、macOS、Windows、Android、iOS)。
  • 支持多个索引(唯一二级键)。
  • 与所有Rust类型兼容(enumstructtuple等)。
  • 使用显式类型或类型推断查询数据(getwatchiter等)。
  • 支持带有过滤器的实时订阅,用于insertupdatedelete操作。
  • 使用本地Rust强制转换进行模式迁移
  • 完全ACID合规的事务。
  • 计划添加您自己的序列化/反序列化逻辑(计划中)(例如:零拷贝)。
  • 线程安全。

状态

早期开发。尚未准备好投入生产。请关注路线图以了解1.0版本的发布。

如何使用?

请参阅docs.rs

示例

use serde::{Deserialize, Serialize};
use struct_db::*;

#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[struct_db(
    fn_primary_key(p_key),  // required
    fn_secondary_key(s_key),  // optional
    // ... other fn_secondary_key ...
)]
struct Data(u32, String);

impl Data {
  // Returns primary key as big-endian bytes for consistent lexicographical ordering.
  pub fn p_key(&self) -> Vec<u8> {
    self.0.to_be_bytes().to_vec()
  }

  // Generates a secondary key combining the String field and the big-endian bytes of
  // the primary key for versatile queries.
  pub fn s_key(&self) -> Vec<u8> {
    let mut s_key = self.1.as_bytes().to_vec();
    s_key.extend_from_slice(&self.p_key().as_slice());
    s_key
  }
 }

 fn main() {
  let mut db = Db::init_tmp("my_db_example").unwrap();
  // Initialize the schema
  db.define::<Data>();

  // Insert data
  let txn = db.transaction().unwrap();
  {
    let mut tables = txn.tables();
    tables.insert(&txn, Data(1,"red".to_string())).unwrap();
    tables.insert(&txn, Data(2,"red".to_string())).unwrap();
    tables.insert(&txn, Data(3,"blue".to_string())).unwrap();
  }
  txn.commit().unwrap();
   
  let txn_read = db.read_transaction().unwrap();
  let mut tables = txn_read.tables();
   
  // Retrieve data with p_key=3 
  let retrieve_data: Data = tables.primary_get(&txn_read, &3_u32.to_be_bytes()).unwrap().unwrap();
  println!("data p_key='3' : {:?}", retrieve_data);
   
  // Iterate data with s_key="red" String
  for item in tables.secondary_iter_start_with::<Data>(&txn_read, DataKey::s_key, "red".as_bytes()).unwrap() {
    println!("data s_key='1': {:?}", item);
  }
   
  // Remove data
  let txn = db.transaction().unwrap();
  {
    let mut tables = txn.tables();
    tables.remove(&txn, retrieve_data).unwrap();
  }
  txn.commit().unwrap();
 }

路线图

以下特性计划在1.0版本发布之前实现

  • 添加基准测试。
  • 添加文档。
  • redb(https://github.com/cberner/redb)的稳定版本或为Linux、macOS、Windows、Android、iOS实现另一个稳定存储引擎。
  • 添加支持自定义序列化/反序列化逻辑。
  • 为Linux、macOS、Windows、Android、iOS添加持续集成。
  • 在实际项目中使用。

贡献者

Akshith Madhur
Akshith Madhur

💻

依赖项

~1.4–4.5MB
~81K SLoC