如何使用续集删除关联的行

时间:2019-03-06 11:55:29

标签: node.js sequelize.js

我试图删除与表中某行相关的行,而不删除主行(因此无法使用CASCADE)。

这是原始PostgreSQL查询,可以完成我想用SQL实现的工作。是否可以生成这样的查询?

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
);

关联定义为:

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属性。

2 个答案:

答案 0 :(得分:0)

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

希望有帮助。尝试通过评论与我联系。

答案 1 :(得分:0)

如果有人来到这里,我就是这样“使用 sequelize 删除关联的行”:图书馆的帮助不大:

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