Crates.io | native_db |
lib.rs | native_db |
version | 0.8.1 |
source | src |
created_at | 2023-12-18 22:26:55.346432 |
updated_at | 2024-10-14 19:56:37.729723 |
description | Drop-in embedded database |
homepage | |
repository | https://github.com/vincent-herlemont/native_db |
max_upload_size | |
id | 1073747 |
size | 7,323,899 |
Here's a drop-in, fast, embedded database for multi-platform apps (server, desktop, mobile). Sync Rust types effortlessly. Enjoy! 😌🍃.
sqlite
vs redb
vs native_db
benchmarks.bincode
, postcard
, your own etc.).insert
, update
and delete
operations.enum
, struct
, tuple
etc.).Add this to your Cargo.toml
:
[dependencies]
native_db = "0.8.1"
native_model = "0.4.20"
NOTE: native_db
requires native_model
to work.
Active development. The API is not stable yet and may change in the future.
If you want to propose your project or company that uses Native DB, please open a PR.
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()?;
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(())
}