如果表中的行存在,如何转义当前的 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 查询,但如果不存在则继续的主要内容,如果未能解决你的问题,请参考以下文章