用户:
呵呵0486查看:24 回复:18 评论:24 创建时间:2022-08-02T09:11:33
一些萌新(比如我)在地图使用SQL的时候,总会遇到一些报错()然而又不知道怎么修()下面是几种常见的报错()以及它的处理方式()
--------------------------------
1.Error: sql error: Error: SQLITE_ERROR: incomplete input 这报错容易在自己添加数据时报错 拿一串代码举例()async function initTable() {
return await db.sql`
CREATE TABLE IF NOT EXISTS "player" (
"coin" INT NOT NULL,
"exp" INT NOT NULL,
"item" TEXT NOT NULL,
"userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL
)
`;
}
async function saveUser(user) {
await db.sql`
INSERT INTO "player" (
"exp",
"coin",
"item",
"userKey"
) VALUES (
${user.exp},
${user.coin},
${JSON.stringify(user.item)},
${user.player.userKey}
)
ON CONFLICT("userKey")
DO UPDATE SET
"exp"=excluded."exp",
"coin"=excluded."coin",
"item"=excluded."item",
`
}
async function loadUser(user) {
const [data] = await db.sql`SELECT * FROM "player" WHERE "userKey"=${user.player.userKey} LIMIT 1`
if (data) {
user.exp = data.exp
user.coin = data.coin
user.item = JSON.parse(data.item)
}
else {
saveUser(user)
}
}
(这不就是API改了一点点嘛)
这段代码的错误在
async function saveUser(user) {
await db.sql`
INSERT INTO "player" (
"exp",
"coin",
"item",
"userKey"
) VALUES (
${user.exp},
${user.coin},
${JSON.stringify(user.item)},
${user.player.userKey}
)
ON CONFLICT("userKey")
DO UPDATE SET
"exp"=excluded."exp",
"coin"=excluded."coin",
"item"=excluded."item",--错误在这里
`
}
百度翻译(?:错误:sql错误:错误:SQLITE错误:输入不完整(请无视这个())
解决方式:把逗号删掉即可()
2.Error: sql error: Error: SQLITE_ERROR: near "xxx": syntax error
这种报错我猜是最常见的()也是容易在添加数据时报错()
百度翻译:错误:sql错误:错误:SQLITE错误:靠近“xxx”:语法错误()(也请无视)
解决方式:
检查在报错提示的位置附近有没有漏掉逗号、双引号等其他符号,还有就是检查有没有把标点符号写成中文了
3.Error: sql error: Error: SQLITE_ERROR: no such column: xxx
也是容易在添加数据时报错()
百度翻译:错误:sql错误:错误:SQLITE错误:没有这样的列:xxx(什么鬼())()
解决方式:
先检查有没有数据输入错误,如果有的话更正(废话)
如果任何一个数据你都没写错的话()
如果你之前已经创建了表的话()
那么:
删表!
注意:如果你的地图已经发布了,那么必须跑到游玩端再执行删表的命令()那么游玩端的所有数据就会丢失()所以建议大家把所有数据做完了再发布地图()如果不想删表就再创建个表格吧()
--------------------------------------------------------
这里只是举例了3种最常见的报错()欢迎评论区补充()
![]()
()()
呵呵0486补:
Error: sql error: Error: SQLITE_CONSTRAINT: xxx constraint failed: xxx
检查一下你储存的数据违反你定义的规则()或者有没有定义()
API这样写的
因为我没遇到过这种报错 所以应该是这样的(?
点赞0
评论
why我直接复制吉吉的还会错?
上代码:
async function initTable() {//创建玩家数据表
return await db.sql`
CREATE TABLE IF NOT EXISTS "player" (
"coin" INT NOT NULL,--金币
"exp" INT NOT NULL,--经验
"item" TEXT NOT NULL,--物品列表
"userKey" CHAR(16) PRIMARY KEY UNIQUE NOT NULL --用户识别码
)
`;
}
async function saveUser(user) {//玩家存档
await db.sql`
INSERT INTO "player" (-- player虽然是小写, 建议统一用""包住
"exp",-- 经验
"coin",-- 金币
"item",-- 道具
"userKey"-- 用户识别码
) VALUES (
${user.exp}, --尝试新建经验值
${user.coin}, --尝试新建金币值
${JSON.stringify(user.item)}, --尝试新建道具值
${user.player.userKey} --尝试新建当前玩家识别码
)
ON CONFLICT("userKey") -- 如果已经存在同样的用户识别码
DO UPDATE SET
"exp"=excluded."exp",-- 更新经验值
"coin"=excluded."coin",-- 虽然是小写, 建议统一用""包住
"item"=excluded."item"-- 虽然是小写, 建议统一用""包住
`
}
async function loadUser(user) {//玩家读档
const [data] = await db.sql`SELECT * FROM "player" WHERE "userKey"=${user.player.userKey} LIMIT 1`
if (data) {//如果这个玩家已经有存档
user.exp = data.exp
user.coin = data.coin
user.item = JSON.parse(data.item)
}
else {//玩家无存档
saveUser(user)
}
}
async function deleteUser(user) {//删除玩家存档
await db.sql`DELETE FROM "player" WHERE "userKey"=${user.player.userKey}`
}
async function poll(fn, msg) {//无限轮询执行sql语句直到成功
while (true) {
try {
return await fn()//一旦成功执行, 停止无限轮询, 并返回查询结果
} catch (e) {
const m = e.message//需要简略显示的异常消息
//sql偶尔会执行超时, 但如果反复显示timeout 15秒以上一直不停, 大概是数据库出了故障只能等官方修复
if (m.includes('timeout')) {
world.say(m)
}
else {
world.say(msg || e.stack)//如果sql执行出错, 广播错误消息, 用来排查错误原因
}
}
await sleep(2000) //每2秒重试一次
}
}
poll(initTable, '等待数据库启动中...')点赞0
评论
再补一段代码:
world.onPlayerJoin(async ({ entity }) => {
entity.player.exp = 10;
entity.player.coin = 100;
entity.player.item = []
await loadUser(entity)//尝试读取存档
entity.player.onPress(async ({ button }) => {//右键显示状态栏
if (button == Box3ButtonType.ACTION1) {
await entity.player.dialog({
type: Box3DialogType.SELECT,
content: `
金币:${entity.coin}
经验:${entity.exp}
道具:[${entity.item}]
`,
})
}
})
})
world.onPlayerLeave(async({entity}) => {
await saveUser(entity)
})
点赞0
评论