我想使用knex by article_id从articles表中删除。这已经作为外键存在于comments表中。
如何测试数据是否已被删除,以及如何将其发送给用户。
我决定通过编写一个函数来实现这一点,用. then从两个函数中删除。这看起来像我在正确的行上吗?
exports.deleteArticleById = function (req, res, next) {
const { article_id } = req.params;
return connection('comments')
.where('comments.article_id', article_id)
.del()
.returning('*')
.then((deleted) => {
console.log(deleted);
return connection('articles')
.where('articles.article_id', article_id)
.del()
.returning('*');
})
.then((article) => {
console.log(article);
return res.status(204).send('article deleted');
})
.catch(err => next(err));
};
目前,我得到了正确的数据与日志,但我得到了一个状态500,但我认为我需要尝试得到一个204?
任何帮助都将不胜感激。
1条答案
按热度按时间a6b3iqyw1#
你尝试做的事情被称为 * 级联删除 *,它是propagation constraint的一种形式。
在 * 数据库级别 * 而不是 * 应用程序级别 * 处理这些更好(并且几乎总是)。DBMS的工作是强制执行这种referential integrity(假设您正确定义了模式),以便通过Primary -> Foreign key relationships将实体正确链接在一起。
简而言之,你应该定义你的database schema,这样当你删除一个 * 文章 *,它的相关 * 评论 * 也会被删除。
下面是我使用knex.js迁移的方法:
所以当你运行这个来删除一个 * 文章 *:
与该文章相关的所有评论也会自动删除。
不要试图通过编写应用程序代码来执行级联删除,DBMS本身是专门设计的,具有复杂的机制,以确保删除总是发生在consistent manner中;它的目的是为您处理这些操作,因此尝试自己复制此功能将是浪费的,复杂的,当然也很容易出错。