使用 Node.js 操作 SQLite的方法

 更新时间:2025年09月28日 14:43:11   作者:chxii  
SQLite是一个轻量级的嵌入式关系型数据库,适合小型项目、原型开发和本地数据存储,在 Node.js 中使用 SQLite 非常方便,常用的第三方库,本文给大家介绍使用Node.js操作SQLite的方法,感兴趣的朋友一起看看吧

 SQLite 是一个轻量级的嵌入式关系型数据库,适合小型项目、原型开发和本地数据存储。在 Node.js 中使用 SQLite 非常方便,常用的第三方库是 sqlite3

一、安装依赖

首先,在项目中安装 sqlite3

npm init -y npm install sqlite3

二、创建并连接数据库

创建一个 db.js 文件:

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('./mydb.sqlite', (err) => {
  if (err) {
    console.error(err.message);
  }
  console.log('Connected to the mydb SQlite database.');
});

这段代码首先导入了 sqlite3 模块,并设置了为 verbose 模式以便于调试。然后创建了一个新的 SQLite 数据库连接,如果指定的数据库文件不存在,SQLite 将自动创建一个新的。 

三、创建表

db.run(`CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT NOT NULL UNIQUE
)`, function(err) {
    if (err) {
        console.error(err.message);
    }
    console.log('Table created');
});

这里我们创建了一个名为 users 的表,包含三个字段:id、name 和 email。 

四、插入/更新/删除 数据

let sql = `INSERT INTO users(name, email) VALUES(?, ?)`;
db.run(sql, ["John Doe", "johndoe@example.com"], function(err) {
    if (err) {
        console.error(err.message);
    }
    console.log(`A new row has been inserted with rowid ${this.lastID}`);
});
let updateSql = `UPDATE users SET email = ? WHERE name = ?`;
db.run(updateSql, ["newemail@example.com", "John Doe"], function(err) {
    if (err) {
        console.error(err.message);
    }
    console.log(`Row(s) updated: ${this.changes}`);
});
let deleteSql = `DELETE FROM users WHERE name = ?`;
db.run(deleteSql, ["John Doe"], function(err) {
    if (err) {
        console.error(err.message);
    }
    console.log(`Row(s) deleted: ${this.changes}`);
});

五、查询数据

查询数据库中的数据可以使用 db.all() 方法:

db.all(`SELECT * FROM users`, [], (err, rows) => {
    if (err) {
        throw err;
    }
    rows.forEach((row) => {
        console.log(row.id, row.name, row.email);
    });
});

分页查询的基本原理

分页查询主要依靠两个 SQL 关键字:

  • LIMIT:限制返回的记录数。
  • OFFSET:跳过指定数量的记录。
-- 第 1 页(每页 10 条)
SELECT * FROM users LIMIT 10 OFFSET 0;
-- 第 2 页
SELECT * FROM users LIMIT 10 OFFSET 10;
-- 第 3 页
SELECT * FROM users LIMIT 10 OFFSET 20;

基础实现方法

使用db.all()方法

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./mydb.sqlite');
// 分页参数
const page = 1;
const pageSize = 10;
const offset = (page - 1) * pageSize;
// 分页查询
db.all(
  'SELECT * FROM users LIMIT ? OFFSET ?',
  [pageSize, offset],
  (err, rows) => {
    if (err) {
      console.error('查询失败:', err.message);
    } else {
      console.log('查询结果:', rows);
    }
  }
);

计算总页数

// 查询总记录数
db.get('SELECT COUNT(*) as count FROM users', (err, result) => {
  if (err) {
    console.error('查询总记录数失败:', err.message);
  } else {
    const totalCount = result.count;
    const totalPages = Math.ceil(totalCount / pageSize);
    console.log(`总记录数: ${totalCount}, 总页数: ${totalPages}`);
  }
});

db.all和db.get是两个常用的查询方法,但它们的功能和用途有明显区别:

1. 返回结果数量

  • db.get
    • 返回查询结果的第一条记录(单个对象)。如果没有匹配的记录,则返回 null
  • db.all
    • 返回查询结果的所有记录(数组)。如果没有匹配的记录,则返回空数组 []

2. 回调参数

  • db.get
    • 回调函数接收 (err, row),其中 row 是单个对象。
  • db.all
    • 回调函数接收 (err, rows),其中 rows 是数组。

3.db.get的适用场景

  • 查询唯一记录(如通过 ID 查询用户)。
  • 聚合查询(如 COUNTSUMAVG)。
  • 只需获取第一条记录的场景。
// 查询单个用户
db.get('SELECT * FROM users WHERE id = ?', [1], (err, row) => {
  if (err) {
    console.error(err);
  } else {
    console.log(row); // 返回单个用户对象或 null
  }
});
// 聚合查询
db.get('SELECT COUNT(*) as total FROM users', (err, row) => {
  console.log(row.total); // 返回总数
});

