TCL语言的SQLite3扩展库
SQLite数据库是由C语言编写轻量级数据库,跟TCL语言很有渊源。SQLite通过第三方扩展的形式支持24种语言,但是创始人 “理查德希普 D.RichardHipp” 的官方版只绑定了TCL语言。当然后来的事情大家就都知道了,TCL语言山河日下、SQLite数据库蒸蒸日上,并且早就已经独立了。但也正因为这段历史渊源,SQLite对TCL语言的支持还是不错的。
package require sqlite3
这个扩展库提供的sqlite3命令跟proc命令类似,它接收两个必要参数,第一个参数是新命令的名字;第二个参数是数据库的完整路径,如果数据库跟源代码在同一个目录里,那么只需要数据库文件名就可以了。
sqlite3命令会创建一个新命令,新命令自带一堆的子命令,并且自动调用对应的数据库文件(类似于面向对象概念的继承)。如果需要同时调用多个数据库的话,就可以用sqlite3创建多个新命令,这些命令会分别调用指定的数据库。
创建多个新命令调用同一个数据库也是允许的,在绝大多数情况下这是为有自虐倾向的程序员准备的,除非极其特殊的情况,否则不要这么干。
sqlite3 新命令名 数据库名 ?可选参数?
注:下例中db是新命令名test.db是数据库文件名
-create true/false
默认是 -create true当数据库不存在时自动创建;如果是false则数据库不存在时会报错。
sqlite3 db test.db -create false
-nomutex
关闭数据库的互斥锁。仅用于单线程的应用程序,可以稍微提高性能。在多线程程序中可能会导致一些数据错误。
sqlite3 db test.db -nomutex true
-readonly
以只读模式打开数据库。如果之前的数据库进程没有正常退出的话,有可能无法以只读模式打开。
sqlite3 db test.db -readonly true
-uri
uri是统一资源标识符,如果使用了uri参数,数据库路径这部分,就以uri来解析,更多信息参考文档
sqlite3 db test.db -uri true
uri相关文档:https://www.sqlite.net.cn/uri.html
-vfs 虚拟文件系统名称
VFS是指虚拟文件系统,简单的说就是一个文件系统的编程接口,通过VFS这种虚拟文件系统呢,可以对文件进行操作,而不用关心存储介质的类型(也就是不用操心是硬盘还是U盘,还是存储卡);同时VFS也可以降低跨平台的移植难度,在不同的操作系统上,只要底层实现了VFS,那么所有的文件操作,就都是通用的了。
sqlite3 db test.db -vfs win32
在本例中使用的win32是win系统的默认虚拟文件系统名称,更多名称参考文档:
https://www.sqlite.net.cn/vfs.html
主要功能
eval:执行sql
示例数据库,表格名称 tb

解释一下这里的二次替换:在 db eval "SELECT * FROM tb WHERE id = $omg" 语句中,Tcl语言先按照语法把$omg替换成:orz,然后把替换后的"SELECT * FROM tb WHERE id = :orz"字符串提交给db eval命令,此时db eval命令再次将:orz替换成了2,于是就相当于进行了二次替换。
默认情况下TCL语言会使用空字符表示空值(TCL语言只有字符串一种数据类型,没有空值)。但是在某些情况下这样不行,该功能可以设置空值的形式,比如下例中,将空值设定为NULL(注意:在TCL语言里,NULL也只是字符串)
close 关闭数据库
关闭数据库会自动删除相关的命令,比如下例中,db命令也自动被删除了。
backup 备份数据库
backup 可以完整的备份整个数据库,常用于将 :memory: 内存数据库保存到文件中
从数据库文件里,复制内容到当前数据库中。注意:会覆盖当前数据库里的内容。常用于将数据库导入 :memory: 内存数据库。
incrblob 读写二进制
该功能打开一个TCL通道,在通道中读写二进制数据。
version 显示版本
serialize/deserialize 序列化
这是成对命令,序列化和反序列化数据库。序列化的作用是把数据库转换为二进制数据,保存到TCL数组中,然后可以保存到文件里。也可以通过网络通道,发送给其它程序,程序接收后,可以使用反序列化功能,将二进制数据转换为完整的数据库。
该功能需要使用特定的编译参数编辑SQLite才能使用该功能。
*注意,还有许多功能没有介绍,请参考官方文档