18 个版本

0.4.0-rc.22024 年 4 月 14 日
0.3.12 2023 年 11 月 23 日
0.3.11 2023 年 10 月 26 日
0.3.8 2023 年 1 月 2 日
0.3.5 2022 年 7 月 29 日

数据库接口 中排名 669

Download history 6/week @ 2024-04-19 7/week @ 2024-05-17 3/week @ 2024-05-24 179/week @ 2024-07-26 18/week @ 2024-08-02

每月下载 197

BSD-4-Clause

200KB
5K SLoC

microrm 是一个提供在 SQLite 之上轻量级 ORM 的 crate。

与更复杂的 ORM 系统不同,microrm 旨在极其轻量级和代码简洁,这意味着它是具有偏见的,因此缺乏 SeaORM 或 Diesel 等工具的强大和灵活性。特别是,microrm 目前不尝试提供数据库迁移支持。

microrm 提供了两个组件:建模和查询。目标是建模是静态构建的;不直接支持动态模型,尽管是可能的。然而,由于 microrm 的设计不会触及其模型中未定义的表的内容,因此对于任何需要的动态组件,使用原始 SQL 可能是一个更好的选择。

查询支持用类型组合表示的 SQL 的小子集;有关更多信息,请参阅 QueryInterface

以下是一个使用 SQLite 表作为(索引的)键/值存储的简单示例

use microrm::prelude::*;
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, KVStore::Key);

let schema = microrm::Schema::new()
    .entity::<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().by(KVStore::Key, "a_key").one().expect("No errors encountered");

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

循环输出的模式(详细信息可能根据内部结构而变化)

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");

如果您在多线程或异步环境中使用 microrm,您需要使用 DBPool。然后您可以编写如下代码

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

async fn insert_a(dbp: &microrm::DBPool<'_>) {
    let qi = dbp.query_interface();
    qi.add(&KVStore {
        key: "a_key".to_string(),
        value: "a_value".to_string()
    });
}

async fn insert_b(dbp: &microrm::DBPool<'_>) {
    let qi = dbp.query_interface();
    qi.add(&KVStore {
        key: "b_key".to_string(),
        value: "b_value".to_string()
    });
}

# async_std::task::block_on(async { main().await });
// running in your favourite async runtime
async fn main() {
    # let schema = microrm::Schema::new().entity::<KVStore>();
    let db = microrm::DB::new_in_memory(schema).unwrap();
    let dbp = microrm::DBPool::new(&db);

    let a = insert_a(&dbp);
    let b = insert_b(&dbp);

    b.await;
    a.await;

    let qi = dbp.query_interface();

    let qr = qi.get().by(KVStore::Key, "a_key").one().unwrap();
    assert_eq!(qr.is_some(), true);
    assert_eq!(qr.as_ref().unwrap().key, "a_key");
    assert_eq!(qr.as_ref().unwrap().value, "a_value");

    let qr = qi.get().by(KVStore::Key, "b_key").one().unwrap();
    assert_eq!(qr.is_some(), true);
    assert_eq!(qr.as_ref().unwrap().key, "b_key");
    assert_eq!(qr.as_ref().unwrap().value, "b_value");
}

请注意,在获取 QueryInterface 引用并将其丢弃之间,您不能 .await 任何内容;编译器将(恰当地)发出警告。

依赖项

~23MB
~444K SLoC