DBMS:database management system,數據庫管理系統
VDBE: virtual database engine, 虛擬數據庫引擎
VM: virtual machine, 虛擬機
frontend:前端
bytecode programs:字節代碼程序
核心API
連接數據庫
sqlite3_open()
執行預查尋
- 准備
- 執行
- 完成
使用參數化SQL
insert into foods (id, name) values (?, ?);
insert into episodes (id, name) values(:id, :name);
參數就是占位符,可在編譯后提供綁定。
參數綁定的優點是無需重新編譯,即可多次執行相同的語句。只需重置改語句、綁定新值,並重新執行。使用重置函數可以避免SQL編譯的開銷。完全避免此法分析、語法分析和代碼生成開銷。通過調用sqlite3_reset()實現重置。
另一個優點是SQLite會處理綁定到參數的轉義字符。可避免語法錯誤和可能的SQL注入式攻擊。
sqlite3_reset()只釋放語句資源,會保持VDBE字節代碼及其參數不變,sql語句無需再次調用prepare()即可再次執行。
執行封裝查詢
兩個非常實用的函數分裝了准備查詢過程。
sqlite3_exec(); 通常用於執行不返回數據的查詢。如insert、update、delete。
sqlite3_get_table(); 通常用於執行返回數據的查詢。可查詢多個表,會返回完整的結果集。
get_table()的優點是一步就可執行查詢並獲得結果。缺點是它將結果完全存儲在內存中。3.24版本中在推薦此函數,但是沒說用哪個函數替代。
錯誤處理
sqlite3_errcode()
sqlite3_errmsg()
sqlite3_errmsg16()
sqlite3_errstr()
SQL語句格式化
sqlite3_mprintf()
sqlite3支持printf()中大多數常見格式選項,以及其他一些非標准的格式(%q, %Q, %w, %w)。
例如%q,他會取代參數列表中以NULL結尾的字符串。同時他會將單引號字符轉義,有助於防止SQL注入攻擊。
可操作的控制
API中包含可以監視、控制或限制數據庫匯總發生什么的命令。SQLite以過濾或者回調函數方式實現該功能。
三種鈎子函數:
- sqlite3_commit_hook():用於檢視連接上的事務提交;
- sqlite3_rollback_hook():用於檢視回滾;
- sqlite3_update_hook():用於來自insert、update、delete命令的更改操作;
- sqlite3_wal_hook():預寫日志(Write Ahead Log, WAL),后面介紹。
- sqlite3_set_authorizer():編譯時鈎子,對數據庫一切事件的細粒度控制,能限制對數據庫、表、列的訪問和修改。
使用線程
共享緩存模式