4.db.all的适用场景

  • 查询多条记录(如获取所有用户)。
  • 分页查询(结合 LIMIT 和 OFFSET)。
  • 需要遍历所有结果的场景。
// 查询所有用户
db.all('SELECT * FROM users', (err, rows) => {
  if (err) {
    console.error(err);
  } else {
    console.log(rows); // 返回用户数组
    rows.forEach(user => {
      console.log(user.name);
    });
  }
});
// 分页查询
db.all('SELECT * FROM users LIMIT ? OFFSET ?', [10, 0], (err, rows) => {
  // 返回第一页的 10 条记录
});

db.serialize()是一个重要的方法,用于控制 SQL 语句的执行顺序

1. SQLite 的并发特性

  • SQLite 是文件型数据库,同一时间只能有一个写操作。
  • 多个读操作可以并行,但写操作会阻塞所有其他操作。

2.db.serialize()的作用

  • 确保同一连接上的 SQL 语句按顺序执行
  • 防止并发执行导致的数据不一致问题。
db.serialize(() => {
  // 这里的 SQL 语句会按顺序执行
  db.run('SQL 语句 1');
  db.run('SQL 语句 2');
  // ...
});
db.serialize(() => {
  // 创建表
  db.run('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)');
  // 插入数据
  db.run('INSERT INTO users (name) VALUES (?)', ['张三']);
  // 查询数据
  db.get('SELECT * FROM users WHERE id = 1', (err, row) => {
    console.log(row); // 可以确保数据已插入
  });
});

事务需要顺序执行

db.serialize(() => {
  // 开始事务
  db.run('BEGIN TRANSACTION');
  // 执行多个操作
  db.run('INSERT INTO users (name) VALUES (?)', ['李四']);
  db.run('UPDATE accounts SET balance = balance - 100 WHERE user_id = 1');
  // 提交事务
  db.run('COMMIT', (err) => {
    if (err) {
      db.run('ROLLBACK'); // 出错时回滚
    }
  });
});
  • 事务中的 SQL 必须按顺序执行,否则可能导致数据不一致。
  • 例如,COMMIT 必须在所有操作完成后执行。

六、关闭数据库连接

db.close((err) => {
    if (err) {
        console.error(err.message);
    }
    console.log('Close the database connection.');
});

到此这篇关于使用 Node.js 操作 SQLite的文章就介绍到这了,更多相关node.js操作sqlite内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Node 文件查找优先级及 Require 方法文件查找策略

    Node 文件查找优先级及 Require 方法文件查找策略

    这篇文章主要介绍了Node文件查找优先级及Require方法文件查找策略。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 从零学习node.js之搭建http服务器(二)

    从零学习node.js之搭建http服务器(二)

    NodeJs是什么我想大家已经很了解了,作为一个前端工程师,想要不断提升自己,一般都会接触到后端服务器的技术,NodeJs给我们提供了一个学习成本相对较低的捷径可走。下面这篇文章主要介绍了node.js中搭建http服务器的相关资料,需要的朋友可以参考下。
    2017-02-02
  • 深入理解Node module模块

    深入理解Node module模块

    这篇文章主要介绍了深入理解Node module模块,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • npm下载慢或下载失败问题解决的三种方法

    npm下载慢或下载失败问题解决的三种方法

    这篇文章主要为大家介绍了npm下载慢或下载失败问题解决的三种方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • nodejs中实现用户注册路由功能

    nodejs中实现用户注册路由功能

    这篇文章主要介绍了nodejs中实现用户注册路由功能的实例代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • mongodb初始化并使用node.js实现mongodb操作封装方法

    mongodb初始化并使用node.js实现mongodb操作封装方法

    这篇文章主要介绍了mongodb初始化并使用node.js实现mongodb操作封装方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 充分发挥Node.js程序性能的一些方法介绍

    充分发挥Node.js程序性能的一些方法介绍

    这篇文章主要介绍了充分发挥Node.js程序性能的一些方法介绍,Node.js是把JavaScript用于服务器端的框架,需要的朋友可以参考下
    2015-06-06
  • Node.js 异步异常的处理与domain模块解析

    Node.js 异步异常的处理与domain模块解析

    本篇文章主要介绍了Node.js 异步异常的处理与domain模块解析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • PostgreSQL Node.js实现函数计算方法示例

    PostgreSQL Node.js实现函数计算方法示例

    这篇文章主要给大家介绍了关于PostgreSQL Node.js实现函数计算的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Node.js高级编程cluster环境及源码调试详解

    Node.js高级编程cluster环境及源码调试详解

    这篇文章主要为大家介绍了Node.js高级编程cluster环境及源码调试详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论