node操作本地数据库-SQLite方案

SQLite是一款轻量级的数据库,SQLite的第一个版本是2000年就发布了的,经过十多年的历练,显然SQLite目前已经相当成熟。SQLite最大的特点就是没有任何数据库服务器,无论是Cjavanode.js,只需要相应的驱动,就可以直接对数据库进行读写,速度是相当的快。这里我们通过SQLite3实现对SQLite的一些操作。SQLite3非常小,轻量级,就几百K大小;不需要用户名,密码,直接就可以对数据库进行操作。

注:这里使用是配合Electron。而且需要前端对数据库sql语句有一定了解。

一、安装SQLite3数据库

cnpm install sqlite3 --save

二、建立数据库链接

const sqlite3 = require('sqlite3').verbose(),
    DB = new sqlite3.Database('data.db', {});
这里必须指定.db文件位置,建议和这个js文件放在一个目录,而后这个链接数据库的js文件要在Electron主进程js文件里面调用。
// 关闭数据库链接
DB.close((err, res) => {
    if (err) {
        console.log('数据库链接关闭失败::');
        console.log(err)
        return;
    }
    console.log('数据库链接关闭成功::');
    console.log(res)
})

三、操作数据库

  1. run方法
    用法:run(sql,param,...],[callback]),多用于新增、修改、删除等不需要返回数据的场景。
    功能:运行指定参数的SQL语句,完成之后调用回调函数,它不返回任何数据,在回调函数里面有一个参数,SQL语句执行成功,则参数的值为null,反之为一个错误的对象,它返回的是数据库的操作对象。在这个回调函数里面当中的this,里面包含有lastId(插入的ID)和change(操作影响的行数,如果执行SQL语句失败,则change的值永远为0)。

  2. all方法
    用法:all(sql,[param,...],[callback]),多用于查询等需要返回数据的场景。
    功能:运行指定参数的SQL语句,完成过后调用回调函数。如果执行成功,则回调函数中的第一个参数为null,第二个参数为查询的结果集,反之,则只有一个参数,且参数的值为一个错误的对象。

  3. 基础操作示例
    3.1. 创建数据表

const CREATE_TABLE_SQL = `CREATE TABLE  IF NOT EXISTS  user
    (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(64),
    age INTEGER
    );`;
DB.run(CREATE_TABLE_SQL, (err, res) => {
    if (err) {
        console.log('创建表失败::');
        console.log(err)
        return;
    }
    console.log('创建表成功::');
    console.log(res)
});
创建数据表

3.2. 新增数据

const _user_info = {
    name: 'cuiht-' + Math.ceil(Math.random() * 100),
    age: Math.ceil(Math.random() * 100)
}, TEST_INSERT_SQL = `INSERT INTO user (name, age)  VALUES('${_user_info.name}','${_user_info.age}')`;
DB.all(TEST_INSERT_SQL, (err, res) => {
    if (err) {
        console.log('新增数据失败::');
        console.log(err)
        return;
    }
    console.log('新增数据成功::');
    console.log(res)
});
新增数据

3.3. 修改数据

const _user_info_u = {
    name: 'cuiht-' + Math.ceil(Math.random() * 100),
    age: Math.ceil(Math.random() * 100)
}, TEST_UPT_SQL = `UPDATE user
    SET name = '${_user_info_u.name}', age = '${_user_info_u.age}'
    WHERE id = '2'`;
DB.all(TEST_UPT_SQL, (err, res) => {
    if (err) {
        console.log('修改数据失败::');
        console.log(err)
        return;
    }
    console.log('修改数据成功::');
    console.log(res)
});
修改数据

3.4. 删除数据

const TEST_DEL_SQL = `DELETE FROM user WHERE id = '3'`;
DB.all(TEST_DEL_SQL, (err, res) => {
    if (err) {
        console.log('删除数据失败::');
        console.log(err)
        return;
    }
    console.log('删除数据成功::');
    console.log(res)
});
删除数据

3.5. 查询数据列表

const TEST_LIST_SQL = `SELECT * FROM user ORDER BY id DESC`;
DB.all(TEST_LIST_SQL, (err, res) => {
    if (err) {
        console.log('查询数据列表失败::');
        console.log(err)
        return;
    }
    console.log('查询数据列表成功::');
    console.log(res)
});
查询数据列表

3.6. 查询数据

