删除具有相同特定名称值的最后一个Sqlite行

时间:2019-07-10 14:19:10

标签: node.js sqlite

我如何编写一个函数,该函数将只删除具有给定名称(可能不是唯一的)的一行(最好是最后一行)。

我尝试使用行数,限制和我自己的内置函数(如下)。这些都不起作用。

app.delete('/FamilyMember/:db', (req, res) => {
  let db = openDB("ClientsDatabases/"+req.params.db);
  let ids = [];
  db.serialize(()=>{
    db.each('select * from family', (err, row)=> {
      if (row.name == req.body.name) {
        ids.push(row.id);
      }
    })
    db.run("DELETE FROM family WHERE id = ?",ids[ids.length-1], (err)=> {
      console.log("Here is the err "+err);
      if (!err) console.log('Succesful @ deleting', req.body.name);
    });
  })
  res.send();
}, () => {
  db.close();
})

我的预期输出仅是删除具有给定名称的一行,但表没有变化,也没有发现错误。

1 个答案:

答案 0 :(得分:1)

在调用Statement#run时,'参数周围有单引号(?的任何特殊原因是什么? API documentation中的任何内容都没有表明这是正确的做法,可能是对您的查询为何被弄乱到无法删除任何内容但也不会引发错误的解释。我希望您打给.run()的电话看起来像下面这样:

db.run("DELETE FROM family WHERE id = ?",ids[ids.length-1], (err)=> {
    console.log("Here is the err "+err);
    if (!err) console.log('Succesful @ deleting', req.body.name);
});

您可能也有兴趣将查询简化为单个语句,该语句将获取最大的id(只要id每次递增)并删除该记录:

db.run("DELETE FROM family WHERE id = MAX(id)", (err)=> {
    console.log("Here is the err "+err);
    if (!err) console.log('Succesful @ deleting', req.body.name);
});

这消除了仅从其中抓取一个family的先加载id所有内容的需要。