猫史档案馆


sql教程

用户:async_functionasync_function查看:2 回复:8 评论:2 创建时间:2021-04-30T14:17:15


再发一遍(前面几次都没发成)

  提前声明:如有错误请指出
async function create() {
    await db.sql`create table if not EXISTS d(
        record int not null,
        name varchar(50) not null
    )`
}
create()
async function add(a, b) {
    try {
        await db.sql`insert into d(record,name)
        values (${a},${b})
    `
    } catch (error) {
        console.warn(error)
    }
}
async function removeRecordAll() {
    await db.sql`DELETE FROM d`
    world.say(`清空!`)
}
add('Infinity', Infinity)
world.onPlayerJoin(({ entity }) => {
    entity.player.Start = false
    entity.player.time = 0
    world.onTick(() => {
        if (entity.player.Start) {
            entity.player.time += 喵 / 1000
        }
    })
})
var h = 0
console.log('----------------------分割线------------------------')
world.onVoxelContact(async ({ entity, voxel }) => {
    if (voxel == voxels.id('H') && entity.player.Start == true) {//存档点
        entity.position.set(98, 20, 62)//x,y,z三个参数
        const titi = entity.player.time
        world.say(`${entity.player.name} ${Math.round(entity.player.time)}`)
        h = Infinity
        for await (const entities of db.sql`select * from d`) {
            if (h > entities.record) { h = entities.record }
        }
        if (titi < h) { world.say(`恭喜${entity.player.name}打破原有${h}秒的纪录!`) }
        add(titi, entity.player.name)
        entity.player.Start = false
        entity.player.time = 0
    }
})
removeRecordAll()​
  这段代码是什么呢?我在 BCM墨水瓶 的地图里写的sql代码,详情见 https://box3.codemao.cn/e/65e8c5ef808cdf015976   那么有以上面的代码为题一段一段讲解   首先:  
async function create() {
    await db.sql`create table if not EXISTS d(
        record int not null,
        name varchar(50) not null
    )`
}
这段代码是一个建造数据库的函数(当然也可以去掉函数包装) 如果想要在岛三使用sql,则db.sql``就是一个入口(前面最好加上await) create table语句是用来创建一个表的语句,if not exists可以理解为避免产生多个同名数据库(可不要),d是数据库名称 然后用小括号展开   接下来,就要输入参数名称了,格式为:  
名称 数据类型 选择项​
名称:必须为合法标识符,至少在我的理解里是这样 数据类型:有varchar、real、int等等几种,   其中varchar是字符串,通常用于储存玩家的名字,后面的小括号里的数字则是表明最大储存长度 real是小数 int是整数(如果你存了小数则会报错)   选择项:那些可要可不要的代码,包括: not null不允许为空值,即不允许在此列中存入空值 primary key 设为主键 unique禁止出现相同值 等等   现在,我们就成功创建了一个表,那么怎么更改表呢? 用insert into添加语句,格式:
insert into 表名称(插入的位置1, 插入的位置2) values(要插入的数据1, 要插入的数据2)
可以用${}来获去外面的数据 应该很好理解()   接下来,怎么查询数据呢? 用select语句,格式:

 

select * from 表名称 选择项
  sclect * from是查询所有的数据,用.来获取单个数据 选择项包括: order by 名称   只获取名称那一列的数据 ASC或DESC   将 名称 进行升序排序。(ASC: 升序 / DESC: 降序) where 条件   只返回符合条件的数据 等等

 

清除表格所有数据 (表格结构不变) async function remove() {     await db.sql`delete 表名称` }   remove()

 

删除表 db.sql`drop table 表名称`

 

其实create后面还可以跟database(数据库),做到一个数据库中存有多个表 不知道能不能串图呢(大家可以尝试一下)
db.sql`create database threeMap`


回复

上一页1 页 / 共 1下一页
async_functionasync_function

清除表格所有数据 (表格结构不变)

async function remove() { 
    await db.sql`delete 表名称` 
} 
remove()

删除表

db.sql`drop table 表名称`

 

(有个位置没发好)

点赞0


评论


async_functionasync_function

点赞0


评论


Architect_皮卡awaArchitect_皮卡awa

emotion_编程猫_加油

点赞0


评论


指令者指令者

这个什么问题

//存档
world.onPlayerJoin(({ entity }) => {//每次玩家进入游戏都会运行
    entity.kd1 = 0 
    loadPlayer(entity)
})
entity.player.onPress(async ({ button }) => { //每当有按钮被按下
    if (button == Box3ButtonType.ACTION1) { //如果按钮是右键
        c喵t selection = await entity.player.dialog({
            type: Box3DialogType.SELECT, //对话框类型为选择框
            content: `你的累计KD为:\n\n${entity.kd1}`,
            opti喵: ['保存'],
        })
        if (selection) { //确保对话框不是点击x关闭
            if (selection.value === '保存') { //被点击的是保存按钮
                await savePlayer(entity) //等待写入结束才运行下一行
                textDialog(entity, '保存完毕')
            }
        }
    }
})

async function savePlayer(entity) {//定义保存玩家状态的函数
    if (entity.player.userKey) {//拥有userKey的玩家, 则玩家不是游客, 可以保存
        await db.sql`
            --尝试向player表插入一条记录, 向各个字段写入玩家身上对应的属性值
            INSERT INTO player (
                userName,
                kd1
                userKey
            )
            VALUES(
                ${entity.player.name},
                ${entity.kd1},
                ${entity.player.userKey}
            )
            ON CONFLICT(userKey)--如果玩家记录已经存在, 则不需要插入, 而是更新各个字段的值
            DO UPDATE SET

            userName=excluded.userName,
            money=excluded.money,
            junk=excluded.junk,
            itemList=excluded.itemList
        `
    }
}
async function showPlayers() {
    c喵ole.clear() // 清空控制台
    c喵t playerList = await db.sql`SELECT * FROM player`
    for (c喵t p of playerList) {
        c喵ole.log(JSON.stringify(p))
    }
}

async function createTable() {
    await db.sql`
        CREATE TABLE IF NOT EXISTS player (
            kd1 INTEGER DEFAULT 0,--金钱, INTEGER类型用于存储整数
            userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''--玩家的唯一识别码, TEXT类型用于存储字符串
        )
    `
    showPlayers() //每次运行代码都能查看数据库里所有记录
}
async function loadPlayer(entity) {
    c喵t data = (await (db.sql`SELECT * FROM player WHERE userKey=${entity.player.userKey} limit 1`))[0]
    if (data) { //如果存在这个玩家的存档
        entity.kd1 = data.kd1 //恢复金钱
    }
}

async function showPlayers() {
    c喵ole.clear() // 清空控制台
    c喵t playerList = await db.sql`SELECT * FROM player`
    for (c喵t p of playerList) {
        c喵ole.log(JSON.stringify(p))
    }
}

async function createTable() {
    await db.sql`CREATE TABLE IF NOT EXISTS player (
        userName TEXT DEFAULT '',--玩家名字
        kd1 INTEGER DEFAULT 0,--金钱
        userKey TEXT PRIMARY KEY UNIQUE DEFAULT ''--玩家的识别码
    )`

    showPlayers()
}

createTable()

点赞0


评论


async_functionasync_function

dd

点赞0


评论


小苏打_小苏打_

为什么在box3里编写sql代码老是要在async用await。。。

点赞0


评论


还是那个小橙子丫还是那个小橙子丫

imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8A%A0%E6%B2%B9.gif"alt="emotion_编程猫_加油"

点赞0


评论


无极玄天无极玄天

哇坟

点赞0


评论