aardio 文档

aardio 范例: sqlite 库 - 增删改查

预处理命令参数绑定规则 | 规则

//sqlite 库 - 增删改查

import sqlite
import console;

var db = sqlite("/test-sqlite.db"); //创建数据库
if( not db.existsTable("film") ){ 
    db.exec( "CREATE TABLE [film](title, length, year, starring);"); //创建表
}  

//增 - 使用预处理命令执行参数化查询,SQL 中用 @ 前缀指定命名参数,单个 ? 指定匿名数组
var cmd = db.prepare("REPLACE INTO film VALUES (@title,@length,@year, 'Jodie Foster');" ) 

/*
参数表中的名值对绑定为命名参数值。
数组成员绑定为匿名参数值。
预处理命令参数绑定规则: https://www.aardio.com/zh-cn/docs/examples/Database/sqlite/prepare.html

绑定值为 time 对象则转为标准格式时间字符串。
绑定值为定义 _tostring 元方法的表使用 tostring 方法转为字符串。
绑定值为未定义 _tostring 元方法的结构体自动转为 buffer 存储(读取时请使用 raw.convert 还原)。
其他普通表以二进制模式序列化存储,读取时自动还原为表对象
*/
cmd.step({
    title = "标题";
    length = 4;
    year = time.now();
})  

//删 - 执行SQL语句,支持参数化 SQL,支持数组参数
db.exec("DELETE FROM ?? WHERE title=?;",{ "film","要删除的标题"} )

//改 - exec 函数也可以用一个表参数指定 SQL 命名参数
db.exec("UPDATE film SET title = @title,length=@length WHERE title = @oldTitle;",{
    title = "新的标题";
    length = #"新的标题";
    oldTitle = "标题";
} );

//查 - 内部创建预处理命令执行参数化查询,返回首行数据
var result = db.stepQuery("SELECT * FROM [film] WHERE title=@title"
    /*
    如果 SQL 中存在 @ 前缀的命名参数,或者参数 @2 是数组或包含数组成员。
    则创建创建预处理命令并绑定参数 @2 指定的表对象内对应的值(匿名参数绑定为数组元素的值)。 

    如果 SQL 语句中包含 '??' ,则改用 sqlite.format 格式化 ?? 与 ? 占位符。
    规则: https://www.aardio.com/zh-cn/docs/examples/Database/sqlite/sqlite.format.html
    */
    ,{ 

        title = "新的标题"
    } 
) 

/*
//查 - 返回首行数据,使用 sqlite.format 格式化匿名参数。
var result = db.stepQuery("SELECT * FROM [film] WHERE ??"
    ,[ 
        { title = "新的标题"} //格式化为 WHERE 条件,数组成员格式化为 IN 子句
    ] 
) 
*/

//查 - 返回首行数据
var result = db.stepQuery("SELECT * FROM [film]"
    /*
    这是上面写法的简化,
    SQL 省略了 WHERE ?? 或 AND ??
    参数 @2 指定第一个匿名参数的值(而不是放到数组中)。
    内部仍然调用 sqlite.format 格式化。
    */
    ,{ title = "新的标题"} 
) 

/*
注意: db 的 stepQuery,stepResult,each,gettable 方法的参数用法遵守相同规则。
*/

//查 - 遍历查询结果
for rowid,title, length, year, starring in db.each("SELECT rowid,* FROM film") {
    /*
    for 语句的第一个返回值如果为 null 就会退出循环,
    如果数据库返回的第一个字段可能为空,那么可以把 SQLite 默认就有的索引字段 rowid 放在最前面
    */
    console.log( rowid,title, length, year, starring  ) 
}

//删除表 
db.exec("DROP TABLE film" );

console.pause();
Markdown 格式