首页 > 其他分享 >Sequelize软删除paranoid

Sequelize软删除paranoid

时间:2022-10-14 18:47:22浏览次数:84  
标签:删除 paranoid await destroy Post Sequelize post

Sequelize 实现软删除(paranoid)

Sequelize 支持 paranoid 表的概念. 一个 paranoid 表是一个被告知删除记录时不会真正删除它的表.反而一个名为 deletedAt 的特殊列会将其值设置为该删除请求的时间戳,这意味着偏执表会执行记录的 软删除,而不是 硬删除.

将模型定义为 paranoid

要定义 paranoid 模型,必须将 paranoid: true 参数传递给模型定义. Paranoid 需要时间戳才能起作用(即,如果你传递 timestamps: false 了,paranoid 将不起作用).

你还可以将默认的列名(默认是 deletedAt)更改为其他名称.

 

class Post extends Model {}
Post.init({ /* 这是属性 */ }, {
  sequelize,
  paranoid: true,

  // 如果要为 deletedAt 列指定自定义名称
  deletedAt: 'destroyTime'
});

删除

当你调用 destroy 方法时,将发生软删除:

await Post.destroy({
  where: {
    id: 1
  }
});
// UPDATE "posts" SET "deletedAt"=[timestamp] WHERE "deletedAt" IS NULL AND "id" = 1

如果你确实想要硬删除,并且模型是 paranoid,则可以使用 force: true 参数强制执行:

await Post.destroy({
  where: {
    id: 1
  },
  force: true
});
// DELETE FROM "posts" WHERE "id" = 1

上面的示例以静态的 destroy 方法为例(Post.destroy),所有实例方法的工作方式相同:

const post = await Post.create({ title: 'test' });
console.log(post instanceof Post); // true
await post.destroy(); // 只设置 `deletedAt` 标志
await post.destroy({ force: true }); // 真的会删除记录

恢复

要恢复软删除的记录,可以使用 restore 方法,该方法在静态版本和实例版本中都提供:

// 展示实例 `restore` 方法的示例
// 我们创建一个帖子,对其进行软删除,然后将其还原
const post = await Post.create({ title: 'test' });
console.log(post instanceof Post); // true
await post.destroy();
console.log('soft-deleted!');
await post.restore();
console.log('restored!');

// 展示静态 `restore` 方法的示例.
// 恢复每个 likes 大于 100 的软删除的帖子
await Post.restore({
  where: {
    likes: {
      [Op.gt]: 100
    }
  }
});

其他查询行为

Sequelize 执行的每个查询将自动忽略软删除的记录(当然,原始查询除外).

这意味着,例如,findAll 方法将看不到软删除的记录,仅获取未删除的记录.

即使你单纯的调用提供了软删除记录主键的findByPk,结果也将是 null,就好像该记录不存在一样.

如果你真的想让查询看到被软删除的记录,可以将 paranoid: false 参数传递给查询方法. 例如:

await Post.findByPk(123); // 如果 ID 123 的记录被软删除,则将返回 `null`
await Post.findByPk(123, { paranoid: false }); // 这将检索记录

await Post.findAll({
  where: { foo: 'bar' }
}); // 这将不会检索软删除的记录

await Post.findAll({
  where: { foo: 'bar' },
  paranoid: false
}); // 这还将检索软删除的记录

Sequelize: https://www.sequelize.cn/core-concepts/paranoid

标签:删除,paranoid,await,destroy,Post,Sequelize,post
From: https://www.cnblogs.com/UnfetteredMan/p/16792600.html

相关文章

  • ALV 导出电子表格的文件格式固定的删除办法
    在ALV显示中,选择菜单“列表-导出-电子表格”后,会出现下面这样的选择窗口:如果选中了“始终使用选定的格式”,则以后都会使用当前选定的格式(经常是第一项MHTML,可实际上用户希......
  • 一种实现文件定期删除方法
    需求:实现文件过期自动删除。大致思路:1、获取文件time2、跟当前时间做比较3、删除知识点:获取文件time方法?linux可以通过stat方法查看文件的时间,但是会发现有三......
  • Liunx文件定期本地备份、异地备份、删除备份脚本
    导航一.背景二.依赖功能介绍三.本地备份脚本四.异地备份脚本五.定期删除备份六.github脚本地址----------分割线----------一.背景1.总会出出现......
  • 83. 删除排序链表中的重复元素
    题目描述给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例代码varremoveDuplicates=function(nums){if(n......
  • 26. 删除有序数组中的重复项
    题目描述给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语......
  • 关于Surge本地订阅工具sub-store删除组合订阅error
    打开surge,【工具】>【脚本编辑器】【设置】>【$persistentStore】找到【sub-store】找到“artifacts”找到你创建的组合订阅$name,删掉它!注意格式,中括号......
  • 删除审计表AUD$的相关测试
    文档课题:删除审计表AUD$的相关测试.数据库:oracle11.2.0.464位1、开启审计sys@ORCL2022-10-1220:27:47>showparameterauditNAMETYP......
  • 删除审计表aud$,用户无法连接数据库的测试
    文档课题:删除审计表aud$,用户无法连接数据库的测试.数据库:oracle11.2.0.464位系统:centos7.964位环境:单实例1、理论知识数据库开启审计的情况下,aud$会记录非sys用户的登陆......
  • 19. 删除链表的倒数第 N 个结点
    题目描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。样例输入输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]输入:head=[1],n=1输出:[]代码参......
  • Java在PDF文档中添加或删除页面
    前言当你编辑一个PDF文档时,有时需要删除文档中多余的页面或向文档中添加新的页面。本文将向您演示如何使用Spire.PDFforJava在PDF文档中添加或删除页面。 程序环境......