如果表中的行存在,如何转义当前的SQLite3查询,如果表中的行不存在,如何继续

时间:2019-05-25 22:15:09

标签: node.js database sqlite discord.js node-sqlite3

因此,我将Discord.JS机器人与SQLite3集成在一起,并添加了一个函数,用户可以在其中将其ID和用户名存储在表中。目前,如果用户的ID和名称在表的某一行中不存在,那么我将仅在表中创建新的行,如果数据不存在,则仅创建新的一行。我想知道的是,如果该行确实存在,是否有一种方法可以从查询中抛出某些内容,并且对我来说,能够捕获它,然后执行其他操作。

我尝试了if..else语句,但是我想知道是否有更简单的方法来实现这一点。

这是我目前拥有的功能,如上所述。

let userC = message.mentions.members.first()

    db.serialize(() => {
        db.run('CREATE TABLE IF NOT EXISTS user (id TEXT, name TEXT)');
        db.run(`INSERT INTO user (id, name) SELECT '${userC.id}', '${userC.user.username}' WHERE NOT EXISTS(SELECT 1 FROM user WHERE id = '${userC.id}' AND name = '${userC.user.username}')`)
    });
    message.reply('Added the user to the database.');

理想情况下,如果该行确实存在,将不执行message.reply('Added the user to the database.');,而是继续执行message.reply('That user already exists within the database');。但是,如果该行不存在,它将插入行和数据,并且仅继续message.reply('Added the user to the database.');

1 个答案:

答案 0 :(得分:1)

根据API文档here,您可以使用Database.get()代替Database.run()。它的功能相同,但是回调将从SQL中返回您可以检查的行。

在下面的代码中,您会注意到我还实现了占位符以防止SQL注入。对于用户提供的变量,请考虑这种常规做法。

const userC = message.mentions.users.first();

db.get(`SELECT 1 FROM user WHERE id = '${userC.id}' AND name = '?'`, [userC.username], (err, rows) => {
  if (err) return console.error(err);

  if (!rows[0]) {
    db.run(`INSERT INTO user (id, name) VALUES ('${userC.id}', '?'), [userC.username], err => {
      if (err) return console.error(err);

      message.reply('Added the user to the database.');
    });
  } else return message.reply('That user already exists within the database.');
});

请确保还遵守message.reply()返回的承诺。