你有没有想过,你每天打开的浏览器、手机里的通讯软件、甚至桌面上的笔记工具,里面都藏着同一个轻巧的数据库?
它不需要你安装任何服务器软件,不需要设置账号密码,甚至不需要网络连接。它就是一个 文件,静静地躺在你的硬盘里,随时准备好为你服务。
这个低调的存在,就是 SQLite。
什么是 SQLite?世界上部署最广泛的数据库
SQLite 是一个用 C 语言编写的 嵌入式关系型数据库引擎。
它没有独立的服务器程序,而是直接嵌入你的应用程序中运作。
这跟你熟悉的 PostgreSQL 或 MySQL 完全不同。传统数据库是一台 独立运作的服务器,你的程序必须透过 网络协议(TCP/IP) 去跟它「通讯」。
但 SQLite 不一样,它就是一段代码,直接跑在你的应用程序里面,读写硬盘上的那个 .db 文件。
| 比较维度 | SQLite(嵌入式) | PostgreSQL(Client-Server) |
|---|---|---|
| 运作方式 | 直接嵌入应用程序,无独立服务器 | 独立服务器程序,透过网络连接 |
| 配置需求 | 零配置,免安装、免帐密 | 需要安装、配置账号密码与防火墙 |
| 数据存储 | 单一跨平台文件 | 服务器目录下的多个文件 |
| 备份方式 | 直接复制那个文件 | 需要使用 pg_dump 等专用工具 |
正因为这种 「即插即用」 的特性,SQLite 成为了世界上部署最广泛的数据库引擎。
从 Android 和 iOS 操作系统、Chrome 和 Firefox 浏览器,到 Adobe Lightroom、WhatsApp,甚至是 Airbus A350 的飞行系统,处处都有它的身影。
在 Node.js 中使用 SQLite
如果你是 Node.js 开发者,使用 SQLite 非常简单。你不需要在电脑上安装任何数据库服务器软件,只需要安装一个 npm 套件就能开始。
目前行业最常用的选择:
| 套件名称 | 特点 | 建议情境 |
|---|---|---|
sqlite3 |
最老牌,支持异步 API | 需要大量同时处理多个异步任务 |
better-sqlite3 |
性能极佳,API 设计直观,速度极快 | 首选推荐,追求开发效率与执行速度 |
用 better-sqlite3 建立数据库并查询,不用五分钟就能完成:
const Database = require('better-sqlite3');
const db = new Database('my_project.db');
db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();
const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);
const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }
如果文件不存在,
better-sqlite3会 自动帮你建立。
SQLite 支持的 SQL 语法比你想的强大
很多人以为 SQLite 很阳春,但它支持绝大多数的标准 SQL 语法,包含许多进阶功能:
| 语法类别 | 支持项目 |
|---|---|
| 基础操作 | SELECT、INSERT、UPDATE、DELETE |
| 数据定义 | CREATE TABLE、CREATE INDEX、CREATE VIEW |
| 进阶查询 | WITH (CTE 递归查询)、窗口函数(Window Functions) |
| 冲突处理 | UPSERT (INSERT ... ON CONFLICT DO UPDATE) |
| JSON 处理 | json_extract、json_array、json_object 等内建函数 |
| 事务控制 | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
| 连接查询 | INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN |
SQLite 的核心哲学是「小而美」,它支持多数你日常需要的 SQL 能力,同时保持极致的轻量。
SQLite 的极限在哪?
轻巧是有代价的。如果把 SQLite 比喻为一间 只有一个结账柜台的文青杂货店,那 PostgreSQL 就是 配备 50 个收银台的好市多。
1. 写入大塞车
SQLite 在写入数据时,会把整个数据库文件 锁起来。
想像一间 只有一间厕所的餐厅:100 个人可以同时在外面看菜单(读取),但只要有 1 个人进去把门锁上(写入),其他人就只能排队等。
虽然开启 WAL 模式 (Write-Ahead Logging) 能改善读写并行的性能,但本质上仍然无法做到多线程同时写入不同的数据行。
2. 无法跨多台服务器
SQLite 的本质就是一个实体文件。如果你的系统部署在多台服务器上(水平扩展),这些服务器 无法安全地共用同一个文件。
3. 缺乏精细的权限管理
SQLite 没有「使用者账号」的概念。谁能在操作系统层面读取那个 .db 文件,谁就能看光、修改所有数据。
对于 需要严格个资审查的商务系统,这是无法接受的。
SQLite vs. PostgreSQL:技术选型决策
工具没有好坏,只有适不适合。以下是一份帮助你做决策的终极检核表:
| 提問 | 答「是」→ 选 SQLite | 答「否」→ 选 PostgreSQL |
|---|---|---|
| 后端服务器是不是只有一台,或完全跑在本机端? | 是 | 否(有水平扩展、多台机器) |
| 系统行为是不是读远远大于写,且没有高频并行写入? | 是 | 否(大家会同时抢着写入) |
| 不需要精细的数据库账号权限或进阶索引? | 是 | 否(极度依赖进阶功能) |
更具体的情境对照:
| 情境 | 推荐选择 | 理由 |
|---|---|---|
| 桌面软件、手机 App、IoT 设备 | SQLite | 数据跟着设备走,免安装 |
| 个人部落格、展示型官网 | SQLite | 读多写少,省去维护服务器成本 |
| 快速原型开发、Demo | SQLite | 建个文件就能开工 |
| 社区论坛、电商平台 | PostgreSQL | 高并发写入,需要行级锁 |
| 多台服务器分散部署 | PostgreSQL | 需要跨机器共享数据源 |
| 医疗、金融等敏感系统 | PostgreSQL | 需要严格的角色权限管控 |
你的数据库是随身笔记还是中央总机
如果数据是 「单机、静态、单一拥有者」,选 SQLite 享受极致的轻量与自由;
如果数据是 「云端、動態、高度互动」,让 PostgreSQL 接管。
SQLite 的核心哲学是 「应用程序的内部元件」,而 PostgreSQL 的定位是 「系统架构的独立中枢」。
下次在架构决策时,别急着拿出 PostgreSQL,先问问自己:
「我的数据库,是拿来当随身笔记,还是中央总机?」
答案清楚了,选择自然就明确了。