10 个版本 (5 个破坏性更新)
0.6.0 | 2024 年 7 月 23 日 |
---|---|
0.5.4 | 2024 年 6 月 26 日 |
0.4.0 | 2024 年 6 月 15 日 |
0.3.3 | 2024 年 6 月 8 日 |
0.1.0 | 2024 年 5 月 27 日 |
#406 在 异步
每月 122 次下载
19KB
280 行
light-magic
轻量级、快速且易于使用的 持久 内存数据库
实现。
功能
请注意,此数据库针对读取操作进行了高度优化。使用 open
时写入数据库相对较慢,因为每个写入操作都涉及将数据写入磁盘。这些写入是原子性的,确保系统崩溃时不会丢失数据。
- 持久数据存储:数据可以通过
open
自动且持久地保存到格式化的JSON
文件中,或者可以通过open_in_memory
在内存中操作。 - 易于表格标记:利用 Rust 优美的类型系统、结构和特性。
- 强大的数据访问函数:利用
search
和join!
宏等函数进行高效的数据搜索和连接。 - 高效存储:数据库使用自定义的
Table
数据类型,底层使用std::collections
中的BTreeMap
类型,以实现高效的存储和易于访问的表。 - 并行访问支持:使用
Arc<AtomicDatabase<_>>
并行访问数据库。
...还有更多。查看 待办事项 了解更多计划中的功能!
安装
将此内容添加到您的 Cargo.toml
[dependencies]
light_magic = "0.5.4"
示例
在 axum
服务器中使用?请查看:[maud-magic-rs](https://github.com/nwrenger/maud-magic-rs)。否则,查看此通用示例
use light_magic::{
atomic::DataStore,
join,
serde::{Deserialize, Serialize},
table::{PrimaryKey, Table},
};
#[derive(Default, Debug, Serialize, Deserialize)]
struct Database {
user: Table<User>,
permission: Table<Permission>,
criminal: Table<Criminal>,
settings: Settings,
}
impl DataStore for Database {}
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
struct User {
id: usize,
name: String,
kind: String,
}
impl PrimaryKey for User {
type PrimaryKeyType = usize;
fn primary_key(&self) -> &Self::PrimaryKeyType {
&self.id
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
struct Permission {
user_name: String,
level: Level,
}
impl PrimaryKey for Permission {
type PrimaryKeyType = String;
fn primary_key(&self) -> &Self::PrimaryKeyType {
&self.user_name
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
enum Level {
#[default]
Admin,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
struct Criminal {
user_name: String,
entry: String,
}
impl PrimaryKey for Criminal {
type PrimaryKeyType = String;
fn primary_key(&self) -> &Self::PrimaryKeyType {
&self.user_name
}
}
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
struct Settings {
time: usize,
password: String,
}
fn main() {
let db = Database::open("./tests/test.json");
db.write().user.add(User {
id: 0,
name: String::from("Nils"),
kind: String::from("Young"),
});
println!("{:?}", db.read().user.get(&0));
println!("{:?}", db.read().user.search(|user| { user.name.contains("Nils") }));
db.write().permission.add(Permission {
user_name: String::from("Nils"),
level: Level::Admin,
});
println!("{:?}", db.read().permission.get(&String::from("Nils")));
println!("{:?}", db.read().permission.search(|permission| { permission.level == Level::Admin }));
db.write().criminal.add(Criminal {
user_name: String::from("Nils"),
entry: String::from("No records until this day! Keep ur eyes pealed!"),
});
println!("{:?}", db.read().criminal.get(&String::from("Nils")));
println!("{:?}", db.read().criminal.search(|criminal| { criminal.entry.contains("No records") }));
db.write().settings = Settings {
time: 1718744090,
password: String::from("password"),
};
println!("{:?}", db.read().settings);
let joined = join!(db.read(), "Nils", user => name, permission => user_name, criminal => user_name);
println!("{:?}", joined);
}
待办事项
目前无
依赖项
~1.6–2.6MB
~52K SLoC