首页 > 解决方案 > 如何使用 sequelize 删除关联的行

问题描述

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

这是原始 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
);

该关联在 sequelize 中定义为:

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 的选项参数中缺少 where 或 truncate 属性。

标签: node.jssequelize.js

解决方案


如果有人到了这里,这就是我“使用 sequelize 删除关联的行”的方式:来自库的一点帮助:

  1. Users.findOne({ ... })从 db ( )中读取用户
  2. 调用setSessions(array)sequelize 提供的方法(名称取决于您的模型),该方法返回一个承诺。
/** @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) {
 ...
}

推荐阅读