SQLite(嵌入式数据库)支持库
此支持库使用的 SQLite 组件体积较小,但并非最新版。
功能一般够用,但不支持一些 SQLite 新版才有的特性。
如果将 sqlite 导入语句替换为 sqlite.latest 扩展库导入语句,
则会改用新版 SQLite 组件,体积会大一些,但支持的功能更多一些。
其他代码中的 sqlite 不需要替换为 sqlite.latest
如果需要自定义 SQLite 版本,请参考 sqlite.latest 扩展库源码
创建内存数据库
参数一指定数据库路径,支持自动创建数据库文件.
第二个参数(可选参数)指定数据库密钥,sqlite.aes128或sqlite.aes256支持该参数.
第三个参数(可选参数)使用一个或多个_SQLITE_OPEN_前缀常量指定连接选项
默认启用多线程模式,多线程共用单个数据连接不安全,否则就是安全的
多线程模式可并发读,但不可同时写入
使用 URI 指定数据库路径与参数。
参数@2 可选用表指定 URI 参数,或用字符串指定密钥。
也可以在参数 @1 的 URI 后面直接写参数。
文档 https://www.sqlite.org/uri.html
4 //回调函数请求中止
23 //认证禁止
5 //数据库文件被锁定
14 //不能打开数据库文件
19 //因约束违背而中止
11 //数据库文件变形
101 //sqlite3_step()完成执行,已无数据
16 //数据库是空的
1 //SQL错误或数据库不存在
24 //附属数据库格式错误
13 //插入失败因为数据库满
2 //SQLite内部逻辑错误(没有使用)
9 //操作被sqlie3_interrupt()中止
10 //磁盘I=O错误
6 //数据库中的一表被锁定
20 //数据类型不匹配
21 //库使用方法不当
22 //主机不支持库中操作系统功能
7 //malloc()分配堆失败
26 //打开非数据库文件
12 //表或纪录没有找到(没有使用)
0 //成功执行
3 //访问许可禁止
15 //数据库锁协议错误
25 //sqlite3_bind()第2个参数超出范围
8 //企图写只读数据库
100 //sqlite3_step()有另一行数据就绪
17 //数据库模式改变
18 //单行数据过多(没有使用)
支持AES128位数据加密版本sqlite支持库
参数一指定数据库路径,支持自动创建数据库文件.
第二个参数(可选参数)指定数据库密钥,sqlite.aes128或sqlite.aes256支持该参数.
支持AES256位数据加密版本sqlite支持库
参数一指定数据库路径,支持自动创建数据库文件.
第二个参数(可选参数)指定数据库密钥,sqlite.aes128或sqlite.aes256支持该参数.
第一个参数是API返回的状态值
如果发生错误则抛出异常终断程序,并显示错误信息
dll.api("sqlite3_busy_handler","int(POINTER pDB,pointer handle,pointer)");
dll.api("sqlite3_busy_timeout","int(POINTER pDB,int ms)");
dll.api("sqlite3_changes","int(pointer db)");
参数一: sqlite API的第一个返回值
参数二(可选参数):sqlite返回的错误信息指针
参数三(可选参数): 抛出异常的调用级别,2为调用checkResult的函数,3为调用当前函数的函数
dll.api("sqlite3_close","int(pointer db)");
转义参数指定值为用于 SQL 查询语句的参数化值
如果传入参数是文本则转换为 SQL 标识符,
返回文本首尾会添加反引号,
如果传入参数是表, 则格式化为 SQL 键值对并以 AND 为分隔符,
如果表中的值为数组,则格式化为 IN 语句
dll.api("sqlite3_exec","int(POINTER db,STRING sql,pointer callback,pointer callback_arg,pointer &)");
dll.api("sqlite3_finalize","int(POINTER stmt)");
格式化 SQL 查询语句。
所有需要格式化 SQL 语句的函数调用此函数格式化 SQL语句,
如果格式化参数不是表则调用 string.format格式化,否则按以下规则格式化:
SQL语句中?或??占位符使用表的数组元素格式化,
@字符开始的命名参数使用表的名值对元素格式化,
其中??格式化为标识符,其他占位符格式化为参数值。
字符串转为SQL安全转义字符串,buffer转为X'4D7953514C'格式,
数组则自动展开为列表,例如{'a', 'b'}格式化为'a', 'b'
嵌套数组则格式化为分组列表,例如{{'a', 'b'}, {'c', 'd'}} 格式化为 ('a', 'b'), ('c', 'd')
非数组的命名表,则格式化为 SQL 键值对,默认以逗号为分隔符,
??占位符格式化 SQL 键值对则以 AND 为分隔符,并将数组值转换为IN语句
dll.api("sqlite3_last_insert_rowid","int(pointer db)");
参数1:指定数据库连接句柄,
参数2:可选使用此参数指定错误代码,
返回最后一次发生错误的错误信息,以及错误代码.
dll.api("sqlite3_prepare","int(POINTER db,string szSql,int nByte,pointer &stmt,pointer& pzTail)");
dll.api("sqlite3_prepare_v2","int(POINTER db,string szSql,int nByte,pointer &stmt,pointer& pzTail)");
dll.api("sqlite3_reset","int(POINTER stmt)");
dll.api("sqlite3_step","int(POINTER stmt)");
参数可以是时间数值、时间字符串、或其他datetime对象
返回time对象,默认使用格式化串"%Y-%m-%d %H:%M:%S"
返回版本号数值,以及文本值
dll.api("sqlite3_wal_checkpoint","int(POINTER pDB,pointer zDb)");
dll.api("sqlite3_bind_blob","int(pointer stmt, int, pointer, int n, pointer )");
dll.api("sqlite3_clear_bindings","int(pointer stmt)");
dll.api("sqlite3_bind_double","int(pointer stmt, int, double)");
dll.api("sqlite3_bind_int","int(pointer stmt, int, int)");
dll.sqlite3_bind_int64;
dll.api("sqlite3_bind_parameter_index","int(pointer stmt, string zName)");
dll.api("sqlite3_bind_text","int(pointer stmt, int, string, int n,pointer )");
dll.api("sqlite3_bind_text16","int(pointer stmt, int,ustring, int, pointer )");
dll.api("sqlite3_bind_value","int(pointer stmt, int, pointer)");
dll.api("sqlite3_bind_zeroblob","int(pointer stmt, int, int n)");
dll.api("sqlite3_bind_null","int(pointer stmt, int)");
dll.api("sqlite3_column_blob","pointer(POINTER stmt, int iCol)");
读取二进制数据,并返回buffer类型字节数组,
如果存储的是一个序列化后的table对象,则返回table对象.
dll.api("sqlite3_column_bytes","int(POINTER stmt, int iCol)");
dll.api("sqlite3_column_bytes16","int(POINTER stmt, int iCol)");
dll.api("sqlite3_column_count","int(POINTER stmt)");
dll.api("sqlite3_column_double","double(POINTER stmt, int iCol)");
dll.api("sqlite3_column_int64","long(POINTER stmt, int iCol)");
返回字段名
返回指定列的数据,自动识别数据类型
返回文本,自动由UTF8转换为ANSI
dll.api("sqlite3_column_text16","pointer(POINTER stmt, int iCol)");
返回类型ID,以及类型名
根据类型ID,返回类型名
dll.api("sqlite3_column_value","int(POINTER stmt, int iCol)");
参数一: sqlite API的第一个返回值
参数二(可选参数):sqlite返回的错误信息指针
对于原始Sqlite API返回的err指针,必须调用此函数转换为字符串并释放该指针
dll.api("sqlite3_get_table","int(POINTER db,string zSql,pointer &pazResult,int &pnRow,int &pnColumn,pointer &errmsg)");
dll.api("sqlite3_free_table","int(pointer azResult)")
开始事务
尝试获取EXCLUSIVE锁(保证没有其他连接)
开始事务
尝试获取RESERVED锁(其他连接可读)
开始DEFERRED事务
默认不获取任何锁,直到需要锁的时候才获取锁,
开启事务以后,可使用rollbackTrans()函数撤消所有更改,
使用commitTrans()函数提交所有更改.
使用此函数可以避免sqlite为每个操作创建一个默认事务
批量操作数据库时可显著提升sqlite执行效率.
sqliteConnObject.busyHandler(
function(strBack,count) {
sleep(1);
return count < 1000; /*重试次数*/
},strBack
)
数据锁定冲突时的重试时间,以毫秒为单位,成功返回true
busyHandler()函数控制重试次数,busyTimeout()函数控制重试时间
这两个函数可相互影响,设置一个必然然取消另一个
返回数据库最近一次运行exec()所改变的行数
关闭数据库连接
在线程结束时,此函数也会自动调用
提交事务
配置数据库。
仅 sqlite.ciphers 等 sqlite 增强扩展库支持此函数。
用法参考相关扩展库文档。
配置数据库。
成功返回当前配置值,失败返回 -1。
@name 指定要修改的配置名,也可以指定包含多个配置名值对的表。
@value 指定配置值,不指定值则用返回当前值。
配置加密算法参数。
仅 sqlite.ciphers 等 sqlite 增强扩展库支持此函数。
用法参考相关扩展库文档。
配置加密算法参数。
成功返回当前配置值,失败返回 -1。
@cipherName 指定加密算法名称。
当前打开的数据库连接对象
for 字段名,字段名2 in sqliteConnObject.each("SELECT * from [表名] ORDER BY 排序字段 DESC LIMIT 长度 OFFSET 开始位置") {
io.print( 字段名,字段名2 )
}
for Type,name,tbl_name,rootpage,sql in sqliteConnObject.each("SELECT * from [sqlite_master]") {
io.print( Type,name,tbl_name,rootpage,sql )
}
sqliteConnObject.enum(sql,格式化参数...enum(
/*sql*/,
function(tname,tvalue){
for(i=1;#tname;1){
io.print(tname[i],tvalue[i])
}
}
)
执行SQL 语句,出错则抛出异常,
可选增加一个或多个格式化参数,
格式化规则请参考 sqlite.format 函数说明,
格式化参数可以是一个表参数,用于替换SQL中占位符指定的参数,
SQL语句用@或:前缀标明的命名参数使用表的名值对成员格式化,
SQL语句中的?或??占位符使用参数表的数组成员格式化,??用于标识符或WHERE条件表
sqliteConnObject.exec("CREATE INDEX 索引名字 ON 表名字(索引字段名字)")
//建立索引可加快该字段查询速度.
sqliteConnObject.exec("CREATE TABLE 表名(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
数值字段名 INTEGER,
浮点字段名 REAL,
文本字段名 TEXT,
二进制字段名 BLOB,
非空字段名 NOT NULL DEFAULT '默认值',
动态类型字段名,
UNIQUE (ID)
);"
)
sqliteConnObject.exec("DELETE FROM sqlite_sequence WHERE name = '表名'")
//自增ID置0
sqliteConnObject.exec("DELETE FROM 表名 ")
//清空表
sqliteConnObject.exec("DROP table 表名 ")
//删除表
sqliteConnObject.exec("VACUUM")//DELETE表后必须调用此语句才能释放空间
sqliteConnObject.exec("INSERT INTO 表名(字段名) VALUES( 值 )")
//插入数据到表中
sqliteConnObject.exec("INSERT INTO 表名(字段名) SELECT '插入值' WHERE NOT EXISTS(SELECT * from 表名 WHERE 条件字段名=查询值);")
//如果符合条件的数据不存在则插入新的数据
sqliteConnObject.exec("journal_mode=DELETE;")
sqliteConnObject.exec("PRAGMA journal_mode=WAL;")
sqliteConnObject.exec("REPLACE INTO [表名] (字段名, 字段名2) VALUES (值, 值2)")
//如果该表有一个主键,那么当主键值相等的时候,该行数据不存在执行插入,存在则执行更新操作
sqliteConnObject.exec("UPDATE 表名 SET 更新字段 = '更新值' WHERE 条件字段 = 条件值;");
判断指定的表是否存在
返回包含行记录组成的table数组对象,
每行是由列名、值组成的table表对象。
参数@2为可选参数:
如果SQL内使用@前缀指定了命名参数,则参数@2使用 table 指定参数的值
并且SQL语句中的?或??占位符将使用 sqlite.format 函数格式化为参数@2对应的值,
否则调用sqlite.format格式化??占位符为参数@2指定的值,
如果参数@2不是表,则调用 string.format 使用参数@2开始的所有参数格式化sql
输入并验证数据库密钥
成功返回true,失败返回false,错误信息,错误代码
该函数需要使用支持加密的DLL组件重新编译sqlite库
获取最后一次插入操作添加记录的ID
作用类似MSSQL的@@IDENTITY
返回最后一次发生错误的错误信息,以及错误代码
编译SQL预处理命令,
1、如果参数@2为表对象,参数表中的数组成员用于格式化 SQL 语句中的??占位符,
2、否则调用string.format格式化SQL 语句,
查询SQL示例:
"SELECT * FROM [表名] WHERE 条件字段=12 ORDER BY 排序字段 DESC LIMIT 1 OFFSET 0"
上面SQL语句中LIMIT n OFFSET i 指定第i条记录开始取n条记录
也可以直接写为 limit i,n
sqliteConnObject.prepare("INSERT INTO [表名] VALUES (?1,?2,?3,?4);")
//创建插入数据SQL命令对象,问号表示参数,可在问号后指定索引
sqliteConnObject.prepare("SELECT DISTINCT 去重字段 FROM [表名]")
添加、清空、重设数据库密钥
成功返回true,失败返回false,错误信息,错误代码
该函数需要使用支持加密的DLL组件重新编译sqlite库
回滚事务,取消所有修改
查询并返回首行数据(名值对格式),失败返回null,状态码。
参数@2为可选参数:
如果参数@2是一个指定了SQL 查询参数值的表,
SQL 中@前缀的命名参数将由数据库绑定同名参数值,这并非调用 sqlite.format 格式化,
SQL语句中的?或??占位符将使用参数@2中的数组值调用 sqlite.format 函数格式化,
如果参数@2不是表,则调用 string.format 使用参数@2开始的所有参数格式化sql
查询并返回首行数据(数组格式),失败返回null,状态码。
参数@2为可选参数:
如果参数@2是一个指定了SQL 查询参数值的表,
SQL 中@前缀的命名参数将由数据库绑定同名参数值,这并非调用 sqlite.format 格式化,
SQL语句中的?或??占位符将使用参数@2中的数组值调用 sqlite.format 函数格式化,
如果参数@2不是表,则调用 string.format 使用参数@2开始的所有参数格式化sql
执行checkpoint操作时,WAL日志文件内容被写回数据库文件
绑定一个参数,参数在SQL 语句中用问号表示
可使用第二个参数指定问号的位置
返回命令对象自身
将bool值转换为数值存储
false存为0,true存为1;
将buffer类型转换为blob类型存储
将cdata类型转换为blob类型存储
清除所有绑定值
成功返回0
绑定一个参数,参数在SQL 语句中用问号表示
可使用第二个参数指定问号的位置
返回命令对象自身
绑定一个参数,参数在SQL 语句中用问号表示
可使用第二个参数指定问号的位置
返回命令对象自身
绑定一个64位参数,
支持整数值或math.size64对象,参数在SQL 语句中用问号表示
可使用第二个参数指定问号的位置
返回命令对象自身
绑定一个空值参数,参数在SQL 语句中用问号表示
可使用第二个参数指定问号的位置
返回命令对象自身
如果是整数则调用bind.int()
是浮点数则调用bind.double;
绑定一个动态类型SQL命令参数
绑定一个命令动态类型SQL命令参数,自动绑定合适的数据类型.
参数2指定索引位置,默认为1
返回命令对象自身
绑定一个表中所有键值对到相应的命名参数,
对所有键名添加"@"字符作为SQL参数名,
返回命令对象自身,以及成功绑定的参数数目.
绑定一个命令动态类型SQL命令参数,自动绑定合适的数据类型.
参数2指定命名参数,参数名可以'@',':','$'等符号作为首字符
绑定一个表中所有键值对到相应的命名参数,
可使用第二个参数指定'@',':','$'等符号作为参数名前缀,
返回命令对象自身,以及成功绑定的参数数目.
返回命名参数的索引值,参数名可以'@',':','$'等符号作为首字符,
成功返回索引,如果在SQL 语句中未找到该名字则返回0
绑定多个动态类型SQL命令参数
可以用一个数组参数或多个参数指定 SQL 命令参数,
绑定参数时将自动选择合适的数据类型,
参数位置对应SQL 语句中的问号位置
返回命令对象自身
存为text类型(UTF8字符串)
如果定义了tostring元方法,则调用并转换为文本存储,
如果是一个时间对象,则使用标准格式转换为文本存储
否则序列化为blob类型存储
绑定一个参数,参数为普通文本
转换为UTF8存入数据库
绑定一个参数,参数为UTF16文本
绑定一个参数,参数为UTF16文本
绑定一个参数,参数为UTF8文本
该函数不会转换编码
返回列数目
返回指定列名字
返回指定列的数据值
此函数自动识别并转换类型
返回指定列字段类型
for 字段名,字段名2 in sqliteStmtObject.each() {
io.print( 字段名,字段名2 )
}
释放预处理命令对象,
应当在不再使用此命令对象时尽早调用此函数。
如果忘记调用,回收对象时也会自动调用此函数
返回当前查询的列名字数组.
返回全部数据,
返回值为table数组,每行记录为一个数组元素.
重新编译SQL预处理命令,
可选参数2:指定查询条件(table对象或字符串),
可选增加任意个附加sql参数.
重置到没有执行之前的状态,已绑定的参数不会变化
执行后需要改变绑定参数时必须首先调用该函数
SQL 指令
执行SQL命令并向下移动一行,成功则返回值大于等于100,
如果提供命令参数表,则自动调用 reset 函数后并自动绑定参数,
参数表可以包含名值对,也可以包含匿名参数值数组
向后移动一行,并返回当前数据,失败返回null,状态码.
返回table对象,键为列名,值为当前行数据
向后移动一行,并返回当前数据,失败返回null,状态码.
返回数组,键为列序号,值为当前行数据
_SQLITE_OPEN_AUTOPROXY=0x20
_SQLITE_OPEN_CREATE=4
_SQLITE_OPEN_DELETEONCLOSE=8
_SQLITE_OPEN_EXCLUSIVE=0x10
_SQLITE_OPEN_FULLMUTEX=0x10000
_SQLITE_OPEN_MAIN_DB=0x100
_SQLITE_OPEN_MAIN_JOURNAL=0x800
_SQLITE_OPEN_MASTER_JOURNAL=0x4000
_SQLITE_OPEN_NOMUTEX=0x8000
_SQLITE_OPEN_PRIVATECACHE=0x40000
_SQLITE_OPEN_READONLY=1
_SQLITE_OPEN_READWRITE=2
_SQLITE_OPEN_SHAREDCACHE=0x20000
_SQLITE_OPEN_SUBJOURNAL=0x2000
_SQLITE_OPEN_TEMP_DB=0x200
_SQLITE_OPEN_TEMP_JOURNAL=0x1000
_SQLITE_OPEN_TRANSIENT_DB=0x400