SQLite 全方位指南:部署、运维、开发与核心功能#

SQLite 是一个轻量级、零配置、单文件的嵌入式关系型数据库引擎。它不是客户端 - 服务器数据库,而是直接链接到应用程序中。它是世界上部署最广泛的数据库引擎,广泛应用于移动设备 (Android/iOS)、浏览器、嵌入式设备、IoT 以及作为中小型 Web 应用的存储后端。


1. 部署与安装#

SQLite 的最大特点是无需安装服务器进程。数据库就是一个普通的磁盘文件。

1.1 系统自带与安装#

大多数 Linux 发行版、macOS 和 Windows 10/11 已预装 SQLite。

# 检查版本
sqlite3 --version

# 如果未安装 (Ubuntu/Debian)
sudo apt-get install sqlite3 libsqlite3-dev

# 如果未安装 (CentOS/RHEL)
sudo yum install sqlite sqlite-devel

# macOS (通常已预装,如需最新版可用 brew)
brew install sqlite

1.2 创建/连接数据库#

只需指定一个文件名。如果文件不存在,SQLite 会自动创建它。

# 创建或连接到名为 mydb.sqlite 的数据库
sqlite3 mydb.sqlite

# 连接到内存数据库 (重启后数据消失,速度极快,适合测试)
sqlite3 :memory:

1.3 编程语言集成#

SQLite 无需驱动配置,通常随语言标准库直接提供:

  • Python: import sqlite3 (内置)
  • PHP: new SQLite3('db.sqlite') (需启用扩展)
  • Go: github.com/mattn/go-sqlite3 (需 CGO) 或 modernc.org/sqlite (纯 Go)
  • Node.js: better-sqlite3 (同步,推荐) 或 sqlite3 (异步)
  • Java/Android: android.database.sqlite (内置)

2. 日常使用命令 (增删改查)#

SQLite 命令行工具 .cli 支持标准 SQL 及部分特有命令。

2.1 常用元命令 (以点开头)#

命令说明
.help显示帮助信息
.tables列出所有表
.schema [table]显示建表语句 (DDL)
.headers on显示查询结果的列名
.mode column以整齐的列模式显示结果
.mode csv / .mode json切换输出格式
.import file.csv table从 CSV 导入数据
.backup file.db在线备份数据库
.restore file.db从备份恢复
.quit.exit退出

2.2 基础 CRUD 操作#

创建 (Create)#

SQLite 支持弱类型动态类型系统,但建议定义类型以获得更好优化。

-- 创建表 (INTEGER PRIMARY KEY 会自动成为 ROWID 并自增)
CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    email TEXT,
    balance REAL DEFAULT 0.0,
    is_active BOOLEAN DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 创建索引
CREATE INDEX idx_users_email ON users(email);

插入 (Insert)#

-- 插入单条
INSERT INTO users (username, email, balance) 
VALUES ('alice', 'alice@example.com', 100.50);

-- 插入多条
INSERT INTO users (username, email) VALUES 
('bob', 'bob@test.com'),
('charlie', 'charlie@test.com');

查询 (Select)#

-- 基本查询
SELECT * FROM users WHERE id = 1;

-- 模糊查询与排序
SELECT username, email FROM users 
WHERE username LIKE 'a%' 
ORDER BY created_at DESC 
LIMIT 10;

-- 聚合查询
SELECT COUNT(*) as total, SUM(balance) as total_money 
FROM users 
WHERE is_active = 1;

-- 日期函数 (SQLite 特色)
SELECT username, Date(created_at) as reg_date 
FROM users 
WHERE Date(created_at) = Date('now');

更新 (Update)#

-- 更新字段
UPDATE users 
SET balance = balance + 50.0, is_active = 1 
WHERE username = 'alice';

删除 (Delete)#

-- 删除记录
DELETE FROM users WHERE id = 5;

-- 清空表 (重置自增 ID)
DELETE FROM users; 
-- 或者彻底重置表结构 (更快)
DROP TABLE users; 
-- 若要保留表但重置自增计数器:
DELETE FROM sqlite_sequence WHERE name='users';

3. 运维与研发常用命令#

由于 SQLite 是嵌入式的,“运维”更多是指文件管理和应用层面的优化。

3.1 运维/管理常用操作#

