批量操作
PrismaClient::_batch
允许您在单个事务中顺序执行多个查询。如果其中一个查询失败,所有更改都将回滚。
提供给 _batch
的数据分为两类
-
容器:包含批处理中所有项目的根级集合。可以是元组,也可以是实现
IntoIter
的类型。 -
项目:查询或嵌套查询的集合(
Vec
或元组)。
容器
即使您的批处理不包含嵌套项目,您仍然需要将查询放入某种容器中。
元组
使用元组允许一次使用多种类型的查询。 _batch
的返回类型将是每个项目结果的元组。
use prisma::user;
let (user_one, user_two, user_count): (user::Data, user::Data, i64) = client
._batch((
client.user().create(..),
client.user().create(..),
client.user().count(vec![]),
))
.await?;
assert_eq!(user_count, 2);
迭代器
使用实现 IntoIter
的类型(例如 Vec
)允许将动态数量的项目一起批处理。返回类型将是项目结果的 Vec
。
use prisma::user;
let users: Vec<user::Data> = client
._batch(vec![
client.user().create(..),
client.user().create(..),
client.user().create(..)
])
.await?;
assert_eq!(users.len(), 3);
IntoIter
包括常规迭代器,因此您可以将它们直接传递给 _batch
,并且 collect
将在内部被调用。
use prisma::user;
let user_ids = vec![1, 2, 3, 4, 5];
let user_creates = user_ids
.into_iter()
.map(|id| client
.user()
.create(..)
); // _batch will collect internally!
let users: Vec<user::Data> = client
._batch(user_creates)
.await?;
assert_eq!(users.len(), 5);
项目
项目可以是单个查询或集合。
元组
与元组容器相同,元组项目的逻辑也适用,项目的结果是每个查询与其结果类型的一对一映射。
let data: Vec<(user::Data, post::Data)> = client
._batch(vec![
(client.user().create(..), client.post().create(..)),
(client.user().create(..), client.post().create(..)),
])
.await?;
Vec
与容器不同,只有 Vec
可用于查询的动态集合。除此之外,行为相同。
let data: (Vec<user::Data>, Vec<post::Data>) = client
._batch((
vec![client.user().create(..), client.user().create(..)],
vec![client.post().create(..), client.post().create(..)],
))
.await?;
嵌套
任何项目组合和嵌套都可以放入容器中,从而允许高度嵌套的返回类型。
此示例在实践中并不实用,但它是可能的。
let data: Vec<(
Vec<(user::Data, post::data)>,
(Vec<user::Data>, Vec<post::Data>),
)> = client._batch(vec![(
vec![
(client.user().create(..), client.post().create(..)),
(client.user().create(..), client.post().create(..)),
],
(vec![client.user().create(..)], vec![client.post().create(..)]),
)]);