强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

SQLite 完全指南 / 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 详细对比

特性SQLitePostgreSQL/MySQL
部署方式进程内嵌入独立服务进程
配置复杂度零配置需要安装和配置
网络访问❌ 不支持✅ 支持
并发读✅ 不限制✅ 不限制
并发写⚠️ 单写多读✅ 多写
最大数据库大小281 TB理论无限制
用户权限管理❌ 不支持✅ 完整支持
数据类型动态类型严格类型
存储过程❌ 不支持✅ 支持
外键约束✅(需开启)✅ 默认开启
全文搜索✅ FTS5✅ tsvector/tsquery
复制❌ 不支持✅ 主从/逻辑复制
许可证Public DomainPostgreSQL/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;

⚠️ 注意事项

  1. SQLite 不是客户端-服务器数据库——不能通过网络从远程访问,如果需要远程访问,应选择 PostgreSQL 或 MySQL
  2. WAL 模式下不要放在网络文件系统(NFS/SMB)上——可能导致数据库损坏
  3. SQLite 的并发写能力有限——如果有大量并发写入需求,应考虑其他方案
  4. AUTOINCREMENT 关键字有额外开销——如果不需要严格单调递增,仅用 INTEGER PRIMARY KEY 即可

💡 技巧

  1. SQLite 的数据库文件可以作为应用程序的文件格式——比自定义二进制格式更灵活、更可靠
  2. 使用 :memory: 创建内存数据库进行快速测试
  3. .schema 命令可以快速查看表结构
  4. SQLite 支持跨数据库查询ATTACH DATABASE

📌 业务场景

场景一:移动 App 本地存储

你在开发一个 iOS/Android App,需要在本地存储用户设置、缓存数据和离线内容。SQLite 是最佳选择——零依赖、零配置、性能优秀。

场景二:桌面应用文件格式

你正在开发一个笔记应用,需要将所有笔记存储在一个可移植的文件中。SQLite 的单一文件特性使其成为理想的文件格式。

场景三:开发/测试环境

团队使用 PostgreSQL 作为生产数据库,但希望在开发和 CI 中使用更轻量的替代品。SQLite 可以替代大部分 CRUD 场景(注意 SQL 方言差异)。


🔗 扩展阅读


📖 下一章02 - 安装与工具 —— 各平台安装 SQLite、命令行工具与 GUI 工具的使用