我正在尝试删除与表中一行相关联的行,而不删除主行(因此不能使用级联)。
这是一个原始的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属性.
如果有人到了这里,这就是我“用后遗症删除关联行”的方式:库的帮助很小:
users.findone({...})
)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) {
...
}