8 releases

0.7.1 Jul 15, 2024
0.7.0 Jun 24, 2024
0.6.1 May 9, 2024
0.5.3 Dec 27, 2023

#20 in Database implementations

Download history 61/week @ 2024-04-01 21/week @ 2024-04-08 32/week @ 2024-04-15 26/week @ 2024-04-22 193/week @ 2024-04-29 174/week @ 2024-05-06 33/week @ 2024-05-13 68/week @ 2024-05-20 58/week @ 2024-05-27 74/week @ 2024-06-03 50/week @ 2024-06-10 78/week @ 2024-06-17 211/week @ 2024-06-24 67/week @ 2024-07-01 52/week @ 2024-07-08 207/week @ 2024-07-15

550 downloads per month
Used in 5 crates (2 directly)

MIT license

400KB
3K SLoC

Native DB

)

Crates.io Documentation License

All Contributors

Here's a drop-in, fast, embedded database for multi-platform apps (server, desktop, mobile). Sync Rust types effortlessly. Enjoy! 😌🍃.

Features

  • Simple API 🦀.
  • Support for multiple indexes (primary, secondary, unique, non-unique, optional).
  • Minimal boilerplate see benchmarks.
  • Transparent serialization/deserialization using native_model.
  • Automatic model migration 🌟.
  • Thread-safe and fully ACID-compliant transactions provided by redb.
  • Real-time subscription with filters for insert, update and delete operations.
  • Compatible with all Rust types (enum, struct, tuple etc.).
  • Hot snapshots.

Installation

Add this to your Cargo.toml:

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

NOTE: native_db requires native_model to work.

Status

Active development. The API is not stable yet and may change in the future.

How to use?

Example

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(())
}

Contributors

Akshith Madhur
Akshith Madhur

💻

Dependencies

~2.3–5.5MB
~100K SLoC