我试图删除与表中某行相关的行,而不删除主行(因此无法使用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属性。
答案 0 :(得分:0)
return Session.destroy({
where: {
'$users.username$': 'bob'
},
include: [{
model: User,
as: 'users'
}],
});
希望有帮助。尝试通过评论与我联系。
答案 1 :(得分:0)
如果有人来到这里,我就是这样“使用 sequelize 删除关联的行”:图书馆的帮助不大:
Users.findOne({ ... })
) 读取用户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) {
...
}