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():编译时钩子,对数据库一切事件的细粒度控制,能限制对数据库、表、列的访问和修改。
使用线程
共享缓存模式