Skip to content

Commit b55a555

Browse files
committed
feat: sqlite to better sqllite
1 parent 4153081 commit b55a555

2 files changed

Lines changed: 90 additions & 65 deletions

File tree

electron/mapi/db/main.ts

Lines changed: 87 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import sqlite3, {Database} from "sqlite3";
1+
import sqlite3, {Database} from "better-sqlite3";
22
import path from "node:path";
33
import migration from "./migration";
44
import {AppEnv} from "../env";
@@ -12,82 +12,101 @@ let dbConn: Database | null = null;
1212
let dbSuccess = false;
1313

1414
const db = {
15+
/**
16+
* 检查数据库连接是否已初始化
17+
* @throws {string} 如果数据库未初始化则抛出异常
18+
*/
1519
_check() {
1620
if (!dbSuccess) {
1721
throw "DBNotInitialized";
1822
}
1923
},
24+
/**
25+
* 执行SQL语句(无返回值)
26+
* @param {string} sql - SQL语句
27+
* @param {any[]} params - 参数数组
28+
* @returns {Promise<void>}
29+
*/
2030
async execute(sql: string, params: any = []): Promise<void> {
2131
db._check();
22-
return new Promise((resolve, reject) => {
23-
dbConn.prepare(sql).run(...params, function (err) {
24-
if (err) {
25-
reject(err);
26-
} else {
27-
resolve(undefined);
28-
}
29-
});
30-
});
32+
try {
33+
dbConn.prepare(sql).run(...params);
34+
} catch (err) {
35+
throw err;
36+
}
3137
},
38+
/**
39+
* 插入数据并返回插入的行ID
40+
* @param {string} sql - SQL语句
41+
* @param {any[]} params - 参数数组
42+
* @returns {Promise<string | number>} 插入的行ID
43+
*/
3244
async insert(sql: string, params: any = []): Promise<string | number> {
3345
db._check();
34-
return new Promise((resolve, reject) => {
35-
dbConn.prepare(sql).run(...params, function (err) {
36-
if (err) {
37-
reject(err);
38-
} else {
39-
resolve(this.lastID);
40-
}
41-
});
42-
});
46+
try {
47+
const result = dbConn.prepare(sql).run(...params);
48+
return result.lastInsertRowid;
49+
} catch (err) {
50+
throw err;
51+
}
4352
},
53+
/**
54+
* 查询单行数据
55+
* @param {string} sql - SQL语句
56+
* @param {any[]} params - 参数数组
57+
* @returns {Promise<any>} 查询结果
58+
*/
4459
async first(sql: string, params: any = []): Promise<any> {
4560
db._check();
46-
return new Promise((resolve, reject) => {
47-
dbConn.prepare(sql).get(...params, (err, row) => {
48-
if (err) {
49-
reject(err);
50-
} else {
51-
resolve(row);
52-
}
53-
});
54-
});
61+
try {
62+
return dbConn.prepare(sql).get(...params);
63+
} catch (err) {
64+
throw err;
65+
}
5566
},
67+
/**
68+
* 查询多行数据
69+
* @param {string} sql - SQL语句
70+
* @param {any[]} params - 参数数组
71+
* @returns {Promise<any[]>} 查询结果数组
72+
*/
5673
async select(sql: string, params: any = []): Promise<any[]> {
5774
db._check();
58-
return new Promise((resolve, reject) => {
59-
dbConn.prepare(sql).all(...params, (err, rows) => {
60-
if (err) {
61-
reject(err);
62-
} else {
63-
resolve(rows);
64-
}
65-
});
66-
});
75+
try {
76+
return dbConn.prepare(sql).all(...params);
77+
} catch (err) {
78+
throw err;
79+
}
6780
},
81+
/**
82+
* 更新数据并返回影响的行数
83+
* @param {string} sql - SQL语句
84+
* @param {any[]} params - 参数数组
85+
* @returns {Promise<number>} 影响的行数
86+
*/
6887
async update(sql: string, params: any = []): Promise<number> {
6988
db._check();
70-
return new Promise((resolve, reject) => {
71-
dbConn.prepare(sql).run(...params, function (err) {
72-
if (err) {
73-
reject(err);
74-
} else {
75-
resolve(this.changes);
76-
}
77-
});
78-
});
89+
try {
90+
const result = dbConn.prepare(sql).run(...params);
91+
return result.changes;
92+
} catch (err) {
93+
throw err;
94+
}
7995
},
96+
/**
97+
* 删除数据并返回影响的行数
98+
* @param {string} sql - SQL语句
99+
* @param {any[]} params - 参数数组
100+
* @returns {Promise<number>} 影响的行数
101+
*/
80102
async delete(sql: string, params: any = []): Promise<number> {
81103
db._check();
82-
return new Promise((resolve, reject) => {
83-
dbConn.prepare(sql).run(...params, function (err) {
84-
if (err) {
85-
reject(err);
86-
} else {
87-
resolve(this.changes);
88-
}
89-
});
90-
});
104+
try {
105+
const result = dbConn.prepare(sql).run(...params);
106+
return result.changes;
107+
} catch (err) {
108+
throw err;
109+
}
91110
},
92111
};
93112

@@ -120,20 +139,25 @@ const migrate = async () => {
120139
}
121140
};
122141

142+
/**
143+
* 初始化数据库连接
144+
* @returns {Promise<void>}
145+
*/
123146
const init = async () => {
124147
dbPath = path.join(AppEnv.dataRoot, "database.db");
125148
const userDbPath = path.join(AppEnv.userData, "database.db");
126149
if (fs.existsSync(userDbPath)) {
127150
dbPath = userDbPath;
128151
}
129-
dbConn = new sqlite3.Database(dbPath, err => {
130-
if (err) {
131-
Log.error("DBConnect SQLite database failed:", err.message);
132-
} else {
133-
dbSuccess = true;
134-
migrate().then();
135-
}
136-
});
152+
try {
153+
dbConn = new sqlite3(dbPath);
154+
dbSuccess = true;
155+
await migrate();
156+
Log.info("Database connected successfully");
157+
} catch (err) {
158+
Log.error("DBConnect SQLite database failed:", err.message);
159+
throw err;
160+
}
137161
};
138162

139163
ipcMain.handle("db:execute", (event, sql: string, params: any) => {

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
"build:linux": "vite build && electron-builder --linux",
3434
"preview": "vite preview",
3535
"postinstall": "electron-builder install-app-deps",
36-
"postuninstall": "electron-builder install-app-deps"
36+
"postuninstall": "electron-builder install-app-deps",
37+
"re-sqlite": "npx electron-rebuild -f -w better-sqlite3"
3738
},
3839
"devDependencies": {
3940
"@arco-design/web-vue": "^2.55.3",
@@ -76,6 +77,7 @@
7677
"@xterm/addon-fit": "^0.10.0",
7778
"@xterm/xterm": "^5.5.0",
7879
"axios": "^1.7.2",
80+
"better-sqlite3": "^12.2.0",
7981
"chardet": "^2.0.0",
8082
"codemirror": "^6.0.1",
8183
"crypto": "^1.0.1",
@@ -103,7 +105,6 @@
103105
"qrcode": "^1.5.4",
104106
"showdown": "^2.1.0",
105107
"splitpanes": "^3.1.5",
106-
"sqlite3": "^5.1.7",
107108
"systeminformation": "^5.25.11",
108109
"tiny-emitter": "^2.1.0",
109110
"uiohook-napi": "^1.5.4",

0 commit comments

Comments
 (0)