18 个版本
0.4.0-rc.2 | 2024 年 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
每月下载 197 次
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: µrm::DBPool<'_>) {
let qi = dbp.query_interface();
qi.add(&KVStore {
key: "a_key".to_string(),
value: "a_value".to_string()
});
}
async fn insert_b(dbp: µrm::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