场景命令/操作说明
检查完整性PRAGMA integrity_check;核心,检查数据库文件是否损坏
快速检查PRAGMA quick_check;比 integrity_check 更快,只检查大部分错误
** Vacuum (整理)**VACUUM;重建数据库文件,回收碎片空间 (类似 defrag)
分析统计ANALYZE;收集表 statistics 帮助查询优化器选择最佳索引
查看表大小SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size();计算数据库文件逻辑大小
** WAL 模式切换**PRAGMA journal_mode=WAL;强烈推荐,开启预写日志以提升并发写入性能
同步模式PRAGMA synchronous=NORMAL;WAL 模式下通常设为 NORMAL 以平衡性能与安全
备份文件cp db.sqlite db_backup.sqlite (需确保无写入) 或 .backup 命令物理复制文件即可备份 (简单粗暴)
导出 SQL.dump将完整数据库结构 + 数据导出为 SQL 文本
导入 SQLsqlite3 db.sqlite < dump.sql从 SQL 文本恢复

3.2 研发常用技巧#

场景命令/SQL说明
解释执行计划EXPLAIN QUERY PLAN SELECT ...;查看是否使用了索引 (Seek 还是 Scan)
内存数据库sqlite3 :memory:单元测试首选,速度极快,关闭即销毁
临时表CREATE TEMP TABLE ...会话级临时表,自动清理
UPSERTINSERT ... ON CONFLICT(id) DO UPDATE ...存在则更新,不存在则插入 (需 SQLite 3.24+)
JSON 支持SELECT json_extract(data, '$.name') FROM tbl;原生支持 JSON 解析 (需 SQLite 3.9+)
生成序列WITH RECURSIVE cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x<100) SELECT x FROM cnt;利用 CTE 生成数字序列
附件数据库ATTACH DATABASE 'other.db' AS other;跨库查询 (Join 不同文件的表)
只读模式sqlite3 file:db.sqlite?mode=ro以只读方式打开,防止意外修改

4. 核心自带功能讲解#

4.1 无服务器架构 (Serverless)#

  • 零配置: 不需要启动服务、创建用户、配置端口。
  • 单文件: 整个数据库(结构、数据、索引)存储在一个跨平台的磁盘文件中。
  • 跨平台: 数据库文件可以在不同操作系统 (Linux, Windows, macOS, Android, iOS) 之间直接复制使用。

4.2 数据类型 (动态类型)#

SQLite 使用动态类型系统。数据的类型关联的是本身,而不是容器(列)。

  • NULL: 空值。
  • INTEGER: 有符号整数。
  • REAL: 浮点数。
  • TEXT: 文本字符串。
  • BLOB: 二进制数据。
  • 特性: 你可以向定义为 INTEGER 的列存入文本 “Hello”,SQLite 不会报错(除非有严格类型约束)。

4.3 事务与并发控制 (WAL 模式)#

  • 默认模式 (DELETE/JOURNAL): 写操作会锁住整个数据库文件。并发写入性能差。
  • WAL 模式 (Write-Ahead Logging):
    • 写入操作追加到 -wal 文件,不直接修改主数据库文件。
    • 读写不阻塞: 读者可以继续读旧版本,写者同时写入 WAL 文件。
    • 显著提升并发性能,是现代 Web 应用使用 SQLite 的必选项
    PRAGMA journal_mode=WAL;
    PRAGMA synchronous=NORMAL;
    PRAGMA cache_size=-64000; -- 设置 64MB 缓存

4.4 丰富的内置函数#

SQLite 内置了大量函数,减少应用层逻辑:

  • 数学: abs(), round(), random(), ceil().
  • 字符串: substr(), replace(), trim(), instr(), lower(), upper().
  • 日期时间: date(), time(), datetime(), julianday(), strftime(). (支持 modifiers 如 '+1 day', 'start of month').
  • 聚合: avg(), count(), group_concat() (非常有用,将多行合并为字符串), max(), min(), sum(), total().
  • JSON: json(), json_array(), json_object(), json_extract(), json_set().

4.5 全文搜索 (FTS5)#

通过扩展模块 fts5 提供强大的全文检索功能。

-- 创建 FTS 虚拟表
CREATE VIRTUAL TABLE articles USING fts5(title, content);

