01 - SQLite 简介
01 - SQLite 简介:设计哲学、适用场景与对比分析
1.1 SQLite 是什么
SQLite 是一个 C 语言库,实现了一个 自包含(self-contained)、零配置(zero-configuration)、事务型(transactional) 的 SQL 数据库引擎。它是世界上部署最广泛的数据库——存在于每一部智能手机、每一台 Mac、大多数 Windows 电脑以及无数嵌入式设备中。
| 属性 | 说明 |
|---|---|
| 首次发布 | 2000 年 8 月 |
| 作者 | D. Richard Hipp |
| 许可证 | Public Domain |
| 语言 | 纯 C 语言 |
| 存储格式 | 单一磁盘文件 |
| 最大数据库大小 | 281 TB(理论) |
| 最大行大小 | 1 GB |
| 最大列数 | 2000 |
| 支持的 SQL 标准 | SQL-92 大部分 |
1.2 设计哲学
SQLite 的设计围绕以下核心原则:
1.2.1 简单(Simple)
- 零配置:不需要
CREATE DATABASE、不需要用户管理、不需要守护进程 - 单一文件:整个数据库就是一个普通的磁盘文件
- 零依赖:不依赖外部库或系统服务
-- 只需一行命令就能创建数据库
-- 在终端中:
-- sqlite3 myapp.db
-- 然后直接开始使用
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
1.2.2 可靠(Reliable)
- 数据库文件是 跨平台 的(大端/小端自动处理)
- 支持 ACID 事务(原子性、一致性、隔离性、持久性)
- 通过 journal 模式 或 WAL 模式 保证崩溃安全
1.2.3 便携(Portable)
- 支持几乎所有操作系统(Linux、macOS、Windows、Android、iOS、FreeBSD……)
- 数据库文件在不同架构之间可直接复制使用
- 源码仅约 15 万行 C 代码
1.2.4 紧凑(Compact)
- 编译后的库体积极小(约 600 KB)
- 内存占用低(运行时通常仅需几 MB)
- 数据库文件格式紧凑,无冗余开销
1.3 适用场景
SQLite 在以下场景中表现出色:
| 场景 | 说明 | 示例 |
|---|---|---|
| 嵌入式设备 | 资源受限、无需服务进程 | IoT 传感器数据存储 |
| 移动应用 | Android/iOS 内置支持 | 微信本地聊天记录 |
| 桌面应用 | 零部署、无需安装数据库服务 | 浏览器历史记录(Chrome/Firefox) |
| 本地缓存 | 替代 Redis 作为应用级缓存 | API 响应缓存 |
| 数据分析 | 直接查询 CSV/JSON 数据集 | 数据科学探索 |
| 测试 | 替代生产数据库进行单元测试 | pytest + :memory: |
| 单用户 Web 应用 | 中小流量站点 | 个人博客、内部工具 |
| 文件格式 | 作为应用程序的自定义文件格式 | 某些 CAD 软件的工程文件 |
1.4 不适用场景
SQLite 不适合 的场景:
| 场景 | 原因 | 推荐替代 |
|---|---|---|
| 高并发写入 | 写锁粒度为整个数据库 | PostgreSQL、MySQL |
| 客户端-服务器架构 | 无法通过网络访问 | PostgreSQL、MySQL |
| 超大规模数据 | 单机文件系统限制 | 分布式数据库 |
| 多用户协作 | 缺乏用户/权限管理 | PostgreSQL |
| 需要存储过程 | 不支持(只能通过扩展模拟) | PostgreSQL |
1.5 SQLite vs 客户端-服务器数据库
1.5.1 架构对比
┌─────────────────────────────────────┐
│ SQLite 架构 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 应用程序 │───▶│ SQLite │ │
│ └──────────┘ │ (进程内) │ │
│ └────┬─────┘ │
│ ▼ │
│ ┌──────────┐ │
│ │ 数据库文件│ │
│ └──────────┘ │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 客户端-服务器架构 (如 PostgreSQL) │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 应用程序A │───▶│ │ │
│ └──────────┘ │ 数据库 │ │
│ ┌──────────┐ │ 服务器 │ │
│ │ 应用程序B │───▶│ │ │
│ └──────────┘ └────┬─────┘ │
│ ▼ │
│ ┌──────────┐ │
│ │ 数据存储 │ │
│ └──────────┘ │
└─────────────────────────────────────┘
1.5.2 详细对比
| 特性 | SQLite | PostgreSQL/MySQL |
|---|---|---|
| 部署方式 | 进程内嵌入 | 独立服务进程 |
| 配置复杂度 | 零配置 | 需要安装和配置 |
| 网络访问 | ❌ 不支持 | ✅ 支持 |
| 并发读 | ✅ 不限制 | ✅ 不限制 |
| 并发写 | ⚠️ 单写多读 | ✅ 多写 |
| 最大数据库大小 | 281 TB | 理论无限制 |
| 用户权限管理 | ❌ 不支持 | ✅ 完整支持 |
| 数据类型 | 动态类型 | 严格类型 |
| 存储过程 | ❌ 不支持 | ✅ 支持 |
| 外键约束 | ✅(需开启) | ✅ 默认开启 |
| 全文搜索 | ✅ FTS5 | ✅ tsvector/tsquery |
| 复制 | ❌ 不支持 | ✅ 主从/逻辑复制 |
| 许可证 | Public Domain | PostgreSQL/MIT 或 GPL |
| 典型延迟 | < 1 ms(本地) | 1-10 ms(网络) |
1.6 SQLite 的发展历程
2000 SQLite 诞生(D. Richard Hipp 为美国海军创建)
2001 开源发布
2004 加入 ACID 事务支持
2005 Apple 将 SQLite 集成到 macOS
2007 Google 将 SQLite 集成到 Android
2010 SQLite 加入 FTS3/FTS4 全文搜索
2013 WAL(Write-Ahead Logging)模式成熟
2015 引入 FTS5 全文搜索引擎
2018 引入 JSON 函数支持
2020 引入 STRICT 表模式
2022 SQLite 加入 STREEv2 树结构实验性支持
2024 SQLite 4.0 持续迭代
1.7 谁在使用 SQLite
SQLite 被广泛应用于以下知名项目:
| 项目/公司 | 用途 |
|---|---|
| Android | 本地数据库存储 |
| iOS/macOS | 系统级数据存储 |
| Chrome / Firefox / Safari | 浏览器历史记录、缓存 |
| Python | 内置 sqlite3 标准库 |
| PHP | 默认支持 |
| Electron | 桌面应用本地存储 |
| Git | 某些可选后端 |
| Django | 开发环境默认数据库 |
| airbnb, Expedia | 部分内部工具 |
1.8 第一个 SQLite 程序
让我们用一个完整的例子来感受 SQLite 的简洁:
-- 创建数据库并定义表结构
-- 命令行:sqlite3 school.db
-- 1. 创建表
CREATE TABLE students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER CHECK(age > 0 AND age < 150),
grade TEXT,
score REAL DEFAULT 0.0,
created_at TEXT DEFAULT (datetime('now'))
);
-- 2. 插入数据
INSERT INTO students (name, age, grade, score) VALUES
('张三', 18, '高三', 92.5),
('李四', 17, '高二', 88.0),
('王五', 16, '高一', 95.5),
('赵六', 18, '高三', 78.0),
('孙七', 17, '高二', 85.5);
-- 3. 查询数据
-- 查看所有学生
SELECT * FROM students;
-- 按成绩排序
SELECT name, score FROM students ORDER BY score DESC;
-- 统计各年级平均分
SELECT grade, AVG(score) AS avg_score, COUNT(*) AS count
FROM students
GROUP BY grade
ORDER BY avg_score DESC;
-- 4. 更新数据
UPDATE students SET score = 90.0 WHERE name = '赵六';
-- 5. 删除数据
DELETE FROM students WHERE name = '孙七';
-- 6. 验证结果
SELECT name, grade, score FROM students ORDER BY score DESC;
预期输出:
张三|高三|92.5
王五|高一|95.5
李四|高二|88.0
赵六|高三|90.0
1.9 SQLite 版本与发行
| 版本线 | 说明 |
|---|---|
| SQLite 3.x | 当前主流版本,强烈推荐 |
| SQLite 2.x | 已淘汰,不支持许多特性 |
| SQLite Encryption Extension (SEE) | 商业加密版本 |
| SQLCipher | 开源加密分支(基于 SQLite) |
-- 查看当前 SQLite 版本
SELECT sqlite_version();
-- 输出示例:3.45.1
-- 查看编译选项
PRAGMA compile_options;
⚠️ 注意事项
- SQLite 不是客户端-服务器数据库——不能通过网络从远程访问,如果需要远程访问,应选择 PostgreSQL 或 MySQL
- WAL 模式下不要放在网络文件系统(NFS/SMB)上——可能导致数据库损坏
- SQLite 的并发写能力有限——如果有大量并发写入需求,应考虑其他方案
- AUTOINCREMENT 关键字有额外开销——如果不需要严格单调递增,仅用
INTEGER PRIMARY KEY即可
💡 技巧
- SQLite 的数据库文件可以作为应用程序的文件格式——比自定义二进制格式更灵活、更可靠
- 使用
:memory:创建内存数据库进行快速测试 .schema命令可以快速查看表结构- SQLite 支持跨数据库查询(
ATTACH DATABASE)
📌 业务场景
场景一:移动 App 本地存储
你在开发一个 iOS/Android App,需要在本地存储用户设置、缓存数据和离线内容。SQLite 是最佳选择——零依赖、零配置、性能优秀。
场景二:桌面应用文件格式
你正在开发一个笔记应用,需要将所有笔记存储在一个可移植的文件中。SQLite 的单一文件特性使其成为理想的文件格式。
场景三:开发/测试环境
团队使用 PostgreSQL 作为生产数据库,但希望在开发和 CI 中使用更轻量的替代品。SQLite 可以替代大部分 CRUD 场景(注意 SQL 方言差异)。
🔗 扩展阅读
- SQLite 官方文档 - Appropriate Uses For SQLite
- SQLite 官方文档 - SQLite Is Serverless
- SQLite vs PostgreSQL - 何时选择哪个
- SQLite 内部原理(官方)
- SQLite 源码仓库
📖 下一章:02 - 安装与工具 —— 各平台安装 SQLite、命令行工具与 GUI 工具的使用