node-sqlite3 学习笔记

* 使用sqlite3持久化数据
* 需求:把一个数组中的每个对象,每个对象中的属性,存到xxx.db文件中去,像数据库一样的去操作它
* 功能:1. 创建数据库(数据库存在的话,那就直接打开)
*            2. 创建一个表(表存在的话就不用创建啦)
*            3. 有了数据库和表, 最最基础的功能就是:
*                  插入数据(单个数据插入或者多个并行插入)
*                  更新数据(根据不同的条件更新每列数据)
*                  删除数据(根据不同的条件来删除每列数据)
*                 查询数据(单个数据查询,多个数据查询)

 安装: 

npm install sqlite3

/**
 * Created by Sorrow.X on 2017/7/12.
 */
var SQLite3 = require('sqlite3').verbose();

/**
 * 使用sqlite3持久化数据   
 * 需求:把一个数组中的每个对象,每个对象中的属性,存到xxx.db文件中去,像数据库一样的去操作它
 * 功能:1. 创建数据库(数据库存在的话,那就直接打开)
 *       2. 创建一个表(表存在的话就不用创建啦)
 *       3. 有了数据库和表, 最最基础的功能就是:
 *          插入数据(单个数据插入或者多个并行插入)
 *          更新数据(根据不同的条件更新每列数据)
 *          删除数据(根据不同的条件来删除每列数据)
 *          查询数据(单个数据查询,多个数据查询)
 */
class HandleDB {

    constructor(options) {
        this.databaseFile = options && options.databaseFile || `./data/test.db`;    // 数据库文件(文件路径+文件名)
        this.tableName = options && options.tableName || `adsTable`;   // 表名

        this.db = null;    // 打开的数据库对象
    }

    // 连接数据库(不存在就创建,存在则打开)
    connectDataBase() {
        let _self = this;
        return new Promise((resolve, reject) => {
            _self.db = new SQLite3.Database(_self.databaseFile, function(err) {
                if (err) reject(new Error(err));
                resolve('数据库连接成功');
            });
        });
    }

    /**
     * 创建表
     * @param sentence    CREATE TABLE 语句
     * @used
      let sentence = `
       create table if not exists ${this.tableName}(
            begin_time varchar(255),
            create_time varchar(255),
            end_time varchar(255),
            play_id varchar(255),
            postion_id int(50),
            status int(50),
            task_id int(50)
        );`;
     this.createTable(sentence);
     */
    createTable(sentence) {
        let _self = this;
        return new Promise((resolve, reject) => {
            _self.db.exec(sentence, function(err) {
                if (err) reject(new Error(err));
                resolve(`表创建成功 / 已存在,不需要重新创建该表`);
            });
        });
    }

    /**
     * 执行 增  删  改  查(单个数据查询或者多个数据查询)
     * @param sql    sql语句
     * @param param     参数(可以是数组或者数字或者字符串,根据sql语句来定)
     * @param mode    执行模式, 默认run,执行sql,如果查询的话,则使用get(单个)all(多个)
     * @returns {Promise}
       @used
       增 : this.sql(`insert into ${this.tableName} (begin_time, create_time, end_time, play_id, postion_id, status, task_id) values(?, ?, ?, ?, ?, ?, ?)`,
                    [obj.begin_time, obj.create_time, obj.end_time, obj.play_id, obj.postion_id, obj.status, obj.task_id]);

       删 : this.sql(`delete from ${this.tableName} where id = ?`, id);

       改 : this.sql(`update ${this.tableName} set begin_time = ?, status = ? where postion_id = ?`, [begin_timeValue, statusValue, postion_idValue]);

       查 : this.sql(`select * from ${this.tableName} where id = ?`, id, 'get/all');
     */
    sql(sql, param, mode) {
        let _self = this;
        mode = mode == 'all' ? 'all' : mode == 'get' ? 'get' : 'run';
        return new Promise((resolve, reject) => {
            _self.db[mode](sql, param,
                function (err, data) {    // data: Array, Object
                    if (err) {
                        reject(new Error(err));
                    } else {
                        if (data) {
                            resolve(data);    // 返回数据查询成功的结果
                        } else {
                            resolve('success');    // 提示 增 删 改 操作成功
                        };
                    };
                }
            );
        });
    }
};

