NodeJS 如何使用sequelize删除关联行

plicqrtu  于 2022-12-29  发布在  Node.js
关注(0)|答案(2)|浏览(248)

我试图删除与表中的行关联的行,而不删除主行(因此不能使用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的options参数中缺少where或truncate属性。

x4shl7ld

x4shl7ld1#

如果有人来到这里,下面是我"***使用sequelize***删除关联行"的方法:图书馆提供的一点帮助:
1.从数据库读取用户(Users.findOne({ ... })
1.调用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) {
 ...
}
fjaof16o

fjaof16o2#

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

希望能帮上忙。有什么意见可以联系我。

相关问题