You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:11