当前位置: 首页 > 知识库问答 >
问题:

如何使用sequelize删除关联行

程志新
2023-03-14

我正在尝试删除与表中一行相关联的行,而不删除主行(因此不能使用级联)。

这是一个原始的PostgreSQL查询,它实现了我想用SQL实现的功能。sequelize是否能够生成这样查询:

DELETE FROM session USING user WHERE session.user_id = user.id AND user.username = 'bob'

模型是(不包括不相关的列):

create table user (
  id uuid primary key default uuid_generate_v4(),
  username text UNIQUE NOT NULL
);

create table session (
  id uuid primary key default uuid_generate_v4(),
  user_id uuid NOT NULL references user(id) ON DELETE CASCADE
);

关联在SEQELIZE中定义为:

Session.belongsTo(models.User, {
  foreignKey: "user_id"
});

User.hasMany(models.Session, {
  foreignKey: "user_id"
});

查询的另一个版本可以是:

DELETE FROM session WHERE session.user_id = (SELECT user_id FROM user WHERE username = 'bob');

但我认为sequelize还不能处理子查询?

我尝试了一些类似的方法:

return Session.destroy({
  include: [
    { model: User, where: { username: 'bob' }}
  ],
  truncate: false
});

然而,后遗症抱怨道:

错误:Model.Destroy得options参数中缺少where或truncate属性.

共有1个答案

曹理
2023-03-14

如果有人到了这里,这就是我“用后遗症删除关联行”的方式:库的帮助很小:

  1. 从数据库(users.findone({...}))
  2. 读取用户
  3. 调用sequelize提供的方法setSessions(array)(名称取决于您的模型),该方法返回一个承诺。
/** @param {string} username */
const clearUserSessions = async (username) {
  const userInstance = await Users.findOne({ 
    where: { username }, 
    include: ['sessions'] 
   })
   if (!userInstance) {
    /* user not found */
    return ...
   }
   await userInstance.setSessions([])
   /* removed every session from user */
   return ...
};

稍后:

try {
  await clearUserSessions('bob')
} catch(err) {
 ...
}
 类似资料:
  • 问题内容: 我试图做一个简单的例子,以学习如何从父表中删除一行并使用Doctrine2自动删除子表中的匹配行。 这是我正在使用的两个实体: Child.php: 父亲.php 这些表已在数据库上正确创建,但未创建“删除级联”选项。我究竟做错了什么? 问题答案: 在教义中有两种级联: 1)ORM级别- 在关联中使用- 这是在UnitOfWork中完成的计算,不影响数据库结构。删除对象时,UnitOf

  • 问题内容: 我有两个表,和。中的每个条目都有一个指向的外键。使用Sequelize,如何获取与中的每个条目相关联的所有条目以及其中的条目总数? 原始SQL: 楷模: 问题答案: 使用与和为: 或者,您可能还需要添加一个:

  • 接口说明 如果已建立了主屏与副屏之间的关联,而由于某些原因,不想再进行两个场景之间数据的差异对比,Wish3DEarth团队新增了删除关联场景的接口,开发者可以通过该接口,来解除主屏与副屏之间的关联性。 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/contrasts/1.0.0/del 是否需要登录 是 请求字段说明

  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml

  • 问题内容: 我有一个组件数据库。每个组件都是特定的类型。这意味着组件和类型之间存在多对一的关系。删除类型时,我想删除所有具有该类型外键的组件。但是,如果我没记错的话,级联删除将在删除组件时删除类型。有什么办法可以做我所描述的吗? 问题答案: 这就是您要包含在组件表中的内容。 请记住,您需要使用InnoDB存储引擎:默认的MyISAM存储引擎不支持外键。

  • 问题内容: 我刚刚开始使用Sequelize和Sequelize CLI 由于这是开发时间,因此经常添加和删除列。在现有模型中添加新列的最佳方法是什么? 例如,我想将新列“ completed ”转换为 Todo 模型。我将此列添加到models / todo.js。下一步是什么? 我试过了 无法正常工作: “ 未 执行任何迁移,数据库架构已经是最新的。” 问题答案: 如果使用sequelize-