如何在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
相关产品推荐
相关产品推荐

