SQLite 入门:介绍、安装部署与常见操作
SQLite 是世界上使用最广泛的嵌入式数据库引擎,零配置、单文件、无服务进程。本文整理 SQLite 的基础概念,以及在 macOS / Linux / Windows 三大平台的安装与验证步骤,附常用 SQL 示例。
SQLite 入门:介绍、安装部署与常见操作
SQLite 是一个嵌入式、零配置、单文件、无服务进程的关系型数据库引擎。它不是一个独立的应用,而是一个被直接链接到程序中的 C 库,因此安装与维护成本极低,广泛用于移动端、桌面端、IoT、开发环境与轻量生产场景。
一、SQLite 是什么
1.1 核心特点
| 特点 | 说明 |
|---|---|
| 无服务进程 (Serverless) | 不需要单独启动数据库服务,数据库就是普通磁盘文件 |
| 零配置 (Zero-Config) | 不需要 CREATE DATABASE,直接打开文件就使用,权限随文件系统 |
| 单文件存储 | 整个数据库(表、索引、视图、触发器、数据)存在一个 .db / .sqlite 文件里,备份=复制文件 |
| 事务 ACID | 支持完整的事务、行级读写并发(WAL 模式) |
| 跨平台 | 同一 db 文件可以在 macOS / Linux / Windows / ARM 之间直接拷贝使用 |
| 极小体积 | 完整库编译后约 600KB,默认支持大部分 SQL-92 标准语法 |
1.2 和 MySQL / PostgreSQL 的区别
| 维度 | SQLite | MySQL / PostgreSQL |
|---|---|---|
| 架构 | 嵌入式库,随进程启动 | 独立服务进程,客户端通过 TCP/Socket 连接 |
| 并发写 | 单写多读(WAL 模式下可提升并发) | 多写多读 |
| 用户权限 | 靠文件系统权限,无内置用户表 | 内置用户/角色/权限系统 |
| 存储 | 单文件 | 多文件 / 表空间 |
| 适用场景 | 移动端、桌面 App、单服务小站、原型开发、CI 环境、配置存储 | 高并发生产系统、多服务共享、复杂查询、OLTP |
1.3 什么时候该用 SQLite
- 单实例 Web 应用(博客、小后台、内部工具)
- 移动端 App 本地存储(iOS / Android 原生支持)
- 桌面端软件数据管理
- IoT / 边缘设备
- 开发 / 测试环境数据库(不用起 MySQL 容器)
- 临时数据文件、日志分析、配置管理
1.4 什么时候不该用
- 多台应用服务器共用一个数据库(网络共享盘上的 SQLite 并发写有风险)
- 写入 QPS 很高的高并发系统(> 几千次写/秒)
- 需要复杂权限、用户体系、存储过程的场景
二、安装 / 部署 SQLite
SQLite 的”安装”分两层:
- 命令行工具
sqlite3:用于手动管理 db 文件、执行 SQL、导入导出 - 语言绑定(Driver):让你的 Python / Node / Go / Java 代码能操作 SQLite
2.1 macOS
macOS 自带 SQLite,但版本通常比较旧,推荐用 Homebrew 安装最新版:
# 查看系统自带版本
sqlite3 --version
# 用 Homebrew 安装最新版
brew install sqlite
# 查看新版本路径(brew 安装的在 /opt/homebrew/opt/sqlite/bin)
which -a sqlite3
$(brew --prefix sqlite)/bin/sqlite3 --version
如果希望 sqlite3 默认走 brew 版本,可以把下面这行加到 ~/.zshrc:
export PATH="/opt/homebrew/opt/sqlite/bin:$PATH"
2.2 Linux(Debian / Ubuntu)
# 更新包列表
sudo apt update
# 安装命令行工具 + 开发库
sudo apt install -y sqlite3 libsqlite3-dev
# 验证
sqlite3 --version
RedHat / CentOS / Rocky / AlmaLinux:
sudo dnf install -y sqlite sqlite-devel
# 旧版 CentOS 7 用 yum
# sudo yum install -y sqlite sqlite-devel
Alpine Linux(Docker 镜像常用):
apk add --no-cache sqlite sqlite-dev
2.3 Windows
Windows 没有自带 sqlite3,推荐三种方式任选:
方式 A:官方 ZIP(零依赖)
- 打开 https://www.sqlite.org/download.html
- 下载
Precompiled Binaries for Windows下的 sqlite-tools-win-x64-*.zip(命令行工具) - 解压到任意目录,比如
C:\tools\sqlite - 把该目录加入 系统环境变量 PATH
- 新开一个 PowerShell / CMD 验证:
sqlite3 --version
方式 B:winget(推荐 Win11 / Win10 21H2+)
winget install SQLite.SQLite
方式 C:Chocolatey
choco install sqlite
2.4 Docker 环境
如果只是临时用,或者你的 CI 需要 sqlite3,可以直接用官方镜像:
# 启动并交互式进入 sqlite3 shell
docker run --rm -it -v "$(pwd):/data" alpine:latest sh -c "apk add --no-cache sqlite && sqlite3 /data/demo.db"
三、创建数据库并验证
SQLite 没有”创建数据库”的 SQL 语句,打开一个不存在的文件就等于创建。
3.1 第一个数据库
# 在当前目录创建 demo.db 并进入交互 shell
sqlite3 demo.db
进入后会看到提示符 sqlite>:
-- 查看所有命令(以 . 开头的是 sqlite3 元命令,不是 SQL)
.help
-- 查看当前数据库文件
.databases
-- 打开表头显示和列模式(查询结果更易读,建议每次都开)
.headers on
.mode column
-- 建一张表
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
age INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入几条测试数据
INSERT INTO users (name, email, age) VALUES
('Alice', 'alice@example.com', 28),
('Bob', 'bob@example.com', 32),
('Carol', 'carol@example.com', 25);
-- 查询
SELECT * FROM users;
-- 退出
.quit
执行完后,当前目录下会生成一个 demo.db 文件,这就是完整的数据库:
ls -lh demo.db
# -rw-r--r-- 1 user group 12K Aug 26 19:00 demo.db
3.2 非交互式执行 SQL(脚本化场景)
适合在 CI、shell 脚本里用:
# 方式 1:通过标准输入传 SQL
echo "SELECT COUNT(*) AS total FROM users;" | sqlite3 demo.db
# 方式 2:用 -cmd 或者把 SQL 作为第二个参数
sqlite3 demo.db "SELECT name, age FROM users WHERE age >= 28;"
# 方式 3:执行 .sql 脚本文件
sqlite3 demo.db < init.sql
3.3 把配置写进 ~/.sqliterc(可选)
每次手动进 sqlite3 shell 都要敲 .headers on .mode column 很麻烦,可以写到个人配置里:
cat > ~/.sqliterc << 'EOF'
.headers on
.mode column
.nullvalue [NULL]
.timer on
PRAGMA foreign_keys = ON;
EOF
这样每次进入 sqlite3 都会自动开启。
四、常用操作速查
4.1 元命令(. 开头)
| 命令 | 用途 |
|---|---|
.tables / .tables pattern | 列出所有表 |
.schema / .schema tablename | 打印建表 SQL |
.indices tablename | 列出某表的索引 |
.databases | 显示连接的数据库文件 |
.output file.csv + .mode csv + SELECT ... | 导出查询到 CSV |
.import file.csv tablename | 导入 CSV 到表 |
.backup new.db | 热备份整个数据库 |
.read script.sql | 执行 SQL 脚本文件 |
.quit / .exit | 退出 |
4.2 常用 SQL
-- 表结构修改(SQLite 的 ALTER TABLE 支持有限)
ALTER TABLE users ADD COLUMN phone TEXT;
-- 重命名表
ALTER TABLE users RENAME TO user_accounts;
-- 删表
DROP TABLE IF EXISTS user_accounts;
-- 建索引
CREATE INDEX idx_users_email ON users(email);
-- 事务
BEGIN;
UPDATE users SET age = 29 WHERE id = 1;
-- 没问题就 COMMIT,出错就 ROLLBACK
COMMIT;
4.3 实用 PRAGMA
SQLite 的运行时参数通过 PRAGMA 命令控制:
-- 开启外键约束(默认关闭!非常重要)
PRAGMA foreign_keys = ON;
-- 开启 WAL 模式(写入性能 + 读写并发大幅提升,生产环境推荐)
PRAGMA journal_mode = WAL;
-- 同步等级:FULL=最安全,NORMAL=性能与安全平衡,OFF=性能最高但断电可能损坏
PRAGMA synchronous = NORMAL;
-- 缓存大小(单位是页,默认 1 页=4KB,下面=64MB)
PRAGMA cache_size = -16384;
-- 查看数据库大小、版本
PRAGMA page_size;
PRAGMA page_count;
PRAGMA schema_version;
生产环境推荐默认值:
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA foreign_keys = ON;
五、编程语言中使用 SQLite(简要)
5.1 Python(标准库内置)
import sqlite3
con = sqlite3.connect("demo.db")
con.row_factory = sqlite3.Row # 结果可以按列名访问
with con:
for row in con.execute("SELECT * FROM users WHERE age >= ?", (25,)):
print(dict(row))
con.close()
5.2 Node.js(better-sqlite3 同步 API,性能好)
npm install better-sqlite3
const Database = require('better-sqlite3');
const db = new Database('demo.db', { readonly: false });
db.pragma('journal_mode = WAL');
db.pragma('foreign_keys = ON');
const rows = db.prepare('SELECT * FROM users WHERE age >= ?').all(25);
console.log(rows);
5.3 Go(标准库驱动需要 CGO,modernc.org/sqlite 纯 Go 更推荐)
package main
import (
"database/sql"
_ "modernc.org/sqlite"
)
func main() {
db, _ := sql.Open("sqlite", "demo.db?_pragma=journal_mode(WAL)&_pragma=foreign_keys(1)")
defer db.Close()
// ...
}
六、备份与恢复
6.1 文件级备份
最简单:直接拷贝 db 文件。但要注意:
- 正在写入时拷贝可能不完整
- 建议先用
.backup元命令做热备份
# 热备份(安全,写入中也能用)
sqlite3 demo.db ".backup demo-backup-$(date +%Y%m%d).db"
# 或用 SQL API 备份(适合代码里)
# VACUUM INTO 'demo-backup.db';
6.2 导出 SQL 文本(跨版本迁移)
# 导出为 SQL 脚本
sqlite3 demo.db .dump > demo-dump.sql
# 在新的 / 空数据库中恢复
sqlite3 demo-new.db < demo-dump.sql
七、常见坑与注意事项
- 外键约束默认关闭:几乎所有 SQLite 连接都建议先跑
PRAGMA foreign_keys = ON,否则REFERENCES只是摆设。 - 写并发有限:同一时刻只允许一个写事务;高写场景请开启 WAL 模式,或切换到 PostgreSQL/MySQL。
- 不要把 db 放在网络共享盘(NFS / SMB)里跑:文件锁实现不稳定,容易损坏。
ALTER TABLE能力有限:不能删列、不能改列类型,复杂迁移需要「建新表→导数据→删旧表→重命名」。- 定期
VACUUM:大量 DELETE / UPDATE 后文件不会自动收缩,定期VACUUM;可以回收空间并优化。 - 密码加密? SQLite 官方开源版不自带加密,需要加密用
SQLite3 Multiple Ciphers、SQLCipher或在应用层加密字段。
八、常用 GUI 工具(可选)
不喜欢命令行可以用:
| 工具 | 平台 | 说明 |
|---|---|---|
| DB Browser for SQLite | Win/macOS/Linux | 免费开源,功能最常用的一个 |
| DBeaver | 跨平台 | 通用数据库 GUI,支持 SQLite |
| TablePlus | Win/macOS | 付费,界面好看,支持多库 |
| SQLite Studio | 跨平台 | 免费,老牌 |