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

如何在Discord.js中搭建货币与库存系统?SQLite报错求助

解决你的Discord机器人SQLite表创建与操作错误

我一眼就发现了几个核心问题,这正是你报错和功能卡壳的原因:

1. 表名不匹配导致重复创建报错

你检查的是balance表是否存在,但实际执行创建的是scores表!这就导致每次启动机器人时,因为balance表不存在,代码都会触发创建scores表的逻辑,第二次启动时scores已经存在,自然就抛出了table scores already exists的错误。

2. 数据操作的表名完全混乱

  • client.getScore查询的是balance表,但你根本没创建这个表
  • client.setScore操作的是money表,同样也没创建这个表

修正后的完整代码

我们统一用scores作为表名,修正所有相关SQL语句:

const table = sql.prepare("SELECT count(*) FROM sqlite_master WHERE type ='table' AND name = 'scores';").get();
if (table["count(*)"] === 0) {
 console.log("creating scores table...");
 sql.prepare("CREATE TABLE scores (id TEXT PRIMARY KEY, user TEXT, guild TEXT, money INTEGER);").run();
 sql.prepare("CREATE UNIQUE INDEX idx_scores_id ON scores (id);").run();
 sql.pragma("synchronous = 1");
 sql.pragma("journal_mode = wal");
}
// 现在查询和操作的都是正确的scores表
client.getScore = sql.prepare("SELECT * FROM scores WHERE user = ? AND guild = ?");
client.setScore = sql.prepare("INSERT OR REPLACE INTO scores (id, user, guild, money) VALUES (@id, @user, @guild, @money);");

额外实用建议

  • 为了保证同一个用户在不同服务器的记录独立,你可以考虑用user + guild的字符串拼接作为主键(或者生成唯一ID),避免主键冲突
  • 操作数据库时建议加上错误捕获,用try/catch包裹,能更清晰地定位后续问题:
try {
  // 这里放数据库操作代码
} catch (error) {
  console.error("数据库操作出错:", error);
}

内容的提问来源于stack exchange,提问作者Keanny Ooi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:22:35