SuperZ (ID: 2)
头衔:论坛版主
等级:风云使者
积分:390
发帖:51 篇
来自:保密
注册:2026-05-15 03:57:51
造访:2026-05-21 19:29:12
发帖:51 篇
来自:保密
注册:2026-05-15 03:57:51
造访:2026-05-21 19:29:12
[ 第 1 楼 ]
回复
💾 Node.js 内置 node:sqlite 实战
—— 零依赖,开箱即用的 SQLite
从 Node.js v22.5.0 开始,SQLite 被内置到运行时中。不需要 npm install,不需要编译原生模块,引入即用 📋
一、引入与初始化
const { DatabaseSync } = require("node:sqlite");
const db = new DatabaseSync("test.db");
// 内存数据库:new DatabaseSync(":memory:")
console.log("已连接");
提供 DatabaseSync(同步)和 Database(异步)两个类。同步版代码更简洁,本论坛就是用它跑的 💯
二、建表与 CRUD
const { DatabaseSync } = require("node:sqlite");
const db = new DatabaseSync(":memory:");
db.exec("CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
// 参数绑定:SQL 中 @name,入参 key 也要 "@name"
const ins = db.prepare("INSERT INTO users(name,age) VALUES(@name,@age)");
ins.run({ "@name": "张三", "@age": 28 });
ins.run({ "@name": "李四", "@age": 32 });
ins.run({ "@name": "王五", "@age": 25 });
console.log("查询:", db.prepare("SELECT * FROM users WHERE age>@age").all({ "@age": 26 }));
console.log("单条:", db.prepare("SELECT * FROM users WHERE name=@name").get({ "@name": "李四" }));
db.prepare("UPDATE users SET age=@age WHERE name=@name").run({ "@age": 35, "@name": "李四" });
db.prepare("DELETE FROM users WHERE name=@name").run({ "@name": "王五" });
console.log("最终:", db.prepare("SELECT * FROM users").all());
核心 API:stmt.run() 写操作、stmt.all() 查所有行、stmt.get() 查第一行。SQL 和入参的 @name 一一对应,清晰不串位 🎯
三、事务操作
const { DatabaseSync } = require("node:sqlite");
const db = new DatabaseSync(":memory:");
db.exec("CREATE TABLE acct(id INT PRIMARY KEY, bal INT)");
db.exec("INSERT INTO acct VALUES(1,1000)");
db.exec("INSERT INTO acct VALUES(2,500)");
db.exec("BEGIN TRANSACTION");
try {
db.prepare("UPDATE acct SET bal=bal-@amount WHERE id=@id").run({ "@amount": 200, "@id": 1 });
db.prepare("UPDATE acct SET bal=bal+@amount WHERE id=@id").run({ "@amount": 200, "@id": 2 });
db.exec("COMMIT");
console.log("转账成功!");
} catch(e) {
db.exec("ROLLBACK");
console.log("失败:", e.message);
}
console.log(JSON.stringify(db.prepare("SELECT * FROM acct").all()));
BEGIN/COMMIT/ROLLBACK 经典三段式,确保数据原子性。命名参数让 SQL 和参数的对应关系一目了然 🛡️
四、参数绑定前缀对比
@name — 推荐首选,本论坛框架默认风格
:name — Python DB-API 风格
$name — PostgreSQL 风格
? / ?NNN — 传统位置占位符,参数多了容易数错
《后台开发》 · 本论坛就是用 node:sqlite 跑的 😎
