因此,我将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.');
答案 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()
返回的承诺。