SQLite 错误 "No such column" 当我看到该列存在时
SQLite error "No such column" when I can see that the column exists
这里的背景故事是我正在开发 Discord 机器人。要求的功能之一是让它侮辱。我认为让用户能够通过 SQLite 3 数据库(特别是 better-sqlite3)添加侮辱会很有趣,在这样做的过程中,我还想跟踪每个侮辱的最近使用情况(这是为了将来在“insultinfo”类型的命令中使用)。我添加了一个名为“lastUsed”的 DATETIME 列。当添加新的侮辱时,我的 insultadd 命令能够写入此列。问题是当我调用 insult 命令时,它应该说出侮辱然后用当前日期更新 lastUsed 字段。粘贴下面的代码。
问题是我收到一条错误消息“SQLiteError:没有这样的列:”然后它打印日期值,即使我正在尝试更新 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();
},
我想我明白了。我最终使用了 date.toString() 并且它似乎已经完成了工作。我在更新 db.prepare 语句后收到的错误消息表明它没有将该日期变量视为它可以使用的东西,因此 .toString() 解决方法。我必须对此进行测试,看看这是否会影响我对该列进行排序的能力,因为这对我来说仍然是一个全新的事物,但至少命令本身正在运行并且数据库 table 正在更新。
我愿意接受更多反馈,但如果有人看到我的方式可能很愚蠢。
更新:经过进一步测试,设置日期 = Math.floor(new Date() / 1000) 在我的案例中效果更好。
这里的背景故事是我正在开发 Discord 机器人。要求的功能之一是让它侮辱。我认为让用户能够通过 SQLite 3 数据库(特别是 better-sqlite3)添加侮辱会很有趣,在这样做的过程中,我还想跟踪每个侮辱的最近使用情况(这是为了将来在“insultinfo”类型的命令中使用)。我添加了一个名为“lastUsed”的 DATETIME 列。当添加新的侮辱时,我的 insultadd 命令能够写入此列。问题是当我调用 insult 命令时,它应该说出侮辱然后用当前日期更新 lastUsed 字段。粘贴下面的代码。
问题是我收到一条错误消息“SQLiteError:没有这样的列:”然后它打印日期值,即使我正在尝试更新 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();
},
我想我明白了。我最终使用了 date.toString() 并且它似乎已经完成了工作。我在更新 db.prepare 语句后收到的错误消息表明它没有将该日期变量视为它可以使用的东西,因此 .toString() 解决方法。我必须对此进行测试,看看这是否会影响我对该列进行排序的能力,因为这对我来说仍然是一个全新的事物,但至少命令本身正在运行并且数据库 table 正在更新。
我愿意接受更多反馈,但如果有人看到我的方式可能很愚蠢。
更新:经过进一步测试,设置日期 = Math.floor(new Date() / 1000) 在我的案例中效果更好。