额外
批量查询

批量操作

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(..)]),
)]);