基本用法
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync('./data/site.db');
db.exec('PRAGMA journal_mode = WAL');
db.exec(`CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL
)`);
const insert = db.prepare('INSERT INTO posts (title) VALUES (?)');
insert.run('第一篇');
console.log(db.prepare('SELECT * FROM posts').all());
和 better-sqlite3 的取舍
| 维度 | node:sqlite | better-sqlite3 |
|---|
| 安装 | 内置,零依赖 | 需要编译 |
| API | 同步,风格接近 | 同步 |
| 成熟度 | 实验性接口 | 生态成熟 |
| 适用 | 个人项目、小工具 | 复杂生产场景 |
几条实践经验
- 打开数据库后先设
journal_mode = WAL,读写并发更稳; - 布尔值存 0/1,JavaScript 侧自己做一次转换;
- 时间统一存 ISO 字符串,展示层再本地化;
ON DELETE SET NULL 比级联删除更适合"分类被删文章还在"的场景。