
sql.js 是纯客户端内存数据库,所有操作均在浏览器内存中进行,无法直接修改服务器上的 .db 文件;若需持久化,必须通过后端服务中转或采用 indexeddb 等浏览器原生存储方案。
sql.js 是纯客户端内存数据库,所有操作均在浏览器内存中进行,无法直接修改服务器上的 .db 文件;若需持久化,必须通过后端服务中转或采用 indexeddb 等浏览器原生存储方案。
SQL.js 是一个基于 WebAssembly 的 SQLite 移植版,它在浏览器中完全运行于内存,不依赖服务端、不访问文件系统,也不具备写入本地磁盘或覆盖远程 .db 文件的能力——这是由浏览器安全模型(同源策略 + 无文件系统写权限)和 HTTP 协议只读语义共同决定的。你当前的代码:
const db = new SQL.Database(new Uint8Array(buf)); // ✅ 从 fetch 加载的 ArrayBuffer 创建内存数据库
db.run("CREATE TABLE ..."); // ✅ 内存中建表
db.exec("INSERT INTO items ..."); // ✅ 内存中插入数据
一切执行成功,但所有变更仅存在于该 db 实例的生命周期内。一旦页面刷新或关闭,数据即丢失;且 fetch("src/db/sql2.db") 只是读取文件快照,绝不会触发任何“写回”行为——浏览器禁止前端脚本以任意方式覆写服务器资源(否则将导致严重安全风险,如篡改 CDN 上的 JS 库或破坏静态站点)。
✅ 正确实现持久化的两种主流路径
1. 前端 + 后端协作(推荐用于真实业务)
使用轻量 Node.js 后端(如 Express)托管 SQLite 数据库,并通过 API 进行增删改查:
// 前端:提交数据到后端
async function saveItem(id, quantity) {
await fetch("/api/items", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ id, quantity })
});
}
// 后端(Express 示例)
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./data/app.db');
app.post('/api/items', (req, res) => {
db.run("INSERT INTO items (id, quantity) VALUES (?, ?)",
[req.body.id, req.body.quantity]);
res.status(201).json({ ok: true });
});
⚠️ 注意:SQLite 在多进程/多请求场景下需启用 WAL 模式并合理处理并发,生产环境建议搭配更健壮的数据库(如 PostgreSQL)或使用 Prisma/Knex 等 ORM。
2. 纯前端持久化(适合离线工具类应用)
放弃“写回 .db 文件”,改用浏览器原生持久化机制:
- IndexedDB:结构化、大容量、异步、支持事务,可存储序列化的数据库快照;
- localStorage / sessionStorage:仅适用于极小量数据(
// 示例:将 SQL.js 数据库导出并保存至 IndexedDB
async function persistDatabase(db) {
const data = db.export(); // Uint8Array 格式的完整数据库镜像
const blob = new Blob([data], { type: 'application/octet-binary' });
// 使用 IndexedDB 存储 blob 或直接存 ArrayBuffer(更高效)
await saveToIndexedDB('main-db', data);
}
总结
- ❌ SQL.js 不是“本地文件数据库”,而是“内存 SQLite 引擎”,天生无文件写入能力;
- ❌ 试图让前端直接修改服务器 .db 文件属于架构误用,违反 Web 安全基本准则;
- ✅ 真实持久化 = 前端(SQL.js 处理逻辑 + 查询) + 后端(负责 I/O 和事务);
- ✅ 离线优先应用 = 前端(SQL.js + IndexedDB/Cache API 双缓存) + 同步策略(如变化日志+冲突解决)。
选择方案前,请明确你的应用场景:是需要多用户共享数据的 Web 应用?还是单机离线使用的工具页?前者必走服务端,后者可深度优化前端存储链路。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











