相关推荐recommended
【Node.js操作SQLite指南】
作者:mmseoamin日期:2024-02-03

Node.js操作SQLite指南

在本篇博客中,我们将学习如何在Node.js中操作SQLite数据库。我们将使用sqlite3模块来创建数据库、创建表以及进行数据的增删改查操作。

文章目录

  • Node.js操作SQLite指南
    • 安装sqlite3模块
    • 创建数据库
    • 创建表
    • 数据的增删改查
      • 插入数据
      • 查询数据
      • 更新数据
      • 删除数据
      • 关闭数据库连接
      • SQLite3的Node.js工具类

        安装sqlite3模块

        首先,我们需要安装sqlite3模块。在终端中运行以下命令来安装sqlite3模块:

        npm install sqlite3
        

        创建数据库

        使用sqlite3模块创建一个数据库连接,并创建一个数据库文件。以下是示例代码:

        const sqlite3 = require('sqlite3').verbose();
        // 创建数据库连接
        const db = new sqlite3.Database('mydatabase.db');
        

        创建表

        使用SQL语句在数据库中创建表。以下是示例代码:

        // 创建表
        db.run(`CREATE TABLE IF NOT EXISTS users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT,
          age INTEGER
        )`);
        

        数据的增删改查

        使用SQL语句执行数据的增删改查操作。以下是一些示例代码:

        插入数据

        // 插入数据
        db.run(`INSERT INTO users (name, age) VALUES ('John Doe', 25)`);
        

        查询数据

        // 查询数据
        db.all(`SELECT * FROM users`, (err, rows) => {
          if (err) {
            console.error(err);
          } else {
            console.log(rows);
          }
        });
        

        更新数据

        // 更新数据
        db.run(`UPDATE users SET age = 30 WHERE name = 'John Doe'`);
        

        删除数据

        // 删除数据
        db.run(`DELETE FROM users WHERE name = 'John Doe'`);
        

        关闭数据库连接

        在完成数据库操作后,记得关闭数据库连接。以下是示例代码:

        // 关闭数据库连接
        db.close();
        

        请注意,上述代码只是一个简单的示例,可以根据实际需求进行更复杂的操作。同时,还可以使用参数化查询来防止SQL注入攻击。

        希望本篇博客对有所帮助!如果有任何疑问,请随时提问。

        SQLite3的Node.js工具类

        以下是一个封装了SQLite3的Node.js类,用于实现数据在表中的增删改,分页,自定义sql操作:

        const sqlite3 = require('sqlite3').verbose();
        class SQLiteDB {
          constructor(databaseName) {
            this.db = new sqlite3.Database(databaseName);
          }
          
          createTable(tableName, columns) {
            const columnDefinitions = columns.map(column => `${column.name} ${column.type}`).join(', ');
            const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columnDefinitions})`;
            this.db.run(query);
          }
          
          insertData(tableName, data) {
            const columns = Object.keys(data).join(', ');
            const placeholders = Object.keys(data).map(() => '?').join(', ');
            const values = Object.values(data);
            const query = `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`;
            this.db.run(query, values);
          }
          
          updateData(tableName, data, condition) {
            const setClause = Object.keys(data).map(column => `${column} = ?`).join(', ');
            const values = Object.values(data);
            const query = `UPDATE ${tableName} SET ${setClause} WHERE ${condition}`;
            this.db.run(query, values);
          }
          
          deleteData(tableName, condition) {
            const query = `DELETE FROM ${tableName} WHERE ${condition}`;
            this.db.run(query);
          }
          
          executeQuery(query, params, callback) {
            this.db.all(query, params, (err, rows) => {
              if (err) {
                console.error(err);
              } else {
                callback(rows);
              }
            });
          }
          
          /**
           * 获取分页数据
           * @param tableName
           * @param page
           * @param pageSize
           * @param condition // const condition = "column_name = 'value'";
           * @returns {Promise}
           */
          getPagedData(tableName, page, pageSize,condition) {
            const offset = (page - 1) * pageSize;
            const countQuery = `SELECT COUNT(*) as total FROM ${tableName} WHERE ${condition}`;
            const dataQuery = `SELECT * FROM ${tableName} WHERE ${condition} LIMIT ? OFFSET ?`;
          
            return new Promise((resolve, reject) => {
              this.db.serialize(() => {
                this.db.get(countQuery, (err, row) => {
                  if (err) {
                    reject(err);
                  } else {
                    const total = row.total;
                  
                    this.db.all(dataQuery, [pageSize, offset], (err, rows) => {
                      if (err) {
                        reject(err);
                      } else {
                        const totalPages = Math.ceil(total / pageSize);
                      
                        resolve({ data: rows, total, totalPages });
                      }
                    });
                  }
                });
              });
            });
          }
          
          closeConnection() {
            this.db.close();
          }
        }
        //================= 使用案例 ==================================
        // const SQLiteDB = require('./SQLiteDB');
        // 创建数据库连接
        // const db = new SQLiteDB('D:\\WuWorkSpace\\code\\a-wu-project\\爬虫和逆向\\crawler-wusp\\AoMenMa\\2023\\aomen2023.db');
        //
        // // 执行自定义SQL查询
        // const query = 'SELECT * FROM users WHERE age > ?';
        // const params = [30];
        // db.executeQuery(query, params, rows => {
        //   console.log(rows);
        // });
        //
        // // 创建表
        // const columns = [
        //   { name: 'id', type: 'INTEGER PRIMARY KEY AUTOINCREMENT' },
        //   { name: 'name', type: 'TEXT' },
        //   { name: 'age', type: 'INTEGER' }
        // ];
        // db.createTable('users', columns);
        //
        // // 插入数据
        // const data = { name: 'John Doe', age: 25 };
        // db.insertData('users', data);
        //
        // // 更新数据
        // const newData = { age: 30 };
        // const condition = 'name = "John Doe"';
        // db.updateData('users', newData, condition);
        //
        // // 删除数据
        // const deleteCondition = 'age > 30';
        // db.deleteData('users', deleteCondition);
        //
        // // 关闭数据库连接
        // db.closeConnection();
        //===================== 分页案例 ===============================
        // const page = 1;
        // const pageSize = 10;
        // const condition = "column_name = 'value'";
        // db.getPagedData("user", page, pageSize,condition)
        // .then(({ data, total, totalPages }) => {
        //   console.log(data); // 处理分页查询结果
        //   console.log(total); // 总数
        //   console.log(totalPages); // 总页数
        // })
        // .catch(err => {
        //   console.error(err); // 处理错误
        // })
        // .finally(() => {
        //   db.closeConnection(); // 关闭数据库连接
        // });
        module.exports = SQLiteDB;
        

        在上述示例代码中,我们首先引入了SQLiteDB类,并创建了一个数据库连接。然后,我们使用createTable方法创建了一个名为users的表。接下来,我们使用insertData方法插入了一条数据。然后,我们使用updateData方法更新了数据。最后,我们使用deleteData方法删除了符合条件的数据。最后,我们使用closeConnection方法关闭了数据库连接。

        请注意,需要将mydatabase.db替换为实际的数据库文件名。另外,根据需求,可以根据表的结构和数据来调整示例代码中的参数。

        希望这个封装的类对有所帮助!如果有任何疑问,请随时提问。