一、安装SQLite
npm install sqlite3
二、SQLite库PK
sqlite3:这位可是官方推荐,性能稳定,社区支持广泛。它的API丰富多样,无论是同步还是异步操作,都能轻松应对。如果你追求高性能和稳定性,选它没错!
sqlite:这位“小哥”虽然名气不如sqlite3,但也有着不俗的实力。它的API简洁明了,用起来那叫一个爽快。如果你对性能要求不是特别高,或者更喜欢简洁的API,那它可就是你的菜了。
better-sqlite3:这位可是纯JavaScript编写的“高手”,不需要任何本地依赖项。它的API简洁且性能出色,用起来就像飞一样快。如果你需要快速、简单且无需额外配置的SQLite数据库,选它准没错!
三、使用
创建数据库
使用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.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<unknown>}
*/
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替换为实际的数据库文件名。另外,根据需求,可以根据表的结构和数据来调整示例代码中的参数。