一、什么是 SQLite?
SQLite 是一个开源、零配置、无服务器、嵌入式的关系型数据库管理系统(RDBMS),由 D. Richard Hipp 于 2000 年开发。它以 C 语言实现,整个数据库引擎被编译为一个轻量级库(通常小于 1MB),可直接集成到应用程序中。
我们日常所说的 "SQLite" 实际上指的是其当前主流版本 ------ SQLite3(自 2004 年发布至今)。
据官方统计,SQLite 全球装机量已突破 1 万亿次,广泛应用于从智能手机到飞机控制系统的各类设备中。
二、核心特性
| 特性 | 说明 |
|---|---|
| 无服务器架构 | 无需独立数据库进程,通过函数调用直接操作数据文件。 |
| 单文件存储 | 整个数据库(表、索引、触发器等)保存在一个 .db 文件中,便于迁移、备份和共享。 |
| ACID 事务支持 | 即使在断电或崩溃情况下,也能通过回滚日志保证数据一致性。 |
| 跨平台兼容 | 支持 Windows、Linux、macOS、Android、iOS 等所有主流系统。 |
| 零配置 | 无需安装、部署或管理,开箱即用。 |
| 资源占用极低 | 仅需几百 KB 内存,非常适合移动设备和嵌入式系统(如手机、IoT 设备)。 |
| SQL 标准支持 | 兼容大部分 SQL-92 语法,支持 JOIN、VIEW、TRIGGER、全文搜索(FTS)等高级功能。 |
三、与"直接存本地文件"的本质区别
很多人会问:"既然数据最终都存在本地,为什么不直接写 JSON 或 TXT 文件?"
| 对比项 | 直接存文件(如 JSON/CSV) | SQLite |
|---|---|---|
| 数据结构 | 非结构化,靠程序约定格式 | 强结构化(表、字段、约束) |
| 查询能力 | 无,需全量读取后手动筛选 | 支持高效 SQL 查询(带索引优化) |
| 更新效率 | 通常需重写整个文件 | 只修改目标记录,支持事务 |
| 并发安全 | 易出错,需自行加锁 | 内置文件锁机制,保证 ACID |
| 扩展性 | 数据量大时性能急剧下降 | 轻松处理百万级记录 |
| 适用场景 | 配置、日志、缓存等简单数据 | 用户信息、消息、订单等结构化业务数据 |
✅ 简单说:SQLite = 带搜索引擎 + 事务保护 + 结构管理 的智能本地文件。
四、核心使用场景(真实落地案例)
1. 📱 移动应用本地存储
- 用途:用户配置、聊天记录、离线内容、收藏夹
- 实例:微信、淘宝、WhatsApp 均使用 SQLite 存储本地数据。
- 优势:无网络时仍可操作,启动快,结构清晰。
2. 🖥 桌面软件数据管理
- 用途:浏览器书签(Chrome/Firefox)、邮件索引(Thunderbird)、播放列表(VLC)
- 实例:Adobe Lightroom 用 SQLite 管理照片元数据;Electron 应用(如 VS Code 插件)常用于配置存储。
- 优势:替代传统 INI/JSON 文件,支持复杂查询。
3. 🌐 Web 开发与原型验证
- 用途:小型网站后端、Django/Flask 默认数据库、Serverless 函数缓存
- 实例:SQLite 官网自身使用 SQLite,日均处理 50 万请求。
- 注意:不适合高并发写入的生产系统。
4. 🚗 嵌入式系统与物联网(IoT)
- 用途:智能家居日志、车载导航历史、工业传感器缓存、医疗设备记录
- 实例:Airbus A350 飞行控制系统、特斯拉车辆日志、三一重工智能工厂。
- 优势:最小仅需 256KB 内存,适合资源受限设备。
5. 🧪 开发测试与数据分析
- 用途:单元测试临时库、爬虫数据存储、日志分析、Pandas 中间结果缓存
- 优势:一个文件 = 完整数据集,便于分享与复现。
6. 📦 数据交换与归档
- 用途:替代 ZIP/CSV 作为结构化容器;政府/科研机构公开数据集分发
- 实例:GeoPackage(地理空间标准)、Apple Photos 库内部结构。
- 优势:跨平台、自描述、支持索引。
7. 🌍 浏览器前端(通过 WASM)
- 用途:PWA 离线存储、在线 SQL 教学平台、浏览器插件
- 工具 :
sql.js将 SQLite 编译为 WebAssembly,在浏览器中运行完整 SQL 引擎。 - 优势:前端也能执行 JOIN、子查询等复杂操作。
但是,对于 90% 的前端应用(如缓存用户设置、保存草稿、离线表单),IndexedDB + Dexie.js 已足够,无需引入完整的 SQL 引擎。
| 方案 | 特点 | 适用场景 |
|---|---|---|
localStorage / sessionStorage |
键值对、简单、同步、5--10MB 限制 | 用户偏好、临时状态 |
| IndexedDB | 浏览器原生 NoSQL 数据库,支持索引、事务、大容量(>250MB) | 复杂离线应用(如 PWA) |
| Dexie.js | IndexedDB 的优雅封装,提供类 SQL 查询语法 | 开发者友好型数据管理 |
五、Node.js 中使用 SQLite 的三种主流方式(附完整示例)
Node.js 社区提供了多种成熟方案来操作 SQLite。以下是三种最常用的方式及其完整代码示例:
1. sqlite3 ------ 异步非阻塞经典库
适用于需要异步 I/O 的 Web 应用或服务端场景。
js
// 安装:npm install sqlite3
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./example.db');
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT
)`);
const stmt = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
stmt.run("张三", "zhangsan@example.com");
stmt.finalize();
db.each("SELECT id, name FROM users", (err, row) => {
if (!err) console.log(`${row.id}: ${row.name}`);
});
});
db.close();
2. better-sqlite3 ------ 高性能同步库(推荐)
性能卓越,API 简洁,适合桌面应用、脚本工具或中小型后端。
js
// 安装:npm install better-sqlite3
const Database = require('better-sqlite3');
const db = new Database('app.db');
db.pragma('journal_mode = WAL');
db.exec(`
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
price REAL
)
`);
const insert = db.prepare('INSERT INTO products (name, price) VALUES (?, ?)');
insert.run('苹果', 5.5);
const products = db.prepare('SELECT * FROM products WHERE price > ?').all(4.0);
console.log(products); // [{ id: 1, name: '苹果', price: 5.5 }, ...]
db.close();
3. node:sqlite ------ Node.js 官方实验性模块(v22.5+)
未来可能成为标准,目前需启用实验标志。
js
// 启动命令:node --experimental-sqlite app.mjs
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`CREATE TABLE data (key INTEGER PRIMARY KEY, value TEXT) STRICT`);
const insert = db.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
insert.run(1, 'hello');
insert.run(2, 'world');
console.log(db.prepare('SELECT * FROM data ORDER BY key').all());
// [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]
db.close();
六、局限性与注意事项
尽管 SQLite 功能强大,但并非万能:
- ❌ 不支持高并发写入:同一时间仅允许一个写操作(多读单写)。
- ❌ 无用户权限管理:权限由操作系统文件权限控制。
- ❌ 不适合超大规模数据:建议用于 1TB 以下场景。
- ❌ 无法远程访问:不能像 MySQL 那样通过网络连接。
📌 最佳实践 :将 SQLite 作为本地缓存层,配合云端数据库实现多端协同。
七、总结
SQLite 凭借其 轻量、可靠、易集成、高性能 的特点,成为从手机到飞机、从浏览器到工厂的"隐形基石"。它不是 Oracle 或 MySQL 的替代品,而是 fopen() 的升级版------当你需要比普通文件更强大的数据管理能力,却又不想引入复杂服务时,SQLite 就是最优解。
适用口诀 :
小数据、本地存、结构化、要查询 → 选 SQLite!
多人写、高并发、远程访、强权限 → 选传统数据库!