
一、SQLite 核心定义
SQLite 是一款开源、嵌入式、无服务器的关系型数据库管理系统(RDBMS),也是目前世界上使用最广泛的数据库(几乎所有手机、桌面应用、嵌入式设备都内置了它)。
它的核心特征可以用一句话概括:整个数据库就是一个单一的磁盘文件,你的程序无需连接独立的数据库服务器,直接通过内置的 SQLite 库读写这个文件即可,无需安装、无需配置、无需维护。
二、SQLite 核心架构与工作原理
1. 核心架构(无服务器架构)
和 PostgreSQL/MySQL 的 “客户端 - 服务器(C/S)” 架构不同,SQLite 是 “嵌入式” 架构:
C/S 架构(如 PG):有独立的数据库服务器进程,程序作为客户端通过网络 / 本地协议连接服务器,由服务器处理所有数据操作。
嵌入式架构(SQLite):SQLite 以库文件(如
sqlite3.dll/sqlite3.so)的形式嵌入到你的程序中,程序直接调用库函数读写本地数据库文件,没有独立的 “服务器进程”。
2. 数据存储方式
整个数据库的所有内容(表、数据、索引、视图、触发器等)都存储在单个文件中(后缀通常是
.db/.sqlite)。这个文件可以直接复制、移动、备份,跨平台兼容(比如 Windows 下创建的
.db文件,直接复制到 Linux/macOS 上就能用)。底层采用高效的二进制格式存储,比纯文本(如 CSV)读写更快、占用空间更小。
3. ACID 事务保障
SQLite 完全支持 ACID(原子性、一致性、隔离性、持久性),即使程序崩溃、断电,也能保证数据不损坏:
原子性:事务要么全部执行,要么全部回滚。
一致性:事务执行前后,数据库始终处于合法状态。
隔离性:默认支持
SERIALIZABLE隔离级别(最高级别),避免脏读、幻读。持久性:事务提交后,数据永久保存到磁盘。
三、SQLite 核心特性
1. 零配置 / 零运维
无需安装:只需将 SQLite 的库文件引入项目,无需安装 “SQLite 服务器”。
无需启动 / 停止服务:没有后台进程,程序运行时自动读写文件,退出后无残留。
无需配置:不用设置端口、用户名、密码,直接通过文件路径访问数据库。
2. 轻量级
库文件体积极小:Windows 下
sqlite3.dll约 400KB,Linux 下libsqlite3.so约 500KB。内存占用低:运行时仅占用少量内存,适合嵌入式设备(如智能手表、路由器)。
无依赖:独立库文件,不依赖其他系统组件。
3. 跨平台
支持几乎所有主流平台:
桌面系统:Windows、macOS、Linux。
移动端:Android、iOS(所有手机 APP 几乎都内置 SQLite)。
嵌入式系统:ARM、MCU、路由器、智能家居设备。
编程语言:Python、Java、C/C++、Go、JavaScript 等几乎所有语言都有原生 / 第三方库支持。
4. SQL 兼容性
支持大部分 SQL92 标准,满足日常开发需求:
基础操作:
SELECT/INSERT/UPDATE/DELETE、CREATE TABLE/DROP TABLE。高级操作:
JOIN(内连接 / 外连接)、GROUP BY/HAVING、ORDER BY、索引(CREATE INDEX)。事务操作:
BEGIN TRANSACTION、COMMIT、ROLLBACK。局限性:不支持存储过程(新版有限支持)、自定义函数(需通过 API 扩展)、高级权限管理。
5. 权限控制
SQLite 本身没有 “用户 / 角色” 的概念,完全依赖操作系统的文件权限:
比如 Windows 下给
.db文件设置 “只读” 权限,程序就只能查询不能修改。比如 Linux 下设置
chmod 600 test.db,只有当前用户能访问。
四、SQLite 典型使用场景
1. 移动端应用(核心场景)
Android/iOS APP 的本地数据存储:比如微信的本地聊天记录、抖音的缓存视频信息、手机相册的元数据。
原因:轻量、无需网络、本地读写速度快,适配移动端低资源环境。
2. 桌面应用
小型工具软件:记事本、截图工具、密码管理器的配置 / 数据存储。
大型软件的辅助存储:Photoshop 的历史记录、VS Code 的插件配置、浏览器的书签 / 历史记录。
3. 嵌入式设备
智能手表、智能家居(如智能音箱)、路由器的本地数据存储。
工业控制设备:采集传感器数据,本地存储后定时上传到云端。
4. 开发 / 测试场景
原型开发:快速验证 SQL 逻辑、业务流程,无需搭建复杂的数据库服务器。
单元测试:为测试用例提供独立的数据库环境,每个测试用例对应一个临时
.db文件,测试完成后直接删除。
5. 小型 Web 应用
个人博客、小型工具网站(低并发):比如单用户的博客后台,日访问量几千次的场景。
注意:不适合高并发的 Web 应用(如电商网站)。
五、SQLite 优缺点分析
优点
极致易用:上手成本为 0,新手几分钟就能学会基本操作。
便携性强:单文件存储,复制即可迁移,无需考虑环境兼容。
性能优秀:小数据量(GB 级以内)、低并发下读写速度极快(无服务器开销)。
稳定可靠:经过 20 + 年的验证,是世界上部署最广泛的数据库,极少出现数据损坏。
免费开源:无商业授权费用,可自由用于个人 / 商业项目。
缺点
并发写能力差:写操作会锁定整个数据库文件,高并发写(如每秒几十次写)会导致严重卡顿。
大数据量受限:单文件超过 10GB 后,查询 / 写入性能明显下降(官方建议单文件不超过 2TB,但实际很少用到)。
功能有限:无集群 / 主从复制、无高级权限管理、无存储过程(新版仅有限支持)、无全文搜索(需扩展)。
无远程访问:默认只能本地访问,无法像 PG/MySQL 那样远程连接(需借助第三方工具如
sqlite3server)。
六、SQLite 实际使用示例(Python)
下面是一个完整的示例,包含创建表、增删改查、事务、索引等常用操作:
python
运行
import sqlite3
# 1. 连接数据库(不存在则自动创建)
# :memory: 表示内存数据库,程序退出后数据消失,适合测试
# conn = sqlite3.connect(':memory:')
conn = sqlite3.connect('mydb.db')
# 启用行工厂:查询结果以字典形式返回(默认是元组)
conn.row_factory = sqlite3.Row
# 2. 创建游标(用于执行SQL语句)
cursor = conn.cursor()
try:
# 3. 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主键
name TEXT NOT NULL, -- 非空字符串
age INTEGER, -- 整数
email TEXT UNIQUE -- 唯一约束
)
''')
# 4. 创建索引(加速查询)
cursor.execute('CREATE INDEX IF NOT EXISTS idx_users_name ON users(name)')
# 5. 事务操作:批量插入数据
conn.begin() # 开启事务
# 批量插入(避免循环执行INSERT,提升性能)
users_data = [('张三', 25, 'zhangsan@test.com'), ('李四', 30, 'lisi@test.com')]
cursor.executemany('INSERT INTO users (name, age, email) VALUES (?, ?, ?)', users_data)
conn.commit() # 提交事务
# 6. 查询数据
# 单条查询
cursor.execute('SELECT * FROM users WHERE name = ?', ('张三',))
user = cursor.fetchone()
if user:
print(f"单条查询结果:ID={user['id']}, 姓名={user['name']}, 年龄={user['age']}")
# 多条查询
cursor.execute('SELECT * FROM users ORDER BY age DESC')
all_users = cursor.fetchall()
print("\n所有用户:")
for u in all_users:
print(f"ID={u['id']}, 姓名={u['name']}, 邮箱={u['email']}")
# 7. 更新数据
cursor.execute('UPDATE users SET age = ? WHERE name = ?', (26, '张三'))
conn.commit()
# 8. 删除数据
# cursor.execute('DELETE FROM users WHERE id = ?', (2,))
# conn.commit()
except sqlite3.Error as e:
# 出错时回滚事务
conn.rollback()
print(f"数据库操作出错:{e}")
finally:
# 9. 关闭连接
cursor.close()
conn.close()
运行结果
plaintext
单条查询结果:ID=1, 姓名=张三, 年龄=25
所有用户:
ID=2, 姓名=李四, 邮箱=lisi@test.com
ID=1, 姓名=张三, 邮箱=zhangsan@test.com
七、SQLite 性能优化要点(新手必看)
开启 WAL 模式:提升并发读写性能(默认是 DELETE 模式,写锁整个文件)。
python
运行
# 连接后立即执行 cursor.execute('PRAGMA journal_mode = WAL')批量操作:使用
executemany()代替循环execute(),减少磁盘 IO 次数。合理创建索引:对查询频繁的字段建索引,但不要建过多(会降低写入速度)。
避免长时间事务:事务开启后尽快提交 / 回滚,减少锁占用时间。
分页查询:大数据量查询时用
LIMIT/OFFSET分页,避免一次性读取所有数据。
总结
核心定位:SQLite 是轻量级嵌入式数据库,核心优势是零配置、轻量、便携,适合单用户、低并发、小数据量的本地存储场景。
关键局限:并发写能力差、功能有限、不支持远程访问,不适合高并发的企业级应用。
使用技巧:开启 WAL 模式提升并发性能,批量操作减少 IO,合理建索引加速查询,是新手快速上手 SQL 的最佳选择之一。