Electron使用Sqlite

发布时间:

更新时间:

有时应用的数据不多不少,有时还需要查询等功能,又不需要多用户修改数据,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 里是自带的,最好检查下
    • 看看是否安装以及版本
      • node-gyp list
    • 若没安装就安装下,可以全局或者局部安装
      • npm install -g node-gyp

二、安装

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`);
// 发布时若用asar,需要把数据库放在外面,所以要转换下路径
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

请吃小笼包
支付宝 | Alipay
微信 | Wechat