Prisma Client API 概览
Prisma Client 提供了一组用于执行数据库操作的 API,支持 查询(find)、创建(create)、更新(update)、删除(delete) 等常见操作。以下是一些常见的 Prisma Client API 方法:
- findUnique / findFirst:查询单个记录。
- findMany:查询多个记录。
- create:创建新记录。
- update:更新已有记录。
- delete:删除记录。
- upsert:根据条件更新或创建记录。
- connect / disconnect:用于建立或断开关系。
- include / select:用于选择返回字段或嵌套查询。
### 基本操作示例
1. 查询操作
findUnique 和 findFirst 是用来查询单条记录的 API,区别在于 findUnique 要求查询字段是唯一的,而 findFirst 可以根据排序条件返回第一条记录。
// 使用 findUnique 查询
const user = await prisma.user.findUnique({
where: {
email: "example@example.com", // 这里是唯一约束
},
});
// 使用 findFirst 查询
const firstPost = await prisma.post.findFirst({
where: {
published: true,
},
orderBy: {
createdAt: 'desc',
},
});
2. 创建操作
create 用于创建新记录。你可以在 data 字段中提供需要插入的字段。
const newUser = await prisma.user.create({
data: {
name: "Alice",
email: "alice@example.com",
posts: {
create: [
{
title: "My First Post",
content: "This is the content of my first post",
},
],
},
},
});
3. 更新操作
update 用于更新现有记录,where 条件用于指定要更新的记录,data 字段指定要更新的字段。
const updatedUser = await prisma.user.update({
where: {
email: "alice@example.com", // 根据唯一字段查询
},
data: {
name: "Alice Updated",
posts: {
update: {
where: { id: 1 },
data: {
title: "Updated Post Title",
},
},
},
},
});
4. 删除操作
delete 用于删除记录,通常根据唯一字段或主键来查找并删除记录。
const deletedUser = await prisma.user.delete({
where: {
email: "alice@example.com",
},
});
5. 关联操作
connect 和 create 用于处理关联数据。假设有 Post 和 User 表,Post 表有一个外键 userId 关联到 User 表。
使用 connect 关联已存在的记录:
const updatedPost = await prisma.post.update({
where: {
id: 1,
},
data: {
user: {
connect: {
id: 1, // 关联已存在的用户
},
},
},
});
使用 create 创建新记录并关联:
const newPost = await prisma.post.create({
data: {
title: "New Post",
content: "Content of the new post",
user: {
create: {
name: "New User",
email: "newuser@example.com",
},
},
},
});
高级操作示例
1. 批量创建和批量更新
Prisma 支持批量操作,可以使用 createMany 和 updateMany 执行批量创建或更新操作。
批量创建多个用户:
const users = await prisma.user.createMany({
data: [
{ name: "User 1", email: "user1@example.com" },
{ name: "User 2", email: "user2@example.com" },
],
});
批量更新多个记录:
const updatedUsers = await prisma.user.updateMany({
where: {
email: {
in: ["user1@example.com", "user2@example.com"],
},
},
data: {
name: "Updated User",
},
});
2. 事务(transaction)操作
Prisma 提供了 transaction 方法,可以将多个数据库操作组合在一起,确保操作的原子性。
const [newUser, newPost] = await prisma.$transaction([
prisma.user.create({
data: { name: "Bob", email: "bob@example.com" },
}),
prisma.post.create({
data: { title: "Bob's Post", content: "Content of Bob's Post" },
}),
]);
3. 复杂查询:include 和 select
include 和 select 用于指定返回数据的结构。select 用于选择返回哪些字段,include 可以用于嵌套查询和关联查询。
查询用户和他们的所有帖子:
const userWithPosts = await prisma.user.findUnique({
where: {
email: "alice@example.com",
},
include: {
posts: true, // 包括用户的所有帖子
},
});
查询用户并仅选择特定字段:
const userWithSelectedFields = await prisma.user.findUnique({
where: {
email: "alice@example.com",
},
select: {
name: true, // 仅返回用户的名字
email: true,
},
});
4. 分页查询
Prisma 支持基于 skip 和 take 的分页操作。
const posts = await prisma.post.findMany({
skip: 0, // 跳过前 0 条记录
take: 10, // 获取接下来的 10 条记录
orderBy: {
createdAt: 'desc', // 按照创建时间降序排列
},
});
5. 聚合查询
Prisma 也支持聚合操作,如 count、avg、sum、min、max。
const aggregateResult = await prisma.post.aggregate({
_count: {
comments: true, // 计算每个帖子评论的数量
},
_avg: {
rating: true, // 计算帖子评分的平均值
},
_sum: {
views: true, // 计算帖子观看的总数
},
});