在node中使用文件数据库-🍻sqlite3🍺

835 阅读2分钟

使用场景:node在本地存储数据,效果类似于浏览器的本地缓存

在node中使用文件数据库-sqlite3

封装

/**
 * File: sqlite.js
 * 对 文件数据库-sqlite3 的封装
 * 
 * 22-10-12 KUN
 * 
 * 回调参数统一{code,res} code:状态码 500/200 热水:如果有需要返回的内容则在二参
 */

var fs = require('fs');
var sqlite3 = require('sqlite3').verbose();
var DB = DB || {};

DB.SqliteDB = function (file) {
    DB.db = new sqlite3.Database(file);
    DB.exist = fs.existsSync(file);
    if (!DB.exist) {
        fs.openSync(file, 'w');
    };
};

DB.printErrorInfo = function (err, callback = () => { }) {
    callback(500)
    console.log("Error Message:" + err.message);
};

//创建数据表
DB.SqliteDB.prototype.createTable = function (sql) {
    DB.db.serialize(function () {
        DB.db.run(sql, function (err) {
            if (null != err) {
                DB.printErrorInfo(err);
                return;
            }
        });
    });
};

//新增
DB.SqliteDB.prototype.insertData = function (sql, objects) {
    DB.db.serialize(function () {
        var stmt = DB.db.prepare(sql);
        for (var i = 0; i < objects.length; ++i) {
            stmt.run(objects[i]);
        }
        stmt.finalize();
    });
};

//查询
DB.SqliteDB.prototype.queryData = function (sql, callback = () => { }) {
    DB.db.all(sql, function (err, rows) {
        if (null != err) {
            DB.printErrorInfo(err, callback);
            return;
        }
        if (callback) {
            callback(200, rows);
        }
    });
};

//修改 "update 表名 set 修改项 where 条件"
DB.SqliteDB.prototype.upData = function (sql, callback = () => { }) {
    DB.db.run(sql, function (err) {
        if (null != err) {
            DB.printErrorInfo(err, callback);
            return
        }
        callback(200);
    });
};

//删除 "delete from 表名 where 条件"
DB.SqliteDB.prototype.delData = function (sql, callback = () => { }) {
    DB.db.run(sql, function (err) {
        if (null != err) {
            DB.printErrorInfo(err, callback);
            return
        }
        callback(200);
    });
};

//其他sql    与删改相同-只是便于区分
DB.SqliteDB.prototype.onSql = function (sql, callback = () => { }) {
    DB.db.run(sql, function (err) {
        if (null != err) {
            DB.printErrorInfo(err, callback);
            return
        }
        callback(200);
    });
};

//关闭连接
DB.SqliteDB.prototype.close = function () {
    DB.db.close();
};

exports.SqliteDB = DB.SqliteDB;

调用

/**
 * File: callSqlite.js.
 * 对 文件数据库-sqlite3封装后的调用
 * 
 * 22-10-12 KUN
 * 
 */

//创建连接
var SqliteDB = require('./sqlite.js').SqliteDB;
var file = "thenKeys.db";
var sqliteDB = new SqliteDB(file);

//创建数据库:如果没有则创建
let tableName = 'tiles'//表名
let keys = [//表内字段  ---字段名 存储类型---
    "key VARCHER",//VARCHER-字符
    "value VARCHER",
]
let strKeys = keys.join(',')//转换为可用字符串
var createTableSql = `create table if not exists ${tableName}(${strKeys});`;
sqliteDB.createTable(createTableSql);

let getFn = function () {
    //查
    var querySql = `select * from ${tableName} where key = 'A1001'`;
    sqliteDB.queryData(querySql, (code, res) => {
        if (code == 200) {
            console.log(res);
        }
    });
}

//增
var tileData = [['A1001', '123456']];//这里是数组可以批量增,key可重复
var insertTileSql = `insert into ${tableName}(key,value) values(?, ?)`;
sqliteDB.insertData(insertTileSql, tileData);

getFn()//查一下看看

//改
var updateSql = `update ${tableName} set value = '789' where key = 'A1001'`;
sqliteDB.upData(updateSql, (code) => {
    console.log(code);
});

//删
var delSql = `delete from ${tableName} where key = 'A1001'`;
sqliteDB.delData(delSql, (code) => {
    console.log(code);
});

getFn()//查一下看看  因为是异步,所有多次查的顺序不确定

//关闭连接
sqliteDB.close();

妈耶,破案了!

//需要注意传入参数的类型 例:
let key = "A1001"
var delSql = `delete from ${tableName} where key = '${key}'`;

electron 数据持久化解决方案:

 electron-store