基本用法

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:sqlitebetter-sqlite3
安装内置,零依赖需要编译
API同步,风格接近同步
成熟度实验性接口生态成熟
适用个人项目、小工具复杂生产场景

几条实践经验

  1. 打开数据库后先设 journal_mode = WAL,读写并发更稳;
  2. 布尔值存 0/1,JavaScript 侧自己做一次转换;
  3. 时间统一存 ISO 字符串,展示层再本地化;
  4. ON DELETE SET NULL 比级联删除更适合"分类被删文章还在"的场景。