Prisma ORM 第三章 新增 更新 删除

server/2024/10/25 10:41:20/

1. 新增数据

在 Prisma 中,新增数据是一个常见的操作,可以通过 create 和 createMany 方法来实现。这两个方法分别用于创建单个记录和多个记录。下面详细介绍这两个方法及其配置项。

1. create 方法

create 方法用于在数据库中创建单个记录。你可以指定要插入的数据,并且可以选择返回关联的数据。

  1. 基本语法
const newUser = await prisma.user.create({data: {name: 'John Doe',email: 'john.doe@example.com',age: 25,},
});
  1. 配置项
  • data:指定要插入的数据,可以包含多个字段。
  • select(可选):指定返回的数据字段。
  • include(可选):指定返回的关联数据。
  1. 示例
    假设你有一个 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 方法用于在数据库中创建多个记录。你可以一次性插入多条记录,提高性能。

  1. 基本语法
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,},],
});
  1. 配置项
  • 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 方法会返回一个对象,包含插入的记录数量。
  1. 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
// }
  1. 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 方法用于更新数据库中的单个记录。你需要提供一个唯一的标识符(通常是主键)来指定要更新的记录,以及要更新的数据。

  1. 基本语法
const updatedUser = await prisma.user.update({where: {id: 1, // 唯一标识符,用于找到要更新的记录},data: {name: 'Updated Name', // 要更新的字段和值age: 30,},
});
  1. 配置项
    • where:指定要更新的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
    • data:指定要更新的字段和对应的值。可以包含多个字段。
  2. 示例
    假设你有一个 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 方法用于“更新或插入”操作。如果记录存在,则更新记录;如果记录不存在,则插入新记录。这对于处理不确定记录是否存在的情况非常有用。

  1. 基本语法
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,},
});
  1. 配置项

    • where:指定要查找的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
    • update:如果记录存在,指定要更新的字段和对应的值。
    • create:如果记录不存在,指定要插入的新记录的数据。
  2. 示例
    假设你有一个 User 模型,包含以下字段:id、name、email、age。

  3. 更新或插入记录

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 配置项,可以控制返回的数据字段。
  1. 使用 select 控制返回字段
const updatedUser = await prisma.user.update({where: {id: 1,},data: {name: 'Updated Name',},select: {id: true,name: true,email: true,},
});console.log(updatedUser);
  1. 使用 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 方法用于删除数据库中的单个记录。你需要提供一个唯一的标识符(通常是主键)来指定要删除的记录。

  1. 基本语法
const deletedUser = await prisma.user.delete({where: {id: 1, // 唯一标识符,用于找到要删除的记录},
});
  1. 配置项
    • where:指定要删除的记录的唯一标识符。通常是一个对象,包含主键或其他唯一字段。
  2. 示例
    假设你有一个 User 模型,包含以下字段:id、name、email、age。
  • 删除单个记录
const deletedUser = await prisma.user.delete({where: {id: 1,},
});console.log(deletedUser);

2. deleteMany 方法

deleteMany 方法用于删除数据库中的多个记录。你需要提供一个过滤条件来指定要删除的记录集合。

  1. 基本语法
const deletedUsers = await prisma.user.deleteMany({where: {age: {gt: 30, // 删除年龄大于30的用户},},
});
  1. 配置项
  • where:指定要删除的记录的过滤条件。可以包含多个条件组合。
  1. 示例
    假设你有一个 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 块捕获和处理删除过程中可能出现的错误。
  • 级联删除:通过在模型定义中设置外键约束,实现删除记录时自动删除关联的记录。

http://www.ppmy.cn/server/134691.html

相关文章

基于Ubuntu24.04,下载并编译Android12系统源码 (一)

1. 前言 1.1 编译源码可以干什么 定制Android系统将最新版本的Android系统刷入到自己的Android设备中将整个系统源码导入到Android Studio中(可以不用编译源码来实现)。 只要有对应的Android源码版本的android.iml和android.ipr文件,就可以…

python基础综合案例(数据可视化-地图可视化)

1.基础地图使用 注意写名字的时候要写全名,比如上海市不能写出上海,不然看不到数据 鼠标点击即可看到数据 设置属性的时候不要忘记导包 # 演示地图可视化的基础使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准…

全栈面试题】模块5-1】Oracle/MySQL 数据库基础

目录 面试题5.1 Oracle和Mysql的区别? 面试题5.2 SQL语句有多少类型 面试题5.3 mysql常用数据类型、oracle常用数据类型 面试题5.4 char、varchar2、varchar有什么区别? 面试题5.5 什么是BLOB、CLOB?MySQL的Text类型了解过吗 面试题5.6 null的…

基于卷积神经网络和 Swin Transformer 的图像处理模型

实现了一个基于卷积神经网络和 Swin Transformer 的图像处理模型。该模型主要用于对输入图像进行特征提取和处理,以实现特定的图像任务,如图像增强、去噪等。 项目完整代码下载链接:https://download.csdn.net/download/huanghm88/89909179 import torch from torch import…

Parasoft C/C++test CT 荣获TÜV SÜD认证,在安全关键应用开发与验证方面达到最佳实践标准

新闻亮点 严格而全面的认证进一步巩固了Parasoft以安全、保障和质量为优先的发展流程。 前瞻性的功能支持与开源测试框架、现代开发工作流无缝对接。 C/Ctest CT 旨在大规模自动化,将久经考验的旗舰产品的优势扩展至更广泛的测试自动化和持续合规性领域。 在北美…

【Django】增加一个自定义字段

在查询GET的结果里增加自定义字段,这个字段只展示; 这样的字段通常有:枚举类型的、外键、其它查询内容; 枚举类型 1、在models.py里枚举类型的数据通常要使用 大写的字段名称 _CHOICES 来表示; class Snort(CoreMo…

使用休眠的方式来解决电脑合盖后偶尔不能正常睡眠的问题

背景描述 用过Windows笔记本电脑的用户应该都偶尔遇到过这样的一个问题,就是电脑直接合上盖后放在包里,按道理来说应该会自动进入睡眠模式,但是等电脑再从包里拿出来时发现电脑很烫,并且已经没电了,似乎并没有进入到休…

《PP-OCRv1》论文精读:PaddleOCR是目前SOTA级别的OCR开源技术(截止2024年10月)

PP-OCR: A Practical Ultra Lightweight OCR System论文地址PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System论文地址PP-OCRv3: More Attempts for the Improvement of Ultra Lightweight OCR System论文地址PaddleOCR Github OCR工具库 43.5K个star PP-OCRv1由百度…