const TEST_GET_SQL = `SELECT * FROM user WHERE id = '3'`;
DB.all(TEST_GET_SQL, (err, res) => {
    if (err) {
        console.log('查询数据失败::');
        console.log(err)
        return;
    }
    console.log('查询数据成功::');
    console.log(res)
});
查询数据

四、 使用案例

注:这里是在Electron+vue中的使用案例。
  1. 新建文件src/DB/index.js,同时在相同的目录新建data.db文件。
/*
 * @Author: cuiht
 * @Date: 2022-04-22 18:31:27
 * @LastEditors: cuiht
 * @LastEditTime: 2022-04-25 17:28:13
 * @Description: 数据库链接 及 数据库操作方法封装
 */
const { ipcMain } = require('electron'),
    sqlite3 = require('sqlite3').verbose(),
    DB = new sqlite3.Database('data.db', {});

export const DBserve = (arg) => {
    return new Promise((resolve) => {
        const { tableName = '', order = '', option = {} } = arg;
        if (!tableName) {
            return resolve({
                code: 0,
                msg: '未获取数据表名!'
            })
        }
        if (!order) {
            return resolve({
                code: 0,
                msg: '未获取到指令!'
            })
        }
        switch (order) {
            case 'insert':
                const TEST_INSERT_SQL = `INSERT INTO ${tableName} (name, age)  VALUES('${option.name}','${option.age}')`;
                DB.all(TEST_INSERT_SQL, (err, data) => {
                    if (err) {
                        return resolve({
                            code: 0,
                            msg: err
                        })
                    }
                    return resolve({
                        code: 200,
                        msg: "新增成功!",
                        data,
                    })
                });
                break;
            case 'find':
                const TEST_LIST_SQL = `SELECT * FROM ${tableName} ORDER BY id DESC`;
                DB.all(TEST_LIST_SQL, (err, data) => {
                    if (err) {
                        return resolve({
                            code: 0,
                            msg: err
                        })
                    }
                    return resolve({
                        code: 200,
                        msg: "查询列表成功!",
                        data,
                    })
                });
                break;
            case 'findOne':
                let findOne_str = '', findOne_i = 0;
                for (const key in option) {
                    if (findOne_i > 0) {
                        findOne_str += ` and `;
                    }
                    findOne_str += `${key} = ${option[key]}`;
                    findOne_i++;
                }
                const TEST_GET_SQL = `SELECT * FROM ${tableName} WHERE ${findOne_str}`;
                DB.all(TEST_GET_SQL, (err, data) => {
                    if (err) {
                        return resolve({
                            code: 0,
                            msg: err
                        })
                    }
                    return resolve({
                        code: 200,
                        msg: "查询成功!",
                        data,
                    })
                });
                break;
            case 'update':
                if (!option.id) {
                    return resolve({
                        code: 0,
                        msg: '未获取到id'
                    })
                }
                let update_str = '', update_i = 0;
                for (const key in option) {
                    if (key!=='id') {
                        if (update_i > 0) {
                            update_str += `,`;
                        }
                        update_str += `${key} = '${option[key]}'`;
                        update_i++;
                    }
                }
                const TEST_UPT_SQL = `UPDATE ${tableName} SET ${update_str} WHERE id = ${option.id}`;
                DB.all(TEST_UPT_SQL, (err, data) => {
                    if (err) {
                        return resolve({
                            code: 0,
                            msg: err
                        })
                    }
                    return resolve({
                        code: 200,
                        msg: "更新成功!",
                        data,
                    })
                });
                break;
            case 'remove':
                if (!option.id) {
                    return resolve({
                        code: 0,
                        msg: '未获取到id'
                    })
                }
                const TEST_DEL_SQL = `DELETE FROM ${tableName} WHERE id = ${option.id}`;
                DB.all(TEST_DEL_SQL, (err, data) => {
                    if (err) {
                        return resolve({
                            code: 0,
                            msg: err
                        })
                    }
                    return resolve({
                        code: 200,
                        msg: "删除成功!",
                        data,
                    })
                });
                break;
            default:
                break;
        }
    })
};

export const DBrunSql = (sql) => {
    return new Promise((resolve) => {
        if (!sql) {
            return resolve({
                code: 0,
                msg: '未获取到sql!'
            })
        }
        DB.run(sql, (err, data) => {
            if (err) {
                return resolve({
                    code: 0,
                    msg: err
                })
            }
            return resolve({
                code: 200,
                msg: 'sql执行成功!',
                data
            })
        })
    })
};

