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 版本使用。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台