Partial Types
Available since v0.6.7
The partial_unchecked!
macro can be found in all model modules,
and allows structs to be defined that have a to_params
function which converts them for use inside update_unchecked
.
Each field of the generated structs has the same type as the equivalent field in the module's Data
struct,
just wrapped inside Option
.
This can be useful for thing like web APIs built with
axum
(opens in a new tab) or
rspc
(opens in a new tab),
where receiving updates is more ergonomic as structs rather than a list of changes.
A more general partial!
does not yet exist,
as supporting relations is not possible until nested writes (opens in a new tab)
are supported.
Setup
Using partial macros requires the same setup as Select & Include,
as module_path
must be provided.
Example
Given the following schema:
model Post {
id Int @id @default(autoincrement())
title String
content String
}
An updater function can be written like so:
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;
}
The above use of partial_unchecked!
generates something like the following:
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()
}
}