ipcMain.on('DBserve', (event, arg) => {
    DBserve(arg).then(res => {
        event.returnValue = res
    })
});
ipcMain.on('DBrunSql', (event, arg) => {
    DBrunSql(arg).then(res => {
        event.returnValue = res
    })
});
  1. 新建文件public/ipcRenderer.js
window.ipcRenderer = require("electron").ipcRenderer;
  1. 修改Electron主进程js文件。
// 引入数据库入口文件
import './DB'
// ... 其他代码
async function createWindow() {
  const win = new BrowserWindow({
    // ...
    webPreferences: {
      // ...
      nodeIntegration: true,
      contextIsolation: false,
      preload: `${__static}/ipcRenderer.js`
      // ...
    },
    // ...
  })
  // ...
}
// ... 其他代码
  1. 新建src/network/dataServes.js
/*
 * @Author: cuiht
 * @Date: 2022-04-25 14:44:40
 * @LastEditors: cuiht
 * @LastEditTime: 2022-04-25 17:37:46
 * @Description: 调用数据库方法封装
 */

// 创建数据表
const CREATE_TABLE_SQL = `CREATE TABLE  IF NOT EXISTS  users
    (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name VARCHAR(64),
        age INTEGER
    );`;
window.ipcRenderer.sendSync('DBrunSql', CREATE_TABLE_SQL)

const DBserve = ({ order = '', option = '' }) => {
    return new Promise((resolve) => {
        const res = window.ipcRenderer.sendSync('DBserve', {
            tableName: 'users',
            order,
            option
        })
        resolve(res)
    });
}

export const
    // 新增记录
    userAdd = data => DBserve({
        order: 'insert',
        option: {
            ...data,
            createTime: new Date().getTime()
        }
    }),
    // 查询记录列表
    userList = data => DBserve({
        order: 'find',
        option: data
    }),
    // 查询记录
    userGet = data => DBserve({
        order: 'findOne',
        option: data
    }),
    // 修改记录
    userUpt = data => DBserve({
        order: 'update',
        option: data
    }),
    // 删除记录
    userDel = data => DBserve({
        order: 'remove',
        option: data
    });
  1. 新建一个vue页面。
<!--
 * @Author: cuiht
 * @Date: 2022-04-22 18:41:07
 * @LastEditors: cuiht
 * @LastEditTime: 2022-04-25 17:39:03
 * @Description: 使用示例
-->
<template>
  <div id="text-page">
    <table class="list">
      <tr>
        <td><button @click="Add">新增</button></td>
      </tr>
      <tr v-for="item in list" :key="item.id">
        <td>
          {{ item }}
        </td>
        <td style="width: 150px">
          <button @click="Upt(item)">修改</button>
          <button @click="Del(item)">删除</button>
          <button @click="Get(item)">查看</button>
        </td>
      </tr>
    </table>
  </div>
</template>

<script>
import {
  userAdd,
  userList,
  userGet,
  userUpt,
  userDel,
} from "@/network/dataServes";
export default {
  name: "test",
  data() {
    return {
      list: [],
    };
  },
  mounted() {
    this.List();
  },
  methods: {
    Add() {
      const reqData = {
        age: this.list.length + 1,
        name: "cuiht-" + new Date().getTime(),
      };
      userAdd(reqData).then((res) => {
        console.log(res);
        if (res.code !== 200) {
          return;
        }
        this.List();
      });
    },
    List() {
      userList().then((res) => {
        console.log(res);
        if (res.code !== 200) {
          return;
        }
        this.list = res.data;
      });
    },
    Get(item) {
      userGet({
        id: item.id,
      }).then((res) => {
        console.log(res);
        if (res.code !== 200) {
          return;
        }
        alert(JSON.stringify(res.data));
      });
    },
    Upt(item) {
      const reqData = {
        id: item.id,
        age: this.list.length + 1,
        name: "undate-" + new Date().getTime(),
      };
      userUpt(reqData).then((res) => {
        console.log(res);
        if (res.code !== 200) {
          return;
        }
        this.List();
      });
    },
    Del(item) {
      userDel({
        id: item.id,
      }).then((res) => {
        console.log(res);
        if (res.code !== 200) {
          return;
        }
        this.List();
      });
    },
  },
};
</script>

<style lang="scss">
#text-page {
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
}
</style>
效果图

无论你将来想去哪里,想过怎样的生活,请现在就为自己蓄积能量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342