YStudio Y++

SQLite类

Y++ / YStudio 开发文档 · 一点滴

扩展类(不是扁平命令库)。路径:支持库 → 扩展支持库 → SQLite类。类型名必须写 SQLite类

高阶方法尽量不手写 SQL;需要时用 执行SQL / 查询SQL

相关:HTTP类JSON类

快速开始

函数 主窗口.创建完毕 () {
    SQLite类 db
    如果真 (db.打开 ("demo.db") == 假) {
        输出 (db.取错误 ())
        返回
    }

    字段信息 cols[3]
    cols[1].名称 = "id"
    cols[1].类型 = #主键
    cols[2].名称 = "姓名"
    cols[2].类型 = #文本
    cols[3].名称 = "年龄"
    cols[3].类型 = #整数
    db.建表 ("人", cols)

    db.插入 ("人", "姓名,年龄", "张三,20")
    db.查询 ("人", "年龄=20")
    当 (db.取下一行 ()) {
        输出 (db.取文本 ("姓名") + " " + 到文本 (db.取整数 ("年龄")))
    }
    db.关闭 ()
}

字段信息与类型常量

内置类型 字段信息(无需自建 .yt),可声明数组:

成员 类型 说明
名称 文本 列名
类型 整数 #文本 / #整数 / #小数 / #逻辑 / #二进制 / #主键(成员名「类型」可用,虽与关键字同字)
主键 逻辑 真=主键;与 #整数 组合时为自增
非空 逻辑 NOT NULL
默认值 文本 可选默认值
常量 SQLite
#文本 1 TEXT
#整数 2 INTEGER
#小数 3 REAL
#逻辑 4 INTEGER(0/1)
#二进制 5 BLOB
#主键 6 INTEGER PRIMARY KEY AUTOINCREMENT

兼容旧写法:db.建表("人", "id:主键,姓名:文本,年龄:整数")(第二参数为文本时仍走 CSV 列定义)。

条件风格(查询 / 更新 / 删除 / 取行数)

条件为 「列运算符值」 文本,或 文本数组(多条件 AND)。值一律按文本传入,内部绑定;数值列由 SQLite 亲和性转换。

db.查询 ("user", "id=1")
db.查询 ("user", ["id=1", "age=20"])
db.查询 ("user", "部门ID=2", "姓名,年龄", "年龄 DESC", 10)

db.更新 ("user", "年龄=21", "姓名=张三")
db.更新 ("user", ["年龄=21", "分数=90"], ["姓名=张三"])

db.删除 ("user", "姓名=张三")
db.取行数 ("user", "在职=1")

支持运算符:= <> != > >= < <= 以及 LIKE(如 姓名 LIKE 张%)。

可选增强参数(仅 查询):

  • 列名:CSV,空=*
  • 排序:如 年龄 DESC
  • 限制行数<=0 表示不限制

打开与密码

db.打开 ("data.db")
db.打开 ("data.db", 真)              // 只读
db.打开 ("secret.db", 假, "mypass")  // 整库 AES 加密
db.保存 ()                           // 加密会话可立即落盘;关闭() 也会保存

密码非空时:库在内存中操作,关闭/保存时用 AES(与 ZIP 同源)写成带魔数 YPLDB01 的加密文件。
无密码打开加密文件会失败;密码错误会失败。明文 SQLite 文件带密码打开时,会迁入内存并在关闭时改写为加密格式。

这不是 SQLCipher 页级加密;大库会整库载入内存。敏感列仍可用字段级 RC4加密

字段级加密(可选)

用基础库 加密解密RC4加密 / XOR加密 / Base64编码 等,写入前加密、读出后解密。

取文本跨行

文本 姓名 = db.取文本("姓名") 在随后的 取下一行() 后仍有效(运行时会拷贝;赋值侧也会对调用结果 ToTextText)。

常用方法

方法 说明
打开(路径, [只读], [密码]) / 关闭 / 是否打开 / 保存 连接;密码=整库 AES
建表(表, 字段信息[]) / 删表 / 清空表 / 表是否存在 结构
插入(表, 列CSV, 值CSV) / 插入批量(表, 列CSV, 值行[]) 无 SQL 插入
更新(表, 置值, [条件]) 置值/条件:文本或文本数组
删除(表, 条件) 条件必填
查询 + 取下一行 + 取文本/整数/小数 无 SQL 查询游标
取行数(表, [条件]) COUNT
执行SQL / 查询SQL 原生 SQL
开始事务 / 提交 / 回滚 事务
取错误 / 取最后插入ID / 取影响行数 诊断

原生 SQL 示例

db.执行SQL ("CREATE INDEX IF NOT EXISTS idx_age ON 人(年龄)")
db.查询SQL ("SELECT 姓名 FROM 人 WHERE 年龄>=18")