部分类型
自 v0.6.7 起可用
该 partial_unchecked!
宏可以在所有模型模块中找到,并允许定义具有 to_params
函数的结构体,该函数将其转换为在 update_unchecked
内部使用。生成的结构体的每个字段都与模块中 Data
结构体中的等效字段具有相同的类型,只是包装在 Option
中。
这对于使用 axum
(在新标签页中打开) 或 rspc
(在新标签页中打开) 构建的 Web API 等内容很有用,因为接收更新作为结构体而不是更改列表会更符合人体工程学。
更通用的 partial!
宏尚不存在,因为在支持 嵌套写入 (在新标签页中打开) 之前无法支持关系。
设置
使用部分宏需要与 选择 & 包含 相同的设置,因为必须提供 module_path
。
示例
给定以下模式
model Post {
id Int @id @default(autoincrement())
title String
content String
}
可以这样编写更新器函数
post::partial_unchecked!(PostUpdateData {
title
content
})
pub async fn update_post(
db: &PrismaClient,
id: i32,
data: PostUpdateData
) {
db.post()
.update_unchecked(post::id::equals(id), data.to_params())
.exec()
.await;
}
上面对 partial_unchecked!
的使用会生成类似以下内容
pub struct PostUpdateData {
title: Option<String>,
content: Option<String>
}
impl PostUpdateData {
pub fn to_params(self) -> Vec<post::UncheckedSetParam> {
[
self.title.map(post::title::set),
self.content.map(post::content::set)
].into_iter().flatten().collect()
}
}