提问者:小点点

如何使用sequelize删除关联行


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

这是一个原始的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个答案

匿名用户

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

  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) {
 ...
}