1. SQLite 数据库引擎概述
SQLite 是一个开源的嵌入式关系型数据库引擎,它采用 C 语言编写,具有零配置、无服务器、单文件存储等特点。作为一名长期使用 SQLite 的开发者,我认为它最吸引人的地方在于其"轻"而"全"的特性 - 虽然体积小巧,却完整实现了 SQL92 标准的大部分功能。
1.1 核心特性解析
无服务器架构是 SQLite 区别于 MySQL、PostgreSQL 等数据库的最大特点。这意味着:
- 不需要单独的数据库服务器进程
- 数据库直接存储在普通磁盘文件中
- 应用通过函数库直接访问数据文件
- 非常适合嵌入式系统和单机应用场景
在实际项目中,我经常遇到这样的场景:开发一个桌面应用需要本地数据存储,但又不想引入复杂的数据库服务。这时 SQLite 就是完美的选择 - 只需包含一个几百KB的库文件,就能获得完整的数据库功能。
ACID 事务支持让 SQLite 可以胜任关键业务场景:
- 原子性(Atomicity):事务内的操作要么全部完成,要么全部不执行
- 一致性(Consistency):数据库总是从一个一致状态变到另一个一致状态
- 隔离性(Isolation):并发事务之间互不干扰
- 持久性(Durability):一旦事务提交,其结果就是永久性的
提示:虽然 SQLite 支持并发读取,但写入操作是串行化的。在高并发写入场景下,应考虑其他数据库解决方案。
1.2 适用场景分析
根据我的项目经验,SQLite 特别适合以下场景:
- 嵌入式设备和移动应用:资源受限环境
- 桌面应用程序:需要本地数据存储
- 中小型网站:日均访问量在10万以下
- 应用程序缓存:比文件系统更结构化的缓存方案
- 数据分析:作为数据处理中间层
- 测试环境:快速搭建无需复杂配置
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 跨平台安装与配置
2.1 Windows 平台安装
在 Windows 上使用 SQLite 有两种主要方式:
方法一:命令行工具安装
- 从官网下载预编译的二进制包(sqlite-tools-win32-x86-*.zip)
- 解压到任意目录(如 C:\sqlite)
- 将该目录添加到系统 PATH 环境变量
- 在命令提示符中运行
sqlite3即可启动交互式 shell
方法二:开发库集成
- 下载 amalgamation 版本(sqlite-amalgamation-*.zip)
- 解压得到 sqlite3.c 和 sqlite3.h 文件
- 直接将这两个文件加入你的 C/C++ 项目
- 无需额外依赖即可编译使用
注意:如果使用 Visual Studio,建议将 sqlite3.c 的编译选项设置为 /O2 以优化性能。
2.2 Linux 系统安装
在基于 Debian 的系统(如 Ubuntu)上:
bash复制sudo apt update
sudo apt install sqlite3 libsqlite3-dev
验证安装:
bash复制sqlite3 --version
# 应该输出类似:3.37.2 2022-01-06 13:25:41...
对于开发环境,还需要安装开发头文件:
bash复制sudo apt install libsqlite3-dev
2.3 macOS 系统安装
macOS 系统已预装 SQLite,但版本可能较旧。建议通过 Homebrew 安装最新版:
bash复制brew install sqlite
验证新版是否生效:
bash复制which sqlite3
# 应该显示:/usr/local/bin/sqlite3
3. C/C++ 接口编程基础
3.1 核心 API 概览
SQLite 的 C 接口主要包含以下几类函数:
-
数据库连接管理
- sqlite3_open() / sqlite3_open_v2()
- sqlite3_close() / sqlite3_close_v2()
-
SQL 语句执行
- sqlite3_exec()
- sqlite3_prepare_v2()
- sqlite3_step()
- sqlite3_finalize()
-
错误处理
- sqlite3_errcode()
- sqlite3_errmsg()
-
事务控制
- sqlite3_exec("BEGIN TRANSACTION")
- sqlite3_exec("COMMIT")
- sqlite3_exec("ROLLBACK")
3.2 基本操作示例
下面是一个完整的 C 语言示例,展示如何创建表、插入数据并查询:
c复制#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *err_msg = 0;
// 打开或创建数据库
int rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
// 创建表
const char *sql = "CREATE TABLE IF NOT EXISTS Users("
"Id INT PRIMARY KEY NOT NULL,"
"Name TEXT NOT NULL,"
"Age INT NOT NULL);";
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
retu
