6个版本
0.7.4 | 2024年6月10日 |
---|---|
0.1.6 | 2022年7月17日 |
0.1.3 | 2022年5月28日 |
#498 在 数据库接口
每月 37次下载
15KB
228 行
Sqlx Models ORM
基于SQLx的Rust ActiveRecord模式。编写惯用的数据库代码(仅限Postgres)。
[dependencies]
sqlx-models-orm = "0.1"
安装
阅读深入教程,该教程同时作为“厨房水槽”测试,见示例
以下是一些节省时间、减少样板代码的功能
模型
model!{
state: App,
table: humans,
struct Human {
#[sqlx_model_hints(int4, default)]
id: i32,
#[sqlx_model_hints(varchar)]
name: String,
#[sqlx_model_hints(int4)]
age: Option<i32>,
#[sqlx_model_hints(boolean, default)]
is_allowed_unlimited_cats: bool,
#[sqlx_model_hints(boolean)]
likes_dogs_too: bool,
},
has_many {
Cat(human_id),
}
}
创建
let alice = app.human()
.insert(InsertHuman{
name: "Alice".to_string(),
age: Some(19),
likes_dogs_too: true,
})
.save().await?;
assert_eq!(alice.attrs, HumanAttrs{
id: 1,
name: "Alice".to_string(),
age: Some(19),
is_allowed_unlimited_cats: false,
likes_dogs_too: true,
});
查询
let some_humans = app.human()
.select()
.limit(2)
.offset(1)
.likes_dogs_too_eq(false)
.order_by(HumanOrderBy::Name)
.desc(true)
.all().await?;
assert_eq!(some_humans, vec![alice]);
更新
let updated_alice = alice.update().use_struct(UpdateHuman{
name: Some("Alice Alison".to_string()),
age: Some(None),
is_allowed_unlimited_cats: Some(true),
..Default::default()
}).save().await?;
assert_eq!(updated_alice.attrs, HumanAttrs{
id: 1,
name: "Alice Alison".to_string(),
age: None,
is_allowed_unlimited_cats: true,
likes_dogs_too: true,
});
删除
alice.delete().await?;
设计原则
- 状态:您不应该明确传递连接池。
- 您的结构体,您的抽象:此crate具有一个proc宏,用于为单个数据库表的不同操作创建多个结构体。您可以为这些结构体中的任何一个添加任何方法。不同表中的相同操作的结构体实现了一个公共trait,以允许在这些表的操作中实现一定程度的泛化。
- 惯用而非高效:这应该很容易学习和使用,即使有性能折衷。
- 回退到SQLx:始终使回退自定义查询和性能增强成为可能。
- 每个查询一个表。在ORM中为连接表重新发明SQL难以调试和理解。优先考虑多个单表查询而不是单个多表查询。(见上一项)。
- 仅编译时检查查询。没有SQL注入的机会,无需进行愚蠢的测试,代价是查询更长。
- 目前仅限Postgres。对此表示歉意 :(
依赖
~58MB
~1M SLoC