删除数据库上的记录

时间:2019-01-08 16:00:35

标签: node.js discord.js better-sqlite3

我有一个运行正常的日志记录命令,唯一的问题是我无法完成命令的off部分。如果公会匹配,我需要它删除两个记录(guildid, channel)logging 这就是我尝试过的。

if (args[0] === 'off') {
    message.channel.send('Logging turned off!');
    const del = db.prepare('DELETE FROM logging WHERE guildid = ?;');
    del.run({
        guildid: `${message.guild.id}`
    });
    return;

看照片,当args off运行时,如果公会内容与以下内容匹配,我需要它删除公会内容(495602 ...)和频道内容(<#5290 ...)行会所在的公会。

2 个答案:

答案 0 :(得分:0)

对于将来希望如何​​做的任何人,这就是答案。 编辑:直到2天大声笑才能标记为答案

if (args[0] === 'off') {
message.channel.send('Logging turned off!');
db.prepare(`DELETE FROM logging WHERE guildid = '${message.guild.id}'`).run();
return;

答案 1 :(得分:0)

您当前的答案是使用准备好的语句的不正确方法。如果使用姿势的方式,则可以进行SQL注入,因为您没有将要在语句中使用的值解释为值,而是将其用作整体语句的一部分,然后运行不带参数的语句。这意味着我可能会提供一个可能无法完全按照您的预期做的值。

例如,以下内容什么都不做,

const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
deleteStatement.run({$rowid});
deleteStatement.finalize();

但这会删除行号为3或4的元素:

const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare(`DELETE FROM lorem WHERE rowid = ${$rowid}`);
deleteStatement.run();
deleteStatement.finalize();

相反,请看一下sqlite3 documentation here

您实际上需要对准备好的语句进行参数化,如下所示:

const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(":memory:");

db.serialize(function() {
    // Make the table
    db.run("CREATE TABLE lorem (info TEXT)");

    // Create some dummy data
    const insertStatement = db.prepare("INSERT INTO lorem VALUES (?)");
    for (let i = 0; i < 5; i++) {
        insertStatement.run(`My Data ${i}`);
    }
    insertStatement.finalize();

    // Delete some data
    const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
    deleteStatement.run({
        $rowid: 3
    });
    deleteStatement.finalize();

    // Print elements
    db.each("SELECT rowid AS id, info FROM lorem", (err, {id, info}) => console.log(`${id}: ${info}`));
});

db.close();