Discord.js Commando中SQLITE_ERROR:scores表无points列的解决求助
解决Discord.js Commando中的SQLITE_ERROR: table scores has no column named points问题
嘿,我来帮你搞定这个SQLite错误!这个问题的根源有两个,咱们一步步来修复:
1. 修复创建表的语法错误
你代码里的CREATE TABLE OF NOT EXISTS是拼写错误,正确的语法应该是CREATE TABLE IF NOT EXISTS——这个错误会导致表没有被正确创建,或者创建出来的表缺少points列,直接触发你看到的报错。
另外,建议把表的初始化逻辑放在bot启动的时候(比如ready事件里),而不是等到catch块里才处理,这样能从根源避免后续的查询错误。
2. 处理已存在的错误表结构
如果你的数据库里已经存在一个没有points列的scores表,哪怕你修复了语法,后续的插入/更新操作还是会报错。这时候你有两个选择:
- 添加缺失的列:运行这条SQL语句给现有表加上
points列(保留现有数据):ALTER TABLE scores ADD COLUMN points INTEGER DEFAULT 0; - 重建表:如果表中没有重要数据,可以直接删除旧表,让bot重新创建:
DROP TABLE scores;
修正后的完整代码
这里我还优化了SQL语句的参数化写法,避免潜在的SQL注入风险,同时给表结构增加了更合理的约束:
run(msg, {user, reason}) { msg.delete(); if(!user) { return msg.say(`**Cannot find user! Make sure it's a valid member of this server!**`); } msg.say(`**${user.tag} has been warned for ${reason}!**`); sqlite.get(`SELECT * FROM scores WHERE userId = ?`, [user.id]) .then(row => { if (!row) { sqlite.run("INSERT INTO scores (userId, points) VALUES (?, ?)", [user.id, 1]); } else { // 使用参数化查询,避免SQL注入风险 sqlite.run(`UPDATE scores SET points = ? WHERE userId = ?`, [row.points + 1, user.id]); } }) .catch(() => { // 修复表创建的语法错误,同时给userId加唯一约束避免重复数据 sqlite.run(`CREATE TABLE IF NOT EXISTS scores (userId TEXT UNIQUE, points INTEGER DEFAULT 0)`) .then(() => { sqlite.run(`INSERT INTO scores (userId, points) VALUES (?, ?)`, [user.id, 1]); }); }); }
内容的提问来源于stack exchange,提问作者swoods
相关产品推荐
相关产品推荐

