数据库 ·

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 的区别

维度SQLiteMySQL / PostgreSQL
架构嵌入式库,随进程启动独立服务进程,客户端通过 TCP/Socket 连接
并发写单写多读(WAL 模式下可提升并发)多写多读
用户权限靠文件系统权限,无内置用户表内置用户/角色/权限系统
存储单文件多文件 / 表空间
适用场景移动端、桌面 App、单服务小站、原型开发、CI 环境、配置存储高并发生产系统、多服务共享、复杂查询、OLTP

1.3 什么时候该用 SQLite

  • 单实例 Web 应用(博客、小后台、内部工具)
  • 移动端 App 本地存储(iOS / Android 原生支持)
  • 桌面端软件数据管理
  • IoT / 边缘设备
  • 开发 / 测试环境数据库(不用起 MySQL 容器)
  • 临时数据文件、日志分析、配置管理

1.4 什么时候不该用

  • 多台应用服务器共用一个数据库(网络共享盘上的 SQLite 并发写有风险)
  • 写入 QPS 很高的高并发系统(> 几千次写/秒)
  • 需要复杂权限、用户体系、存储过程的场景

二、安装 / 部署 SQLite

SQLite 的”安装”分两层:

  1. 命令行工具 sqlite3:用于手动管理 db 文件、执行 SQL、导入导出
  2. 语言绑定(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(零依赖)

  1. 打开 https://www.sqlite.org/download.html
  2. 下载 Precompiled Binaries for Windows 下的 sqlite-tools-win-x64-*.zip(命令行工具)
  3. 解压到任意目录,比如 C:\tools\sqlite
  4. 把该目录加入 系统环境变量 PATH
  5. 新开一个 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

七、常见坑与注意事项

  1. 外键约束默认关闭:几乎所有 SQLite 连接都建议先跑 PRAGMA foreign_keys = ON,否则 REFERENCES 只是摆设。
  2. 写并发有限:同一时刻只允许一个写事务;高写场景请开启 WAL 模式,或切换到 PostgreSQL/MySQL。
  3. 不要把 db 放在网络共享盘(NFS / SMB)里跑:文件锁实现不稳定,容易损坏。
  4. ALTER TABLE 能力有限:不能删列、不能改列类型,复杂迁移需要「建新表→导数据→删旧表→重命名」。
  5. 定期 VACUUM:大量 DELETE / UPDATE 后文件不会自动收缩,定期 VACUUM; 可以回收空间并优化。
  6. 密码加密? SQLite 官方开源版不自带加密,需要加密用 SQLite3 Multiple CiphersSQLCipher 或在应用层加密字段。

八、常用 GUI 工具(可选)

不喜欢命令行可以用:

工具平台说明
DB Browser for SQLiteWin/macOS/Linux免费开源,功能最常用的一个
DBeaver跨平台通用数据库 GUI,支持 SQLite
TablePlusWin/macOS付费,界面好看,支持多库
SQLite Studio跨平台免费,老牌

参考资料

问问 AI