1. 新增数据
在 Prisma 中,新增数据是一个常见的操作,可以通过 create 和 createMany 方法来实现。这两个方法分别用于创建单个记录和多个记录。下面详细介绍这两个方法及其配置项。
1. create 方法
create 方法用于在数据库中创建单个记录。你可以指定要插入的数据,并且可以选择返回关联的数据。
- 基本语法
const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},
});
- 配置项
- data:指定要插入的数据,可以包含多个字段。
- select(可选):指定返回的数据字段。
- include(可选):指定返回的关联数据。
- 示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。
- 创建单个记录
const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},
});console.log(newUser);
- 创建记录并返回特定字段
const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},select: {id: true,name: true,email: true,},
});console.log(newUser);
- 创建记录并返回关联数据
假设 User 模型有一个关联的 Post 模型:
const newUserWithPosts = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,posts: {create: [{title: 'My First Post',content: 'This is my first post.',},],},},include: {posts: true,},
});console.log(newUserWithPosts);
2. createMany 方法
createMany 方法用于在数据库中创建多个记录。你可以一次性插入多条记录,提高性能。
- 基本语法
const createdUsers = await prisma.user.createMany({data: [{name: 'John Doe',email: 'john.doe@example.com',age: 25,},{name: 'Jane Smith',email: 'jane.smith@example.com',age: 30,},],
});
- 配置项
-
data:指定要插入的数据数组,每个元素是一个对象,包含要插入的字段和值。
-
skipDuplicates(可选):布尔值,表示是否跳过重复的记录(默认为 false)。
-
示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。 -
创建多个记录
const createdUsers = await prisma.user.createMany({data: [{name: 'John Doe',email: 'john.doe@example.com',age: 25,},{name: 'Jane Smith',email: 'jane.smith@example.com',age: 30,},],
});console.log(createdUsers);
- 创建多个记录并跳过重复记录
const createdUsers = await prisma.user.createMany({data: [{name: 'John Doe',email: 'john.doe@example.com',age: 25,},{name: 'Jane Smith',email: 'jane.smith@example.com',age: 30,},],skipDuplicates: true,
});console.log(createdUsers);
3. 返回值
- create 方法会返回新创建的记录对象。
- createMany 方法会返回一个对象,包含插入的记录数量。
- create 方法的返回值
const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},
});console.log(newUser);
// 输出:
// {
// id: 1,
// name: 'John Doe',
// email: 'john.doe@example.com',
// age: 25
// }
- createMany 方法的返回值
const createdUsers = await prisma.user.createMany({data: [{name: 'John Doe',email: 'john.doe@example.com',age: 25,},{name: 'Jane Smith',email: 'jane.smith@example.com',age: 30,},],
});console.log(createdUsers);
// 输出:
// {
// count: 2 // 插入了2条记录
// }
4. 处理创建失败的情况
在创建记录时,可能会遇到一些错误,例如唯一约束冲突或数据库连接问题。你可以使用 try-catch 块来捕获和处理这些错误。
- 示例
try {const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},});console.log('User created successfully:', newUser);
} catch (error) {if (error instanceof Prisma.PrismaClientKnownRequestError) {if (error.code === 'P2002') {console.error('Unique constraint violation:', error.meta.target);} else {console.error('An unexpected error occurred:', error);}} else {console.error('An unexpected error occurred:', error);}
}
5. 总结
- create:用于创建单个记录。
- createMany:用于创建多个记录。
- data:指定要插入的数据,可以包含多个字段。
- select(可选):指定返回的数据字段。
- include(可选):指定返回的关联数据。
- skipDuplicates(可选):在 createMany 中,表示是否跳过重复的记录。
- 返回值:create 方法返回新创建的记录对象,createMany 方法返回一个包含插入记录数量的对象。
- 错误处理:使用 try-catch 块捕获和处理创建过程中可能出现的错误。
2. 更新数据
1. update 方法
update 方法用于更新数据库中的单个记录。你需要提供一个唯一的标识符(通常是主键)来指定要更新的记录,以及要更新的数据。
- 基本语法
const updatedUser = await prisma.user.update({where: {id: 1, // 唯一标识符,用于找到要更新的记录},data: {name: 'Updated Name', // 要更新的字段和值age: 30,},
});
- 配置项
- where:指定要更新的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
- data:指定要更新的字段和对应的值。可以包含多个字段。
- 示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。
- 更新单个字段
const updatedUser = await prisma.user.update({where: {id: 1,},data: {name: 'Updated Name',},
});console.log(updatedUser);
- 更新多个字段
const updatedUser = await prisma.user.update({where: {id: 1,},data: {name: 'Updated Name',age: 30,},
});console.log(updatedUser);
2. upsert 方法
upsert 方法用于“更新或插入”操作。如果记录存在,则更新记录;如果记录不存在,则插入新记录。这对于处理不确定记录是否存在的情况非常有用。
- 基本语法
const updatedOrCreatedUser = await prisma.user.upsert({where: {email: 'john.doe@example.com', // 唯一标识符,用于找到要更新的记录},update: {name: 'Updated Name', // 如果记录存在,要更新的字段和值},create: {name: 'New User', // 如果记录不存在,要插入的新记录的数据email: 'john.doe@example.com',age: 25,},
});
-
配置项
- where:指定要查找的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
- update:如果记录存在,指定要更新的字段和对应的值。
- create:如果记录不存在,指定要插入的新记录的数据。
-
示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。 -
更新或插入记录
const updatedOrCreatedUser = await prisma.user.upsert({where: {email: 'john.doe@example.com',},update: {name: 'Updated Name',},create: {name: 'New User',email: 'john.doe@example.com',age: 25,},
});console.log(updatedOrCreatedUser);
3. 返回值
- update 和 upsert 方法都会返回更新后的记录对象。
- 如果使用 select 或 include 配置项,可以控制返回的数据字段。
- 使用 select 控制返回字段
const updatedUser = await prisma.user.update({where: {id: 1,},data: {name: 'Updated Name',},select: {id: true,name: true,email: true,},
});console.log(updatedUser);
- 使用 include 控制返回关联数据
const updatedUserWithPosts = await prisma.user.update({where: {id: 1,},data: {name: 'Updated Name',},include: {posts: true,},
});console.log(updatedUserWithPosts);
4. 总结
- update:用于更新已存在的记录。
- upsert:用于更新已存在的记录或插入新记录。
- where:指定要更新的记录的唯一标识符。
- data:指定要更新的字段和值。
- update:在 upsert 中,如果记录存在,指定要更新的字段和值。
- create:在 upsert 中,如果记录不存在,指定要插入的新记录的数据。
- select 和 include:用于控制返回的数据字段和关联数据。
3. 删除数据
在 Prisma 中,删除数据是一个常见的操作,可以通过 delete 和 deleteMany 方法来实现。这两个方法分别用于删除单个记录和多个记录。下面详细介绍这两个方法及其配置项。
1. delete 方法
delete 方法用于删除数据库中的单个记录。你需要提供一个唯一的标识符(通常是主键)来指定要删除的记录。
- 基本语法
const deletedUser = await prisma.user.delete({where: {id: 1, // 唯一标识符,用于找到要删除的记录},
});
- 配置项
- where:指定要删除的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
- 示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。
- 删除单个记录
const deletedUser = await prisma.user.delete({where: {id: 1,},
});console.log(deletedUser);
2. deleteMany 方法
deleteMany 方法用于删除数据库中的多个记录。你需要提供一个过滤条件来指定要删除的记录集合。
- 基本语法
const deletedUsers = await prisma.user.deleteMany({where: {age: {gt: 30, // 删除年龄大于30的用户},},
});
- 配置项
- where:指定要删除的记录的过滤条件。可以包含多个条件组合。
- 示例
假设你有一个 User 模型,包含以下字段:id、name、email、age。
- 删除多个记录
const deletedUsers = await prisma.user.deleteMany({where: {age: {gt: 30, // 删除年龄大于30的用户},},
});console.log(deletedUsers);
3. 返回值
-
delete 方法会返回被删除的记录对象。
-
deleteMany 方法会返回一个对象,包含删除的记录数量。
-
delete 方法的返回值
const deletedUser = await prisma.user.delete({where: {id: 1,},
});console.log(deletedUser);
// 输出:
// {
// id: 1,
// name: 'John Doe',
// email: 'john.doe@example.com',
// age: 25
// }
- deleteMany 方法的返回值
const deletedUsers = await prisma.user.deleteMany({where: {age: {gt: 30,},},
});console.log(deletedUsers);
// 输出:
// {
// count: 5 // 删除了5条记录
// }
4. 处理删除失败的情况
在删除记录时,可能会遇到一些错误,例如记录不存在或数据库连接问题。你可以使用 try-catch 块来捕获和处理这些错误。
- 示例
try {const deletedUser = await prisma.user.delete({where: {id: 1,},});console.log('User deleted successfully:', deletedUser);
} catch (error) {if (error instanceof Prisma.PrismaClientKnownRequestError) {if (error.code === 'P2025') {console.error('Record to delete does not exist:', error.meta.target);} else {console.error('An unexpected error occurred:', error);}} else {console.error('An unexpected error occurred:', error);}
}
5. 删除关联数据
在删除记录时,你可能需要同时删除关联的记录。这可以通过在模型定义中设置外键约束来实现
。例如,假设 User 模型有一个关联的 Post 模型,你可以设置级联删除。
- 模型定义(prisma)
model User {id Int @id @default(autoincrement())name Stringemail String @uniqueage Intposts Post[]
}model Post {id Int @id @default(autoincrement())title Stringcontent Stringauthor User @relation(fields: [authorId], references: [id], onDelete: Cascade)authorId Int
}
- 在这个例子中,onDelete: Cascade 表示当删除一个 User 记录时,所有关联的 Post 记录也会被删除。
6. 总结
- delete:用于删除单个记录。
- deleteMany:用于删除多个记录。
- where:指定要删除的记录的唯一标识符或过滤条件。
- 返回值:delete 方法返回被删除的记录对象,deleteMany 方法返回一个包含删除记录数量的对象。
- 错误处理:使用 try-catch 块捕获和处理删除过程中可能出现的错误。
- 级联删除:通过在模型定义中设置外键约束,实现删除记录时自动删除关联的记录。