TCL語言的SQLite3擴展庫
SQLite數(shù)據(jù)庫是由C語言編寫輕量級數(shù)據(jù)庫,跟TCL語言很有淵源。SQLite通過第三方擴展的形式支持24種語言,但是創(chuàng)始人 “理查德希普 D.RichardHipp” 的官方版只綁定了TCL語言。當(dāng)然后來的事情大家就都知道了,TCL語言山河日下、SQLite數(shù)據(jù)庫蒸蒸日上,并且早就已經(jīng)獨立了。但也正因為這段歷史淵源,SQLite對TCL語言的支持還是不錯的。
package require sqlite3
這個擴展庫提供的sqlite3命令跟proc命令類似,它接收兩個必要參數(shù),第一個參數(shù)是新命令的名字;第二個參數(shù)是數(shù)據(jù)庫的完整路徑,如果數(shù)據(jù)庫跟源代碼在同一個目錄里,那么只需要數(shù)據(jù)庫文件名就可以了。
sqlite3命令會創(chuàng)建一個新命令,新命令自帶一堆的子命令,并且自動調(diào)用對應(yīng)的數(shù)據(jù)庫文件(類似于面向?qū)ο蟾拍畹睦^承)。如果需要同時調(diào)用多個數(shù)據(jù)庫的話,就可以用sqlite3創(chuàng)建多個新命令,這些命令會分別調(diào)用指定的數(shù)據(jù)庫。
創(chuàng)建多個新命令調(diào)用同一個數(shù)據(jù)庫也是允許的,在絕大多數(shù)情況下這是為有自虐傾向的程序員準(zhǔn)備的,除非極其特殊的情況,否則不要這么干。
sqlite3? 新命令名? 數(shù)據(jù)庫名? ?可選參數(shù)??
注:下例中db是新命令名test.db是數(shù)據(jù)庫文件名
-create ?true/false
默認是 -create ?true當(dāng)數(shù)據(jù)庫不存在時自動創(chuàng)建;如果是false則數(shù)據(jù)庫不存在時會報錯。
?sqlite3 db test.db -create false
-nomutex
關(guān)閉數(shù)據(jù)庫的互斥鎖。僅用于單線程的應(yīng)用程序,可以稍微提高性能。在多線程程序中可能會導(dǎo)致一些數(shù)據(jù)錯誤。
?sqlite3 db test.db -nomutex true
-readonly
以只讀模式打開數(shù)據(jù)庫。如果之前的數(shù)據(jù)庫進程沒有正常退出的話,有可能無法以只讀模式打開。
?sqlite3 db test.db -readonly true
-uri
uri是統(tǒng)一資源標(biāo)識符,如果使用了uri參數(shù),數(shù)據(jù)庫路徑這部分,就以uri來解析,更多信息參考文檔
?sqlite3 db test.db -uri true
uri相關(guān)文檔:https://www.sqlite.net.cn/uri.html
-vfs 虛擬文件系統(tǒng)名稱
VFS是指虛擬文件系統(tǒng),簡單的說就是一個文件系統(tǒng)的編程接口,通過VFS這種虛擬文件系統(tǒng)呢,可以對文件進行操作,而不用關(guān)心存儲介質(zhì)的類型(也就是不用操心是硬盤還是U盤,還是存儲卡);同時VFS也可以降低跨平臺的移植難度,在不同的操作系統(tǒng)上,只要底層實現(xiàn)了VFS,那么所有的文件操作,就都是通用的了。
sqlite3 db test.db -vfs win32
在本例中使用的win32是win系統(tǒng)的默認虛擬文件系統(tǒng)名稱,更多名稱參考文檔:
https://www.sqlite.net.cn/vfs.html
主要功能
eval:執(zhí)行sql
示例數(shù)據(jù)庫,表格名稱 tb

解釋一下這里的二次替換:在 db eval "SELECT * FROM tb WHERE id = $omg" 語句中,Tcl語言先按照語法把$omg替換成:orz,然后把替換后的"SELECT * FROM tb WHERE id = :orz"字符串提交給db eval命令,此時db eval命令再次將:orz替換成了2,于是就相當(dāng)于進行了二次替換。
默認情況下TCL語言會使用空字符表示空值(TCL語言只有字符串一種數(shù)據(jù)類型,沒有空值)。但是在某些情況下這樣不行,該功能可以設(shè)置空值的形式,比如下例中,將空值設(shè)定為NULL(注意:在TCL語言里,NULL也只是字符串)
close 關(guān)閉數(shù)據(jù)庫
關(guān)閉數(shù)據(jù)庫會自動刪除相關(guān)的命令,比如下例中,db命令也自動被刪除了。
backup 備份數(shù)據(jù)庫
backup 可以完整的備份整個數(shù)據(jù)庫,常用于將 :memory: 內(nèi)存數(shù)據(jù)庫保存到文件中
從數(shù)據(jù)庫文件里,復(fù)制內(nèi)容到當(dāng)前數(shù)據(jù)庫中。注意:會覆蓋當(dāng)前數(shù)據(jù)庫里的內(nèi)容。常用于將數(shù)據(jù)庫導(dǎo)入 :memory: 內(nèi)存數(shù)據(jù)庫。
incrblob 讀寫二進制
該功能打開一個TCL通道,在通道中讀寫二進制數(shù)據(jù)。
version 顯示版本
serialize/deserialize 序列化
這是成對命令,序列化和反序列化數(shù)據(jù)庫。序列化的作用是把數(shù)據(jù)庫轉(zhuǎn)換為二進制數(shù)據(jù),保存到TCL數(shù)組中,然后可以保存到文件里。也可以通過網(wǎng)絡(luò)通道,發(fā)送給其它程序,程序接收后,可以使用反序列化功能,將二進制數(shù)據(jù)轉(zhuǎn)換為完整的數(shù)據(jù)庫。
該功能需要使用特定的編譯參數(shù)編輯SQLite才能使用該功能。
*注意,還有許多功能沒有介紹,請參考官方文檔