有时应用的数据不多不少,有时还需要查询等功能,又不需要多用户修改数据,js 的原生存储方法不够用,mysql 等又有点夸张,这时 sqlite 就显得方便,于是找了一个开源项目:better-sqlite3,文档里有介绍性能,个人感觉是挺快的,比较特别的地方就是需要结合 electron 进行本地化编译,这个编译环境要求就比较多了,因为这个不像其他插件一样 npm 安装后就能用,但有一些东西就是用 c++等写的,然后需要编译成 node 模块供 js 调用,所以这个编译环境还是蛮有用的。
一、准备编译环境(Windows)
完整的说明可以看文档
- nodejs 版本要求 14, 16, 18, 或者 19 以上,nodejs 建议用 nvm 安装
- VisualStudio 版本没做要求,安装 2022 也没问题,可以安装社区版,要安装桌面开发 C++负载。
- 新版本的 Python,没说版本要求,个人建议 3.x,以前装 2.x 时遇到过问题,python 建议用 AnaConda 安装。
- 运行命令,关联 vs 编译器,注意第一行的 2022 是安装的 vs 版本,第二行的路径要是安装 vs 的 MSBuild 的路径。
npm config set msvs_version 2022
npm config set msbuild_path "C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
- node-gyp,这个在较新的 nodejs 里是自带的,最好检查下
- 看看是否安装以及版本
- 若没安装就安装下,可以全局或者局部安装
二、安装
1. 本体
npm i better-sqlite3
如果用 ts,安装声明文件
npm i @types/better-sqlite3
2. 安装编译插件
npm i electron-rebuild -D
3. 添加编译命令 package.json - scripts
"rebuild": "electron-rebuild -f -w better-sqlite3"
4. 运行编译
npm run rebuild
编译一次即可,如果 electron 版本更改就需要再编译。
如果用 webpack,需要跳过
externals: { 'better-sqlite3': 'commonjs better-sqlite3' },
三、使用
SqliteHelper.ts,这个帮助类还有可完善的地方,做过后端的看方法名大概就知道怎么用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| import * as Database from "better-sqlite3"; const path = require("path");
export class DALBaseResponse { flag: boolean = false; msg: string = ""; instance: object = null; }
class SqliteHelper { private db = Database(this.getConn());
private getConn() { let url: string = path.join(__dirname, `/../../../data.db`); if (url.indexOf("app.asar") >= 0) { url = url.replace("app.asar", "app.asar.unpacked"); } return url; }
private invoke(fun: Function) { let resp = new DALBaseResponse(); try { const re = fun(); if (typeof re === "boolean") { resp.flag = re; } else { resp.instance = re; resp.flag = true; } } catch (error) { resp.msg = error; } return resp; }
public executeNonQuery<T>(sql: string, pro: T) { return this.invoke(() => { const cmd = this.db.prepare(sql); return cmd.run(JSON.parse(JSON.stringify(pro))).changes > 0; }); }
public executeNonQueryParam(sql: string, param: {}) { return this.invoke(() => { const cmd = this.db.prepare(sql); return cmd.run(param).changes > 0; }); }
public querySingle(sql: string, param: string): DALBaseResponse { return this.invoke(() => { const row = this.db.prepare(sql).get(param); return row; }); }
public queryList<T>(sql: string) { return this.invoke(() => { const row: T[] = this.db.prepare(sql).all(); return row; }); } }
const api_sqlite = new SqliteHelper(); export default api_sqlite;
|
四、数据库管理工具
开源跨平台软件 SQLiteStudio