Удаление записей в базе данных
У меня есть команда регистрации, которая работает отлично, единственная проблема, я не могу закончить off
раздел команды. Мне нужно, чтобы удалить обе записи (guildid, channel)
если гильдия совпадает.Это то, что я пытался.
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;
Глядя на фото, когда арги off
мне нужно удалить содержимое гильдии (495602...) и содержимое канала (<# 5290...), если содержимое гильдии совпадает с гильдией, в которой была выполнена команда.
3 ответа
Ваш текущий ответ - неправильный способ использовать подготовленное утверждение. Если вы используете способ, которым вы себя представляете, вы открываете себя для внедрения SQL-кода, потому что вы не интерпретируете значение, которое вы хотите использовать в операторе, как значение, вы используете его как часть общего оператора, а затем запускаете оператор без параметров, Это означает, что я потенциально мог бы предоставить значение, которое могло бы не делать то, что, как вы думаете, будет.
Например, следующее ничего не сделает,
const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare("DELETE FROM lorem WHERE rowid = $rowid");
deleteStatement.run({$rowid});
deleteStatement.finalize();
Но это удалит элементы с rowid 3 или 4:
const $rowid = "3 OR rowid = 4";
const deleteStatement = db.prepare(`DELETE FROM lorem WHERE rowid = ${$rowid}`);
deleteStatement.run();
deleteStatement.finalize();
Вместо этого взгляните на документацию sqlite3 здесь.
Вы должны на самом деле параматизировать ваше подготовленное утверждение, как показано ниже:
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();
Для любого в будущем, смотрящего, как это сделать, это был ответ. РЕДАКТИРОВАТЬ: не могу пометить в качестве ответа до 2 дней лол
if (args[0] === 'off') {
message.channel.send('Logging turned off!');
db.prepare(`DELETE FROM logging WHERE guildid = '${message.guild.id}'`).run();
return;
Поздно к
better-sqlite3
партия:
const del = db.prepare('DELETE FROM logging WHERE guildid = ?');
del.run(message.guild.id)