Ошибка SQLite «Нет такого столбца», когда я вижу, что столбец существует - PullRequest
1 голос
/ 02 августа 2020

Предыстория здесь такова, что я работаю над ботом Discord. Одна из запрошенных функций - это лобовое оскорбление. Я подумал, что было бы забавно дать пользователям возможность добавлять оскорбления через базу данных SQLite 3 (в частности, better-sqlite3), и при этом я также хочу отслеживать последнее использование каждого оскорбления (это для будущее использование в команде типа "insultinfo"). Я добавил столбец DATETIME под названием «lastUsed». Моя команда insultadd может писать в этот столбец, когда добавляются новые оскорбления. Проблема в том, что когда я вызываю команду insult, она должна сказать оскорбление, а затем обновить поле lastUsed, указав текущую дату. Вставка кода ниже.

Проблема в том, что я получаю сообщение об ошибке «SQLiteError: no such column:», а затем выводит значение даты, хотя я пытаюсь обновить столбец lastUsed и Я не могу понять, как это решить. Проблема должна быть в инструкции db.prepare, я просто не вижу, что мне нужно сделать, чтобы исправить это.

execute(msg, args) {
    const SQLite = require("better-sqlite3");
    const db = new SQLite('./userinputs.sqlite');
    // Check if the table "userinputs" exists and has content from this guild.
    const table = db.prepare(`SELECT count(*) FROM userinputs WHERE (guild = ${msg.guild.id} OR guild = 'Global') AND type = 'insult';`).get();
    if (!table['count(*)']) {
        return msg.channel.send("I don't have any insults yet");
    }
    var date = new Date();
    const rawInsult = db.prepare(`SELECT * FROM userinputs WHERE type = 'insult' AND (guild = ${msg.guild.id} OR guild = 'Global') ORDER BY RANDOM() LIMIT 1;`).get();
    const insult = rawInsult['content'];
    const insultID = rawInsult['row'];
    if (args[0]) {
        var target = args[0];
    } else {
        var target = msg.author.username;
    }
    if (insult.includes('{}')) {
        var finalInsult = insult.replace('{}', target);
    } else {
        var finalInsult = target + ' ' + insult;
    }
    msg.channel.send(finalInsult);
    db.prepare(`UPDATE userinputs SET lastUsed = "${date}" WHERE row = ${insultID};`).run();
},

1 Ответ

0 голосов
/ 03 августа 2020

Думаю, я понял. В итоге я использовал date.toString (), и, похоже, он выполнил свою работу. Сообщение об ошибке, которое я получил после обновления оператора db.prepare, указывало на то, что он не рассматривает эту переменную даты как нечто, с чем она может работать, следовательно, обходной путь .toString (). Мне придется проверить это, чтобы увидеть, повлияет ли это на мою способность сортировать по этому столбцу, поскольку это все еще для меня довольно ново, но, по крайней мере, сама команда работает, а таблица базы данных обновляется.

Я открыт для большего количества отзывов, хотя, если кто-то увидит здесь возможную глупость в моем пути.

ОБНОВЛЕНИЕ: После дальнейшего тестирования установка date = Math.floor (new Date () / 1000) закончилась в моем случае лучше.

...