在现代应用开发中,Node.js 和 SQLite 的结合提供了轻量级的数据库解决方案,非常适合小型项目或嵌入式系统开发。SQLite 是一个无需安装、配置简单的嵌入式数据库,适用于在本地或小型应用中快速部署数据存储。而 Node.js 作为一个高效的 JavaScript 运行环境,与 SQLite 的集成也十分流畅。
本文将介绍如何使用 Node.js 结合 SQLite,详细说明如何进行数据库连接、查询、插入、更新等操作。
1. 环境准备
1.1 安装 Node.js 和 SQLite
首先,你需要安装 Node.js。可以通过官网下载 Node.js 安装包,也可以通过包管理工具如 nvm
来管理不同版本的 Node.js。
要在 Node.js 中使用 SQLite,需要安装相应的 SQLite 库。Node.js 社区提供了 sqlite3
这个库来支持 SQLite。
通过 npm
安装 sqlite3
:
npm install sqlite3
安装成功后,你就可以在项目中引入并使用 SQLite。
2. 连接 SQLite 数据库
SQLite 数据库是一个文件数据库,因此只需提供文件路径,便可创建或打开该数据库文件。
2.1 打开数据库连接
以下是打开 SQLite 数据库的代码示例:
const sqlite3 = require('sqlite3').verbose();
// 打开数据库文件,若文件不存在则会自动创建
const db = new sqlite3.Database('./mydb.sqlite', (err) => {
if (err) {
return console.error('❌ 数据库连接失败:', err.message);
}
console.log('✅ 成功连接到 SQLite 数据库。');
});
解释:
-
sqlite3.verbose()
:输出详细日志,有助于调试。 -
new sqlite3.Database()
:打开或创建一个 SQLite 数据库。这里提供了数据库文件的路径./mydb.sqlite
。3. 创建表格
在连接数据库后,我们通常需要创建一张表来存储数据。以下是创建一张名为
users
的用户表的代码:db.run(`CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL )`, (err) => { if (err) { return console.error('❌ 表创建失败:', err.message); } console.log('✅ 表 "users" 创建成功或已存在。'); });
解释:
-
db.run()
:执行一条 SQL 语句,这里用于创建表。 -
id
列为自增主键,name
和email
列用于存储用户的姓名和邮箱,且邮箱必须唯一。?️ 表结构图:
字段 类型 说明 id INTEGER 自增主键 name TEXT 用户名 email TEXT 用户邮箱,唯一 4. 插入数据
向表
users
中插入数据可以通过db.run()
方法实现。下面是插入一个用户的例子:const name = 'John Doe'; const email = 'john@example.com'; db.run(`INSERT INTO users (name, email) VALUES (?, ?)`, [name, email], function(err) { if (err) { return console.error('❌ 插入数据失败:', err.message); } console.log(`✅ 插入数据成功,用户ID:${this.lastID}`); });
解释:
-
?
:是 SQL 中的占位符,避免 SQL 注入风险。 -
[name, email]
:传递的参数会替换 SQL 中的占位符。 -
this.lastID
:返回插入成功的记录 ID。5. 查询数据
查询数据可以使用
db.all()
或db.get()
方法: -
db.all()
:用于查询多条记录。 -
db.get()
:用于查询单条记录。5.1 查询所有用户
db.all(`SELECT * FROM users`, [], (err, rows) => { if (err) { return console.error('❌ 查询数据失败:', err.message); } console.log('✅ 查询到的用户数据:'); console.table(rows); });
解释:
-
db.all()
:查询users
表中的所有记录,rows
是返回的结果集。5.2 查询单个用户
const userId = 1; db.get(`SELECT * FROM users WHERE id = ?`, [userId], (err, row) => { if (err) { return console.error('❌ 查询数据失败:', err.message); } if (row) { console.log(`✅ 查询到的用户:`, row); } else { console.log('❌ 未找到该用户。'); } });
解释:
-
db.get()
:查询符合条件的单条记录,row
是返回的结果。? 查询数据流程图:
graph TD; A[查询数据请求] --> B{查询类型}; B --> |单条记录| C[使用db.get]; B --> |多条记录| D[使用db.all]; C --> E[返回单条结果]; D --> F[返回结果集];
6. 更新数据
我们可以使用
db.run()
方法来更新记录。下面是更新用户邮箱的示例:const newEmail = 'john.doe@example.com'; const userId = 1; db.run(`UPDATE users SET email = ? WHERE id = ?`, [newEmail, userId], function(err) { if (err) { return console.error('❌ 更新数据失败:', err.message); } console.log(`✅ 成功更新 ${this.changes} 条记录。`); });
解释:
-
db.run()
:执行更新语句,this.changes
表示更新的记录数。7. 删除数据
同样可以使用
db.run()
方法来删除记录:const userId = 1; db.run(`DELETE FROM users WHERE id = ?`, [userId], function(err) { if (err) { return console.error('❌ 删除数据失败:', err.message); } console.log(`✅ 成功删除 ${this.changes} 条记录。`); });
解释:
-
DELETE
语句用于删除符合条件的记录,this.changes
表示删除的记录数。8. 关闭数据库连接
在应用程序结束或不再需要数据库时,应该关闭数据库连接以释放资源:
db.close((err) => { if (err) { return console.error('❌ 关闭数据库连接失败:', err.message); } console.log('✅ 成功关闭数据库连接。'); });
解释:
-
db.close()
:关闭与 SQLite 数据库的连接,防止资源泄漏。9. 异常处理与优化
9.1 异常处理
在实际开发中,良好的异常处理至关重要。每个 SQLite 操作都应该检查错误并进行合理的错误处理。
-
错误信息日志记录:当遇到数据库连接或查询错误时,将错误信息记录下来,方便后期调试。
9.2 性能优化
-
事务处理:当涉及多条数据库操作时,使用事务来确保操作的一致性和提高性能。
db.serialize(() => { db.run('BEGIN TRANSACTION'); db.run('UPDATE users SET name = ? WHERE id = ?', ['NewName', 1]); db.run('UPDATE users SET email = ? WHERE id = ?', ['newemail@example.com', 1]); db.run('COMMIT'); });
解释:
-
事务处理:当涉及多条数据库操作时,使用事务来确保操作的一致性和提高性能。
-
BEGIN TRANSACTION
:开始事务。 -
COMMIT
:提交事务。-
索引:为常查询的列(如
email
列)创建索引,可以加快查询速度:db.run(`CREATE INDEX idx_users_email ON users(email)`);
10. 总结
Node.js 和 SQLite 的结合提供了一种轻量级、简单易用的数据库方案。通过
sqlite3
库,开发者可以方便地在 Node.js 项目中使用 SQLite 数据库,执行基本的 CRUD 操作,并进行性能优化和错误处理。
本指南从连接数据库、创建表、插入、查询、更新、删除数据到性能优化,详细介绍了如何在 Node.js 项目中高效使用 SQLite。
-
索引:为常查询的列(如