Node.js 原生 SQLite 模块实战
Node.js 22.5+ 内置 SQLite 模块(node:sqlite),零依赖拥有数据库能力。本文通过图书库存应用实战原生模块的用法、定位与局限。
const { DatabaseSync } = require('node:sqlite') 即可零依赖使用 SQLite——建表、增删改查、预处理语句全支持。适合 CLI 工具、桌面应用、边缘函数与原型开发;复杂并发与高级特性仍建议 better-sqlite3 或客户端/服务器数据库。
SQLite 在 Node.js 的位置
Deno 与 Bun 先后内置 SQLite,Node.js 22.5 跟进——轻量级持久化不再需要外部依赖。SQLite 是进程内数据库:零配置、单文件、事务完整,全球部署量最大的数据库不是没有原因。
原生模块实战
const { DatabaseSync } = require('node:sqlite');
const db = new DatabaseSync('./books.db');
// 建表
db.exec(`
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
stock INTEGER DEFAULT 0
)
`);
// 预处理语句:插入
const insert = db.prepare('INSERT INTO books (title, author, stock) VALUES (?, ?, ?)');
insert.run('深入浅出 Node.js', '朴灵', 10);
// 查询
const all = db.prepare('SELECT * FROM books').all();
const one = db.prepare('SELECT * FROM books WHERE id = ?').get(1);
// 更新与删除
db.prepare('UPDATE books SET stock = stock - 1 WHERE id = ?').run(1);
db.prepare('DELETE FROM books WHERE stock = 0').run();
预处理语句(prepare)是性能与安全的关键:参数绑定防注入,重复执行免重新解析 SQL。
事务
db.exec('BEGIN');
try {
db.prepare('UPDATE books SET stock = stock - 1 WHERE id = ?').run(bookId);
db.prepare('INSERT INTO orders (book_id, qty) VALUES (?, ?)').run(bookId, 1);
db.exec('COMMIT');
} catch (err) {
db.exec('ROLLBACK');
throw err;
}
适用场景与边界
适用:CLI 工具本地存储、Electron/Tauri 桌面应用、边缘函数(Cloudflare D1 即 SQLite)、测试环境(内存模式 :memory: 隔离飞快)、嵌入式设备。
边界:单文件写入串行(多读单写)、无网络访问(多实例应用共享数据不行)、实验性 API 可能有变动(关注 Node 版本说明)。
与 better-sqlite3 对比
| 维度 | node:sqlite | better-sqlite3 |
|---|---|---|
| 依赖 | 零(内置) | 原生模块需编译 |
| API | 同步、基础 | 同步、功能丰富(用户函数、聚合) |
| 成熟度 | 实验/稳定化中 | 生产久经考验 |
用实际查询验证数据访问方案
Node.js 原生 SQLite 模块实战的选择最终要落到查询次数、SQL 耗时与连接占用。应用接入观测云 APM 时,先核对 SDK 是否支持实际使用的数据库驱动,不能因为使用了某个 ORM 就假设全部查询自动可见。未覆盖的查询可手动插桩;PostgreSQL 等服务端数据库另配实例采集。SQL 和绑定参数上报前须脱敏,再按相同接口比较 N+1 查询与慢查询的变化。
接入文档:Node.js APM 接入 · PostgreSQL 采集 · 日志采集。
常见问题(FAQ)
Q:原生模块支持异步吗?
node:sqlite 当前为同步 API(DatabaseSync)。SQLite 的本机操作是微秒级,同步阻塞实际无感;大查询注意拆分。
Q:能用于生产 Web 应用吗?
单机小流量应用完全可以(litestream 类方案做备份)。多实例水平扩容的 Web 应用仍需 PostgreSQL/MySQL——SQLite 不是替代品而是补位者。
Q:node:sqlite 稳定了吗?
从实验性走向稳定的过程中(Node 22 引入后持续打磨)。关注所升级版本的 changelog,锁定 Node 版本使用。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。