21个版本
0.3.2 | 2024年8月6日 |
---|---|
0.3.1 | 2024年5月21日 |
0.2.1 | 2023年6月29日 |
0.1.18 | 2023年3月27日 |
0.1.16 | 2023年2月18日 |
#79 in #type-safe
每月242次下载
在 2 crate 中使用
8KB
68 行
db-rs
Rustaceans的舒适、嵌入式、单线程数据库。
优点
- 在Rust中定义模式。
- 只要它们实现
Serialize
和Deserialize
,就可以在数据库中使用您的类型。您不必费心将数据转换为数据库特定的类型。 - 所有数据库交互都是类型安全的。当您键入
db.
时,您的工具将建议一个您表格的列表。当您选择一个表格时,您将看到一个填充了您类型的表格类型合同。无需手动编写类型安全的合同来包装您的数据库。 - 支持多种简单的数据结构,包括LookupTables、Lists等。实现您自己的表格类型是微不足道的。
- 所有表格变异都使用您类型的快速、紧凑的bincode表示形式持久化到只追加日志中。
- 您可以使用
begin_transaction()
表达对多个表格的原子更新。
快速入门
将以下内容添加到您的 Cargo.toml
db-rs = "0.3.1"
db-rs-derive = "0.3.1"
定义您的模式
use db_rs_derive::Schema;
use db_rs::{Single, List, LookupTable};
#[derive(Schema)]
struct SchemaV1 {
owner: Single<Username>,
admins: List<Username>,
users: LookupTable<Username, Account>,
}
初始化您的数据库
use db_rs::Db;
use db_rs::Config;
let mut db = SchemaV1::init(Config::in_folder("/tmp/test/"))?;
db.owner.insert("Parth".to_string())?;
println!("{}", db.owner.data().unwrap());
表格类型
每个表格都有一个内存表示形式和相应的日志条目格式。例如[List]的内存格式是[Vec],您可以通过查看它的对应 list::LogEntry 来了解写入磁盘的方式。
以Lookup
开头的表格在它们的内存格式中包含一个HashMap
。[LookupTable]是最一般的形式,而[LookupList]和[LookupSet]是针对希望使用HashMap<K, Vec<V>>
或HashMap<K, HashSet<V>>
的人的特殊化。它们存在的原因是在对特定的Vec或
HashSet
进行小修改时提供更好的日志性能(请参阅lookup_list::LogEntry或lookup_set::LogEntry)。
日志压缩
在任何时刻,您都可以在数据库上调用 Db::compact_log。这将原子地写入所有当前表的紧凑表示。例如,如果LookupTable中的一个键被多次写入,紧凑表示将只包含最后一个值。每种表类型都有自己定义的紧凑表示。
如果您的数据库在 Arc<Mutex>>
中,您还可以使用 [BackgroundCompacter],它将在单独的线程中定期执行压缩。
事务和批量写入
您可以使用 Db::begin_transaction 来开始事务,这将允许您表达可以被当作一组丢弃的批量操作,如果程序被中断。目前还没有取消事务的方法。事务也是批量写入的机制,日志条目在事务完成前保存在内存中,并一次性写入磁盘。
研究和思考的活跃领域
- 由于数据库实现(如redis)是单线程的,这迫使我们通过低延迟而不是并发来通过应用吞吐量。目前,这符合我们的需求。仅仅嵌入式就比像Postgres这样的东西提供了更多的吞吐量。在服务器式设置中使用时,请将数据库放在
Arc<Mutex<>>
中。 - 数据库目前没有提供工具来定义完整性约束,除了Rust类型系统隐式强制执行的约束之外(例如非空)。对我们来说,这仅仅是一个应用程序方面的关注点。
功能
clone
- 在所有表类型上派生克隆。克隆数据库之间的一致性没有提供。在测试情况下很有用。
使用于
许可证:BSD-3-Clause
依赖项
~1.6–2.2MB
~50K SLoC