SQLite 如何在其 API 生命周期中执行查询
Source: Dev.to
从 SQL 文本到字节码
当应用使用 sqlite3_prepare 预编译查询时,SQLite 会把 SQL 文本翻译成一种已编译的表示形式。内部会创建一个 Vdbe 对象,即准备好执行的字节码程序,并将其加入 sqlite3 连接中的 pVdbe 列表。
- 查询已被编译。
- 尚未执行。
- 没有打开任何游标。
这类似于加载程序但不运行它。
绑定与执行
在执行之前,可以使用 sqlite3_bind_* 系列函数向查询注入值。这些绑定会替换预处理语句中的占位符。
执行由 sqlite3_step 开始,触发以下操作:
- VDBE 解释字节码。
- 动态创建游标。
- 每个游标连接到一个 B‑tree(表或索引)。
- 读取、过滤或修改数据。
这些游标仅在执行期间存在;它们不是永久结构。
游标生命周期
游标的作用域严格限制在单次执行期间:
- 创建:当虚拟机开始执行时。
- 使用:遍历 B‑tree 或 B+‑tree 结构。
- 销毁:执行结束时。
调用 sqlite3_reset 会将语句重置到初始状态并关闭任何活动的游标,确保每次执行都从干净的状态开始,不会残留状态。
清理资源
当不再需要预处理语句时,应用调用 sqlite3_finalize。此步骤:
- 销毁 Vdbe 对象。
- 释放所有相关资源。
- 将语句从连接中移除。
在所有预处理语句都已 finalize 后,应用应使用 sqlite3_close 关闭连接。关闭连接会:
- 销毁
sqlite3对象。 - 使所有相关句柄失效。
- 完全终止会话。
一览完整流程
Open connection → sqlite3_open
Prepare query → sqlite3_prepare
Bind parameters → sqlite3_bind_*
Execute → sqlite3_step
Reset (optional) → sqlite3_reset
Finalize → sqlite3_finalize
Close connection → sqlite3_close结束语
看似只有几次 API 调用,实际上却协调了一系列深层内部操作——编译、游标管理、B‑tree 遍历以及磁盘交互。sqlite3 对象位于中心,充当控制枢纽,将以下部分绑定在一起:
- 预处理语句(Vdbe)
- 执行流程(VM)
- 存储(B‑tree + Pager)
- 应用交互
理解这一生命周期后,SQLite 的行为就变得可预测、结构化且出奇地优雅。