module.exports = HandleDB;

// 使用

// used:
let db = new HandleDB({
    databaseFile: './data/adsbase.db',
    tableName: 'ads'
});

db.connectDataBase().then((result)=>{
    console.log(result);
    // 创建表(如果不存在的话,则创建,存在的话, 不会创建的,但是还是会执行回调)
    let sentence = `
       create table if not exists ${db.tableName}(
            begin_time varchar(255),
            create_time varchar(255),
            end_time varchar(255),
            play_id varchar(255),
            postion_id int(50),
            status int(50),
            task_id int(50),
            same_day int(50)
        );`;
    return db.createTable(sentence);
}).then((result)=>{
    console.log(result);
    doLogic();
}).catch((err)=>{
    console.error(err);
});

let doLogic = function() {

    //
    db.sql(`insert into ${db.tableName} (begin_time, create_time, end_time, play_id, postion_id, status, task_id, same_day) values(?, ?, ?, ?, ?, ?, ?, ?)`,
        ['2017/7/12', '2017/7/12', '2017/7/12', 102, 3, 0, 11, '2017-7-12']).then((res)=>{
        console.log(res);
    }).catch((err)=>{
        console.log(err);
    });

    // 一次性插入多个数据
    var data = {
        "Body": [
            {
                "begin_time": "1970-01-01 00:00:00",
                "create_time": "2017-07-11",
                "end_time": "",
                "play_id": 17,
                "postion_id": 1,
                "status": 0,
                "task_id": 24
            },
            {
                "begin_time": "1970-01-01 00:00:00",
                "create_time": "2017-07-11",
                "end_time": "",
                "play_id": 18,
                "postion_id": 4,
                "status": 0,
                "task_id": 24
            },
            {
                "begin_time": "1970-01-01 00:00:00",
                "create_time": "2017-07-11",
                "end_time": "",
                "play_id": 19,
                "postion_id": 2,
                "status": 0,
                "task_id": 24
            },
            {
                "begin_time": "1970-01-01 00:00:00",
                "create_time": "2017-07-11",
                "end_time": "",
                "play_id": 20,
                "postion_id": 3,
                "status": 0,
                "task_id": 24
            }
        ],
        "Code": 0,
        "Message": ""
    };
    var arr = data.Body;
    var promises = arr.map(function(obj) {
        return db.sql(`insert into ${db.tableName} (begin_time, create_time, end_time, play_id, postion_id, status, task_id, same_day) values(?, ?, ?, ?, ?, ?, ?, ?)`,
            [obj.begin_time, obj.create_time, obj.end_time, obj.play_id, obj.postion_id, obj.status, obj.task_id, '2017-7-12']);
    });
    Promise.all(promises).then(function (posts) {
        console.log('全部插入完毕', posts)
    }).catch(function(reason){
        console.error(reason);
    });

    //
    db.sql(`delete from ${db.tableName} where same_day = ?`, '2017-7-12').then((res)=>{
        console.log(res);
    }).catch((err)=>{
        console.log(err);
    });

    //
    db.sql(`update ${db.tableName} set task_id = ? where same_day = ?`, [4, '2017-7-12']).then((res)=>{
        console.log(res);
    }).catch((err)=>{
        console.log(err);
    });

    //
    db.sql(`select * from ${db.tableName} where same_day = ?`, '2017-7-12', 'all').then((res)=>{
        console.log(res);
    }).catch((err)=>{
        console.log(err);
    });
};

文档: https://github.com/mapbox/node-sqlite3/wiki/API

sql工具下载: http://www.sqliteexpert.com/

原文地址:https://www.cnblogs.com/sorrowx/p/7162356.html