Lightweight SQLite ORM

Kestrel f8a97613e5 Bump release version. 2 роки тому
microrm f8a97613e5 Bump release version. 2 роки тому
microrm-macros 5895592190 Bump version number for release. 2 роки тому
.gitignore 1664a33360 Fix sqlite reference to use re_export and clippy nits. 2 роки тому
.vimrc 7d21ceba7d rustfmt pass and get_one_by_multi support. 2 роки тому
Cargo.lock 60307a38d6 Fix get_one_by_multi implementation. 2 роки тому
Cargo.toml c8daec95a8 Add cargo workspace. 2 роки тому
README.md 63f4deec8c Rearrange where README.md is and where the symlink is. 2 роки тому

README.md

microrm is a crate providing a lightweight ORM on top of SQLite.

Unlike fancier ORM systems, microrm is intended to be extremely lightweight and code-light, which means that by necessity it is opinionated, and thus lacks the power and flexibility of, say, SeaORM or Diesel. In particular, microrm currently makes no attempts to provide database migration support.

microrm provides two components: modeling and querying. The intention is that the modelling is built statically; dynamic models are not directly supported though are possible. However, since by design microrm does not touch database contents for tables not defined in its model, using raw SQL for any needed dynamic components may be a better choice.

Querying supports a small subset of SQL expressed as type composition.

A simple example using an SQLite table as an (indexed) key/value store might look something like this:

use microrm::{Entity,make_index};
#[derive(Debug,Entity,serde::Serialize,serde::Deserialize)]
pub struct KVStore {
    pub key: String,
    pub value: String
}

// the !KVStoreIndex here means a type representing a unique index named KVStoreIndex
make_index!(!KVStoreIndex, KVStoreColumns::Key);

let schema = microrm::model::SchemaModel::new()
    .add::<KVStore>()
    .index::<KVStoreIndex>();

// dump the schema in case you want to inspect it manually
for create_sql in schema.create() {
    println!("{};", create_sql);
}

let db = microrm::DB::new_in_memory(schema).unwrap();
let qi = db.query_interface();

qi.add(&KVStore {
    key: "a_key".to_string(),
    value: "a_value".to_string()
});

// because KVStoreIndex indexes key, this is a logarithmic lookup
let qr = qi.get_one_by(KVStoreColumns::Key, "a_key");

assert_eq!(qr.is_some(), true);
assert_eq!(qr.as_ref().unwrap().key, "a_key");
assert_eq!(qr.as_ref().unwrap().value, "a_value");

The schema output from the loop is (details subject to change based on internals):

CREATE TABLE IF NOT EXISTS "kv_store" (id integer primary key,"key" text,"value" text);
CREATE UNIQUE INDEX "kv_store_index" ON "kv_store" ("key");