猫史档案馆


【求助】SQL一直报错

用户:爽快的小电鼠bMMb爽快的小电鼠bMMb查看:2 回复:2 评论:2 创建时间:2022-08-04T19:40:46


如题,SQL老是报错

问:代码哪里有问题?

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, '等待数据库启动中...')

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)
})


回复

上一页1 页 / 共 1下一页
yee剑走天下yee剑走天下

把表删了?*(

点赞0


评论


小蛇749小蛇749

LIMIT 1`后面没加[0]

点赞0


评论