-- 插入数据
INSERT INTO articles VALUES ('SQLite Intro', 'SQLite is a software library...');

-- 搜索
SELECT * FROM articles WHERE articles MATCH 'library AND software';

4.6 地理空间支持 (SpatiaLite)#

虽然不如 PostGIS 著名,但加载 mod_spatialite 扩展后,SQLite 也具备强大的 GIS 能力,常用于移动端地图应用。


5. 注意事项与最佳实践#

5.1 适用与不适用场景#

  • ✅ 适用:
    • 嵌入式设备、IoT、手机 App (Android/iOS 默认数据库)。
    • 中小型 Web 网站 (日访问量 < 10 万,写入不极端频繁)。
    • 数据分析原型、本地缓存、单元测试。
    • 作为应用内部的数据格式 (替代 XML/JSON 配置文件)。
  • ❌ 不适用:
    • 高并发写入场景 (每秒数千次写入,且来自多个进程)。
    • 需要细粒度用户权限管理 (SQLite 依赖文件系统权限)。
    • 数据库文件非常大 (超过几十 GB 且查询复杂,性能会下降)。
    • 需要网络远程直接访问 (不要通过网络文件系统 NFS/SMB 访问 SQLite 文件,极易损坏)。

5.2 性能优化关键点#

  1. 开启 WAL 模式: 这是提升并发能力的各种手段中最重要的。
  2. 事务批量提交:
    • 错误做法: 循环中每条 INSERT 都自动提交。
    • 正确做法:
      cursor.execute("BEGIN TRANSACTION")
      for item in data:
          cursor.execute("INSERT INTO ...", item)
      cursor.execute("COMMIT")
    • 速度差异可达数十倍甚至上百倍。
  3. 索引优化: 同样适用关系型数据库原则,但要注意 SQLite 的 ANALYZE 命令对查询计划影响很大。
  4. PRAGMA 调优:
    • PRAGMA cache_size: 增加内存缓存,减少磁盘 IO。
    • PRAGMA temp_store = MEMORY: 将临时表/索引存在内存中。
    • PRAGMA mmap_size: 启用内存映射 I/O (大幅提升读取性能)。

5.3 数据安全与备份#

  • 文件级备份: 直接复制 .sqlite 文件即可备份。但在复制过程中若有写入,可能导致文件损坏。
    • 安全备份方法: 使用 .backup 命令,或者在应用层开启 BEGIN IMMEDIATE 锁住数据库后再复制,或者依赖 WAL 模式的快照特性。
  • 加密: 开源版 SQLite 不支持加密。如需加密,需购买商业版 (SQLCipher 商业版) 或使用开源的 SQLCipher 扩展 (需在编译时集成或在支持该扩展的环境中使用)。
    -- 使用 SQLCipher (如果已集成)
    PRAGMA key = 'secret_password';

5.4 常见陷阱#

  • 网络文件系统: 严禁将 SQLite 文件放在 NFS、Samba 或云盘同步文件夹中直接读写。文件锁机制在网络文件系统上通常失效,会导致数据库损坏 (database is locked 或 corruption)。
  • 类型亲和性: 虽然支持动态类型,但依赖隐式类型转换可能导致意想不到的排序或比较结果 (如文本 “10” < “2”)。
  • 自增 ID 重置: DELETE FROM table 不会重置 AUTOINCREMENT 计数器。如果需要重置,需操作 sqlite_sequence 表。
  • 外键约束: 默认情况下外键约束是关闭的!必须显式开启:
    PRAGMA foreign_keys = ON;
    (建议在每次数据库连接建立时执行此命令)。

5.5 监控#

由于没有后台进程,监控主要靠应用层或定期脚本:

  • 检查数据库文件大小增长趋势。
  • 定期运行 PRAGMA integrity_check
  • 监控应用日志中的 database is locked 错误,这通常意味着并发写入冲突严重,需要考虑架构调整 (如引入读写分离、消息队列削峰,或迁移到 Client-Server 数据库)。

SQLite 是“简单就是美”的典范。在合适的场景下,它能提供惊人的性能和开发效率, eliminates the overhead of managing a database server. 只要避开高并发写入和网络文件系统的雷区,它是许多项目的理想选择。