0

所以我集成了我的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.');

4

1 回答 1

1

根据此处的 API 文档,您可以使用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().

于 2019-05-26T19:41:28.713 回答