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

Posted

技术标签:

【中文标题】如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续【英文标题】:How to escape current SQLite3 query if row in table exists, but continue if it doesn't 【发布时间】:2019-10-12 00:43:47 【问题描述】:

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

【问题讨论】:

当前查询容易被 SQL 注入 @slothiful 它不包含人们无论如何都无法通过不和谐开发者模式访问的数据...... 您可以更改您的用户名。无论如何,这不值得冒险。 @slothiful 是的,您可以更改您的用户名,但隐藏它有什么意义呢?从某种意义上说,这些数据仍然是“公开的”,拥有用户 ID 和用户名不会产生任何结果。我明白你在说什么。 只要有人在其用户名中使用 ` 作为第一个字符,您就会收到 SQL 语法错误。如果他们真的想要,他们可以更改他们的用户名以从字面上抹掉桌子,或者更糟。 【参考方案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() 返回的承诺。

【讨论】:

支持因为它让我走上了正确的轨道,但是不会标记为正确。

以上是关于如果表中的行存在,如何转义当前的 SQLite3 查询,但如果不存在则继续的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite3 表中的行上有效地执行 python 代码

重置 SQLite3/MySQL 中的行数计数

计算联接表中的行,但如果不存在行则显示 0 - mysql

如何将一个表中的行合并到另一个表中的另一行

如果当前表中不存在,则从其他表中选择行

针对 20,000 多次更新优化 Sqlite3