javascript 使用knex.js从关联表中删除数据

k4emjkb1  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(178)

我想使用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?
任何帮助都将不胜感激。

a6b3iqyw

a6b3iqyw1#

你尝试做的事情被称为 * 级联删除 *,它是propagation constraint的一种形式。
在 * 数据库级别 * 而不是 * 应用程序级别 * 处理这些更好(并且几乎总是)。DBMS的工作是强制执行这种referential integrity(假设您正确定义了模式),以便通过Primary -> Foreign key relationships将实体正确链接在一起。
简而言之,你应该定义你的database schema,这样当你删除一个 * 文章 *,它的相关 * 评论 * 也会被删除。
下面是我使用knex.js迁移的方法:

// Define Article.
db.schema.createTableIfNotExists('article', t => { 
  t.increments('article_id').primary()
  t.text('content')
})

// Define Comment.
// Each Comment is associated with an Article (1 - many).
db.schema.createTableIfNotExists('comment', t => { 
  t.increments('comment_id').primary() // Add an autoincrement primary key (PK).
  t.integer('article_id').unsigned() // Add a foreign key (FK)...
    .references('article.article_id') // ...which references Article PK.
    .onUpdate('CASCADE') // If Article PK is changed, update FK as well.
    .onDelete('CASCADE') // If Article is deleted, delete Comment as well.
  t.text('content')
})

所以当你运行这个来删除一个 * 文章 *:

await db('article').where({ article_id: 1 }).del()

与该文章相关的所有评论也会自动删除。
不要试图通过编写应用程序代码来执行级联删除,DBMS本身是专门设计的,具有复杂的机制,以确保删除总是发生在consistent manner中;它的目的是为您处理这些操作,因此尝试自己复制此功能将是浪费的,复杂的,当然也很容易出错。

相关问题