node.js - 如何使用 sequelize 删除关联的行
问题描述
我正在尝试删除与表中的行关联的行,而不删除主行(因此不能使用 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 的选项参数中缺少 where 或 truncate 属性。
解决方案
如果有人到了这里,这就是我“使用 sequelize 删除关联的行”的方式:来自库的一点帮助:
Users.findOne({ ... })
从 db ( )中读取用户- 调用
setSessions(array)
sequelize 提供的方法(名称取决于您的模型),该方法返回一个承诺。
/** @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) {
...
}
推荐阅读
- python - 仅将文本附加到非空值 pandas Dataframe
- ssms - 从 SSMS 处理 Azure 分析服务器模型时出错
- python - nltk : 根据 POS 用其他词替换标记
- vim - Vim 拆分函数参数
- php - PHP 的 MySQL 数据库迁移 UTF-8 问题
- tensorflow - 是否可以训练 Tensorflow 来检测物体上的缺陷?
- c# - 如何使用 Selenium c# 将剪贴板中的 url 粘贴到 Chrome 中的地址栏?
- javascript - 反应最佳实践:将状态传递给孩子还是让孩子直接检查状态?
- laravel - 在 IIS 服务器中使用 htaccess 更改主 URL
- forms - 在 React.js 中输入后无法清除表单/状态