cnpm i sqlite3
db.js
// const sqlite3 = require('sqlite3').verbose()
import { Database } from 'sqlite3'
function getDB(dbPath, mCreateTableSql) {
let createTableSql = mCreateTableSql
const setCreateTableSql = (sql) => (createTableSql = sql)
const setDBPath = (path) => (dbPath = path)
const db = new Database(dbPath)
const executeSql = (sql, params) => {
return new Promise((resolve, reject) => {
db.run(createTableSql, (err) => {
if (err) {
reject(err)
} else {
db.all(sql, params, (err, rows) => {
if (err != null) {
console.log('sqlite error', err)
reject(err)
} else {
console.log('sqlite success')
resolve(rows)
}
})
}
})
})
}
const showTables = async () => {
return await executeSql('SELECT name FROM sqlite_master WHERE type="table";', [])
}
return {
showTables,
setCreateTableSql,
setDBPath,
executeSql
}
}
export default getDB
使用db
import getDB from './db.js'
const tableSql=
'CREATE TABLE IF NOT EXISTS tableName(' +
'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
'`name` TEXT NOT NULL);'
const { showTables, setCreateTableSql, setDBPath, executeSql } = getDB("D:/database.db", tableSql)
const test = async () => {
// const data = await executeSql("select * from tableName", []);
const data = await executeSql("select * from tableName where name = ?", ['name']);// 传递参数
const tables = await showTables();
console.log(tables)
}
test();
踩坑记录:
使用异步函数,想要控制并发数量时,不要不要不要使用 数组对象 的 forEach方法,用for循环就没问题
async function fun() {
let tasks = [];
const taskLimit = 10; // 限制并发数量
for (let k = 0; k < arr.length; k++) {
tasks.push(asyncFun(arr[k],globalVar));// 把变量传递给函数调用,防止变量被某个异步函数修改
if (tasks.length >= taskLimit) {
await Promise.all(tasks);
tasks = [];
console.log("已异步执行", taskLimit, "项任务");
}
}
}