mm_sqlite 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -102
- package/db.js +94 -115
- package/index.js +741 -548
- package/package.json +2 -2
- package/sql.js +245 -372
- package/sql_builder.js +0 -375
package/sql.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @author <a href="http://qww.elins.cn">邱文武</a>
|
|
4
4
|
* @version 1.2
|
|
5
5
|
*/
|
|
6
|
-
require('mm_logs');
|
|
7
6
|
const SqlString = require('sqlstring');
|
|
7
|
+
const { Base } = require('mm_expand');
|
|
8
8
|
|
|
9
9
|
function escape(value, stringifyObjects, timeZone) {
|
|
10
10
|
return SqlString.escape(value, stringifyObjects, timeZone);
|
|
@@ -18,13 +18,14 @@ function escapeId(value, forbidQualified) {
|
|
|
18
18
|
* @class 数据库语法通用类
|
|
19
19
|
* @property {Function} filter 设置并过滤参数
|
|
20
20
|
*/
|
|
21
|
-
class Sql {
|
|
21
|
+
class Sql extends Base {
|
|
22
22
|
/**
|
|
23
23
|
* @description 数据库管理器
|
|
24
24
|
* @param {Function} run 查询函数
|
|
25
25
|
* @param {Function} exec 更改函数
|
|
26
26
|
*/
|
|
27
27
|
constructor(run, exec) {
|
|
28
|
+
super();
|
|
28
29
|
/**
|
|
29
30
|
* 查询函数
|
|
30
31
|
*/
|
|
@@ -38,7 +39,7 @@ class Sql {
|
|
|
38
39
|
* @param {Object} value 值
|
|
39
40
|
* @return {String} 返回执行结果
|
|
40
41
|
*/
|
|
41
|
-
this.escape = function(value) {
|
|
42
|
+
this.escape = function (value) {
|
|
42
43
|
return escape(value);
|
|
43
44
|
};
|
|
44
45
|
|
|
@@ -47,7 +48,7 @@ class Sql {
|
|
|
47
48
|
* @param {String} key 键
|
|
48
49
|
* @return {String} 返回执行结果
|
|
49
50
|
*/
|
|
50
|
-
this.escapeId = function(key) {
|
|
51
|
+
this.escapeId = function (key) {
|
|
51
52
|
return escapeId(key);
|
|
52
53
|
};
|
|
53
54
|
|
|
@@ -152,7 +153,7 @@ class Sql {
|
|
|
152
153
|
* @description 清空查询条件
|
|
153
154
|
* @return {Object} 返回当前对象
|
|
154
155
|
*/
|
|
155
|
-
Sql.prototype.clear = function() {
|
|
156
|
+
Sql.prototype.clear = function () {
|
|
156
157
|
this.where = "";
|
|
157
158
|
this.set = "";
|
|
158
159
|
this.order = "";
|
|
@@ -173,7 +174,7 @@ Sql.prototype.clear = function() {
|
|
|
173
174
|
* @description 过滤查询参数
|
|
174
175
|
* @param {Object} query 查询参数
|
|
175
176
|
*/
|
|
176
|
-
Sql.prototype.filter = function(query) {
|
|
177
|
+
Sql.prototype.filter = function (query) {
|
|
177
178
|
var m = this.config.filter;
|
|
178
179
|
for (var k in m) {
|
|
179
180
|
var key = m[k];
|
|
@@ -191,7 +192,7 @@ Sql.prototype.filter = function(query) {
|
|
|
191
192
|
* @param {String} view 返回的字段
|
|
192
193
|
* @return {String} 返回查询条件语句
|
|
193
194
|
*/
|
|
194
|
-
Sql.prototype.toQuery = function(where, sort, view) {
|
|
195
|
+
Sql.prototype.toQuery = function (where, sort, view) {
|
|
195
196
|
var sql = "SELECT {1} FROM `{0}`";
|
|
196
197
|
if (!view) {
|
|
197
198
|
view = "*";
|
|
@@ -216,7 +217,7 @@ Sql.prototype.toQuery = function(where, sort, view) {
|
|
|
216
217
|
* @param {String} val 用作增加的值集合
|
|
217
218
|
* @return {Promise|Object} 执行结果
|
|
218
219
|
*/
|
|
219
|
-
Sql.prototype.addSql = function(key, val) {
|
|
220
|
+
Sql.prototype.addSql = function (key, val) {
|
|
220
221
|
var sql = "INSERT INTO `{0}` ({1}) VALUES ({2});";
|
|
221
222
|
sql = sql.replace("{0}", this.table).replace("{1}", key).replace("{2}", val);
|
|
222
223
|
return this.exec(sql);
|
|
@@ -226,7 +227,7 @@ Sql.prototype.addSql = function(key, val) {
|
|
|
226
227
|
* @param {String} where 删除条件
|
|
227
228
|
* @return {Promise|Object} 执行结果
|
|
228
229
|
*/
|
|
229
|
-
Sql.prototype.delSql = function(where) {
|
|
230
|
+
Sql.prototype.delSql = function (where) {
|
|
230
231
|
var sql = "DELETE FROM `{0}` WHERE {1};";
|
|
231
232
|
sql = sql.replace("{0}", this.table).replace("{1}", where);
|
|
232
233
|
return this.exec(sql);
|
|
@@ -237,7 +238,7 @@ Sql.prototype.delSql = function(where) {
|
|
|
237
238
|
* @param {String} set 修改的键值
|
|
238
239
|
* @return {Promise|Object} 执行结果
|
|
239
240
|
*/
|
|
240
|
-
Sql.prototype.setSql = function(where, set) {
|
|
241
|
+
Sql.prototype.setSql = function (where, set) {
|
|
241
242
|
var sql = "UPDATE `{0}` SET {1} WHERE {2};";
|
|
242
243
|
sql = sql.replace("{0}", this.table).replace("{1}", set).replace("{2}", where);
|
|
243
244
|
return this.exec(sql);
|
|
@@ -249,7 +250,7 @@ Sql.prototype.setSql = function(where, set) {
|
|
|
249
250
|
* @param {String} view 显示的字段
|
|
250
251
|
* @return {Promise|Array} 查询结果数组
|
|
251
252
|
*/
|
|
252
|
-
Sql.prototype.getSql = function(where, sort, view) {
|
|
253
|
+
Sql.prototype.getSql = function (where, sort, view) {
|
|
253
254
|
var sql = this.toQuery(where, sort, view);
|
|
254
255
|
return this.run(sql);
|
|
255
256
|
};
|
|
@@ -260,7 +261,7 @@ Sql.prototype.getSql = function(where, sort, view) {
|
|
|
260
261
|
* @param {String} set 修改的键值
|
|
261
262
|
* @return {Promise|Object} 执行结果
|
|
262
263
|
*/
|
|
263
|
-
Sql.prototype.addOrSetSql = async function(where, set
|
|
264
|
+
Sql.prototype.addOrSetSql = async function (where, set) {
|
|
264
265
|
if (!where || !set) {
|
|
265
266
|
return -1;
|
|
266
267
|
}
|
|
@@ -287,7 +288,7 @@ Sql.prototype.addOrSetSql = async function(where, set, like) {
|
|
|
287
288
|
* @param {String} where 查询条件
|
|
288
289
|
* @return {Promise|Number} 返回结果总数
|
|
289
290
|
*/
|
|
290
|
-
Sql.prototype.countSql = async function(where) {
|
|
291
|
+
Sql.prototype.countSql = async function (where) {
|
|
291
292
|
var sql = "SELECT count(*) count FROM `" + this.table + "`";
|
|
292
293
|
if (where) {
|
|
293
294
|
sql += ' WHERE ' + where;
|
|
@@ -307,7 +308,7 @@ Sql.prototype.countSql = async function(where) {
|
|
|
307
308
|
* @param {String} view 返回的字段
|
|
308
309
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
309
310
|
*/
|
|
310
|
-
Sql.prototype.getCountSql = async function(where, sort, view) {
|
|
311
|
+
Sql.prototype.getCountSql = async function (where, sort, view) {
|
|
311
312
|
var list = [];
|
|
312
313
|
var count = await this.countSql(where);
|
|
313
314
|
if (count > 0) {
|
|
@@ -328,7 +329,7 @@ Sql.prototype.getCountSql = async function(where, sort, view) {
|
|
|
328
329
|
* @param {String} sort 排序方式
|
|
329
330
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
330
331
|
*/
|
|
331
|
-
Sql.prototype.groupMathSql = async function(where, groupby, view, sort, method) {
|
|
332
|
+
Sql.prototype.groupMathSql = async function (where, groupby, view, sort, method) {
|
|
332
333
|
if (!view) {
|
|
333
334
|
view = "*"
|
|
334
335
|
}
|
|
@@ -370,7 +371,7 @@ Sql.prototype.groupMathSql = async function(where, groupby, view, sort, method)
|
|
|
370
371
|
* @param {String} sort 排序方式
|
|
371
372
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
372
373
|
*/
|
|
373
|
-
Sql.prototype.groupAvgSql = async function(where, groupby, view, sort = "") {
|
|
374
|
+
Sql.prototype.groupAvgSql = async function (where, groupby, view, sort = "") {
|
|
374
375
|
return await this.groupMathSql(where, groupby, view, sort, "AVG");
|
|
375
376
|
};
|
|
376
377
|
|
|
@@ -382,7 +383,7 @@ Sql.prototype.groupAvgSql = async function(where, groupby, view, sort = "") {
|
|
|
382
383
|
* @param {String} sort 排序方式
|
|
383
384
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
384
385
|
*/
|
|
385
|
-
Sql.prototype.groupSumSql = async function(where, groupby, view, sort = "") {
|
|
386
|
+
Sql.prototype.groupSumSql = async function (where, groupby, view, sort = "") {
|
|
386
387
|
return await this.groupMathSql(where, groupby, view, sort, "SUM");
|
|
387
388
|
};
|
|
388
389
|
|
|
@@ -393,7 +394,7 @@ Sql.prototype.groupSumSql = async function(where, groupby, view, sort = "") {
|
|
|
393
394
|
* @param {String} view 返回的字段
|
|
394
395
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
395
396
|
*/
|
|
396
|
-
Sql.prototype.groupCountSql = async function(where, groupby, view, sort = "") {
|
|
397
|
+
Sql.prototype.groupCountSql = async function (where, groupby, view, sort = "") {
|
|
397
398
|
return await this.groupMathSql(where, groupby, view, sort, "COUNT");
|
|
398
399
|
};
|
|
399
400
|
|
|
@@ -406,7 +407,7 @@ Sql.prototype.groupCountSql = async function(where, groupby, view, sort = "") {
|
|
|
406
407
|
* @param {String} sort 排序方式
|
|
407
408
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
408
409
|
*/
|
|
409
|
-
Sql.prototype.groupMath = async function(query, groupby, view, sort, method) {
|
|
410
|
+
Sql.prototype.groupMath = async function (query, groupby, view, sort, method) {
|
|
410
411
|
var where = this.toWhere(query, this.like);
|
|
411
412
|
return await this.groupMathSql(where, groupby, view, sort, method);
|
|
412
413
|
};
|
|
@@ -419,7 +420,7 @@ Sql.prototype.groupMath = async function(query, groupby, view, sort, method) {
|
|
|
419
420
|
* @param {String} sort 排序方式
|
|
420
421
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
421
422
|
*/
|
|
422
|
-
Sql.prototype.groupAvg = async function(query, groupby, view, sort) {
|
|
423
|
+
Sql.prototype.groupAvg = async function (query, groupby, view, sort) {
|
|
423
424
|
return await this.groupMath(query, groupby, view, sort, "AVG");
|
|
424
425
|
};
|
|
425
426
|
|
|
@@ -431,7 +432,7 @@ Sql.prototype.groupAvg = async function(query, groupby, view, sort) {
|
|
|
431
432
|
* @param {String} sort 排序方式
|
|
432
433
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
433
434
|
*/
|
|
434
|
-
Sql.prototype.groupSum = async function(query, groupby, view, sort) {
|
|
435
|
+
Sql.prototype.groupSum = async function (query, groupby, view, sort) {
|
|
435
436
|
return await this.groupMath(query, groupby, view, sort, "SUM");
|
|
436
437
|
};
|
|
437
438
|
|
|
@@ -442,7 +443,7 @@ Sql.prototype.groupSum = async function(query, groupby, view, sort) {
|
|
|
442
443
|
* @param {String} view 返回的字段
|
|
443
444
|
* @return {Promise|Object} 查询到的内容列表和符合条件总数
|
|
444
445
|
*/
|
|
445
|
-
Sql.prototype.groupCount = async function(query, groupby, view, sort) {
|
|
446
|
+
Sql.prototype.groupCount = async function (query, groupby, view, sort) {
|
|
446
447
|
return await this.groupMath(query, groupby, view, sort, "COUNT");
|
|
447
448
|
};
|
|
448
449
|
|
|
@@ -453,7 +454,7 @@ Sql.prototype.groupCount = async function(query, groupby, view, sort) {
|
|
|
453
454
|
* @param {Boolean} like 是否使用like匹配, 默认不使用
|
|
454
455
|
* @return {String} where格式sql语句字符串
|
|
455
456
|
*/
|
|
456
|
-
Sql.prototype.toWhere = function(obj, like) {
|
|
457
|
+
Sql.prototype.toWhere = function (obj, like) {
|
|
457
458
|
var where = "";
|
|
458
459
|
if (like === undefined) {
|
|
459
460
|
like = this.like;
|
|
@@ -461,7 +462,7 @@ Sql.prototype.toWhere = function(obj, like) {
|
|
|
461
462
|
if (like) {
|
|
462
463
|
for (var k in obj) {
|
|
463
464
|
var val = obj[k];
|
|
464
|
-
if (val && typeof(val) === "string") {
|
|
465
|
+
if (val && typeof (val) === "string") {
|
|
465
466
|
val = val.trim("'");
|
|
466
467
|
}
|
|
467
468
|
val = escape(val);
|
|
@@ -478,7 +479,7 @@ Sql.prototype.toWhere = function(obj, like) {
|
|
|
478
479
|
where += " and " + escapeId(k.replace('_has', '')) + " in (" + vals.join(',') + ")";
|
|
479
480
|
} else if (k.endWith('_like')) {
|
|
480
481
|
where += " and " + escapeId(k.replace('_like', '')) + " LIKE '%" + val.trim("'") + "%'";
|
|
481
|
-
} else if (typeof(val) === "string" && !/^[0-9]+$/.test(val)) {
|
|
482
|
+
} else if (typeof (val) === "string" && !/^[0-9]+$/.test(val)) {
|
|
482
483
|
where += " and " + escapeId(k) + " LIKE '%" + val.trim("'") + "%'"
|
|
483
484
|
} else {
|
|
484
485
|
where += " and " + escapeId(k) + " = " + val;
|
|
@@ -487,7 +488,7 @@ Sql.prototype.toWhere = function(obj, like) {
|
|
|
487
488
|
} else {
|
|
488
489
|
for (var k in obj) {
|
|
489
490
|
var val = obj[k];
|
|
490
|
-
if (val && typeof(val) === "string") {
|
|
491
|
+
if (val && typeof (val) === "string") {
|
|
491
492
|
val = val.trim("'");
|
|
492
493
|
}
|
|
493
494
|
val = escape(val);
|
|
@@ -515,7 +516,7 @@ Sql.prototype.toWhere = function(obj, like) {
|
|
|
515
516
|
* @param {Object} obj 用作拼接的对象
|
|
516
517
|
* @return {String} set格式sql语句字符串
|
|
517
518
|
*/
|
|
518
|
-
Sql.prototype.toSet = function(obj) {
|
|
519
|
+
Sql.prototype.toSet = function (obj) {
|
|
519
520
|
var set = "";
|
|
520
521
|
for (var k in obj) {
|
|
521
522
|
if (!Object.prototype.hasOwnProperty.call(obj, k)) continue;
|
|
@@ -546,7 +547,7 @@ Sql.prototype.toSet = function(obj) {
|
|
|
546
547
|
* @param {Object} item 用作添加的键值
|
|
547
548
|
* @return {String} sql语句
|
|
548
549
|
*/
|
|
549
|
-
Sql.prototype.toAddSql = function(item) {
|
|
550
|
+
Sql.prototype.toAddSql = function (item) {
|
|
550
551
|
if (!this.table || !item || typeof item !== 'object') {
|
|
551
552
|
throw new Error('表名或数据未设置');
|
|
552
553
|
}
|
|
@@ -573,7 +574,7 @@ Sql.prototype.toAddSql = function(item) {
|
|
|
573
574
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
574
575
|
* @return {String} sql语句
|
|
575
576
|
*/
|
|
576
|
-
Sql.prototype.toDelSql = function(query, like) {
|
|
577
|
+
Sql.prototype.toDelSql = function (query, like) {
|
|
577
578
|
if (!this.table) {
|
|
578
579
|
throw new Error('表名未设置');
|
|
579
580
|
}
|
|
@@ -589,7 +590,7 @@ Sql.prototype.toDelSql = function(query, like) {
|
|
|
589
590
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
590
591
|
* @return {String} sql语句
|
|
591
592
|
*/
|
|
592
|
-
Sql.prototype.toSetSql = function(query, item, like) {
|
|
593
|
+
Sql.prototype.toSetSql = function (query, item, like) {
|
|
593
594
|
if (!this.table) {
|
|
594
595
|
throw new Error('表名未设置');
|
|
595
596
|
}
|
|
@@ -607,7 +608,7 @@ Sql.prototype.toSetSql = function(query, item, like) {
|
|
|
607
608
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
608
609
|
* @return {String} sql语句
|
|
609
610
|
*/
|
|
610
|
-
Sql.prototype.toGetSql = function(query, sort, view, like) {
|
|
611
|
+
Sql.prototype.toGetSql = function (query, sort, view, like) {
|
|
611
612
|
var where = this.toWhere(query, like);
|
|
612
613
|
return this.toQuery(where, sort, view);
|
|
613
614
|
};
|
|
@@ -617,30 +618,21 @@ Sql.prototype.toGetSql = function(query, sort, view, like) {
|
|
|
617
618
|
* @param {Object} body 添加的对象
|
|
618
619
|
* @return {Promise|Object} 执行结果
|
|
619
620
|
*/
|
|
620
|
-
Sql.prototype.add = async function(body) {
|
|
621
|
+
Sql.prototype.add = async function (body) {
|
|
621
622
|
if (!this.table || !body || typeof body !== 'object') {
|
|
622
623
|
throw new Error('表名或数据未设置');
|
|
623
624
|
}
|
|
624
625
|
try {
|
|
625
|
-
// 触发前置事件
|
|
626
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
627
|
-
await $.eventer.run("sqlite_add_before:" + this.table, { body });
|
|
628
|
-
}
|
|
629
|
-
|
|
630
626
|
var sql = this.toAddSql(body);
|
|
631
627
|
this.sql = sql;
|
|
632
628
|
var bl = await this.exec(sql);
|
|
633
629
|
|
|
634
|
-
// 触发后置事件
|
|
635
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
636
|
-
await $.eventer.run("sqlite_add_after:" + this.table, { body, sql: this.sql, error: this.error, bl });
|
|
637
|
-
}
|
|
638
|
-
|
|
639
630
|
return bl;
|
|
640
631
|
} catch (err) {
|
|
641
632
|
this.error = err.message;
|
|
642
|
-
|
|
643
|
-
|
|
633
|
+
this.logger('error', '添加数据失败', err);
|
|
634
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
635
|
+
return 0;
|
|
644
636
|
}
|
|
645
637
|
};
|
|
646
638
|
/**
|
|
@@ -649,30 +641,21 @@ Sql.prototype.add = async function(body) {
|
|
|
649
641
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
650
642
|
* @return {Promise|Object} 执行结果
|
|
651
643
|
*/
|
|
652
|
-
Sql.prototype.del = async function(query, like) {
|
|
644
|
+
Sql.prototype.del = async function (query, like) {
|
|
653
645
|
if (!this.table) {
|
|
654
646
|
throw new Error('表名未设置');
|
|
655
647
|
}
|
|
656
648
|
try {
|
|
657
|
-
// 触发前置事件
|
|
658
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
659
|
-
await $.eventer.run("sqlite_del_before:" + this.table, { query, like });
|
|
660
|
-
}
|
|
661
|
-
|
|
662
649
|
var sql = this.toDelSql(query, like);
|
|
663
650
|
this.sql = sql;
|
|
664
651
|
var bl = await this.exec(sql);
|
|
665
652
|
|
|
666
|
-
// 触发后置事件
|
|
667
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
668
|
-
await $.eventer.run("sqlite_del_after:" + this.table, { query, like, sql: this.sql, error: this.error, bl });
|
|
669
|
-
}
|
|
670
|
-
|
|
671
653
|
return bl;
|
|
672
654
|
} catch (err) {
|
|
673
655
|
this.error = err.message;
|
|
674
|
-
|
|
675
|
-
|
|
656
|
+
this.logger('error', '删除数据失败', err);
|
|
657
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
658
|
+
return 0;
|
|
676
659
|
}
|
|
677
660
|
};
|
|
678
661
|
|
|
@@ -683,30 +666,20 @@ Sql.prototype.del = async function(query, like) {
|
|
|
683
666
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
684
667
|
* @return {Promise|Object} 执行结果
|
|
685
668
|
*/
|
|
686
|
-
Sql.prototype.set = async function(query, body, like) {
|
|
669
|
+
Sql.prototype.set = async function (query, body, like) {
|
|
687
670
|
if (!this.table || !body || typeof body !== 'object') {
|
|
688
671
|
throw new Error('表名或数据未设置');
|
|
689
672
|
}
|
|
690
673
|
try {
|
|
691
|
-
// 触发前置事件
|
|
692
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
693
|
-
await $.eventer.run("sqlite_set_before:" + this.table, { query, body, like, page: this.page, size: this.size });
|
|
694
|
-
}
|
|
695
|
-
|
|
696
674
|
var sql = this.toSetSql(query, body, like);
|
|
697
675
|
this.sql = sql;
|
|
698
676
|
var bl = await this.exec(sql);
|
|
699
|
-
|
|
700
|
-
// 触发后置事件
|
|
701
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
702
|
-
await $.eventer.run("sqlite_set_after:" + this.table, { query, body, like, page: this.page, size: this.size, sql: this.sql, error: this.error, bl });
|
|
703
|
-
}
|
|
704
|
-
|
|
705
677
|
return bl;
|
|
706
678
|
} catch (err) {
|
|
707
679
|
this.error = err.message;
|
|
708
|
-
|
|
709
|
-
|
|
680
|
+
this.logger('error', '修改数据失败', err);
|
|
681
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
682
|
+
return 0;
|
|
710
683
|
}
|
|
711
684
|
};
|
|
712
685
|
|
|
@@ -719,7 +692,7 @@ Sql.prototype.set = async function(query, body, like) {
|
|
|
719
692
|
* @param {Number} timeout 超时时间(毫秒),默认30000ms
|
|
720
693
|
* @return {Promise|Array} 查询结果
|
|
721
694
|
*/
|
|
722
|
-
Sql.prototype.get = async function(query, sort, view, like, timeout = 30000) {
|
|
695
|
+
Sql.prototype.get = async function (query, sort, view, like, timeout = 30000) {
|
|
723
696
|
if (!this.table) {
|
|
724
697
|
throw new Error('表名未设置');
|
|
725
698
|
}
|
|
@@ -733,62 +706,19 @@ Sql.prototype.get = async function(query, sort, view, like, timeout = 30000) {
|
|
|
733
706
|
// 使用Promise.race实现超时控制
|
|
734
707
|
return await Promise.race([
|
|
735
708
|
(async () => {
|
|
736
|
-
// 安全触发事件,避免事件系统问题影响核心功能
|
|
737
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
738
|
-
try {
|
|
739
|
-
// 添加超时保护的事件触发
|
|
740
|
-
await Promise.race([
|
|
741
|
-
$.eventer.run("sqlite_get_before:" + this.table, {
|
|
742
|
-
query,
|
|
743
|
-
sort,
|
|
744
|
-
view,
|
|
745
|
-
like,
|
|
746
|
-
page: this.page,
|
|
747
|
-
size: this.size
|
|
748
|
-
}),
|
|
749
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('事件处理超时')), 5000))
|
|
750
|
-
]);
|
|
751
|
-
} catch (eventError) {
|
|
752
|
-
$.log.warn(`事件处理失败,但不影响查询: ${eventError.message}`);
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
|
|
756
709
|
// 生成SQL并执行
|
|
757
710
|
var sql = this.toGetSql(query, sort, view, like);
|
|
758
711
|
this.sql = sql;
|
|
759
712
|
var list = await this.run(sql);
|
|
760
|
-
|
|
761
|
-
// 安全触发后置事件
|
|
762
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
763
|
-
try {
|
|
764
|
-
// 添加超时保护的事件触发
|
|
765
|
-
await Promise.race([
|
|
766
|
-
$.eventer.run("sqlite_get_after:" + this.table, {
|
|
767
|
-
query,
|
|
768
|
-
sort,
|
|
769
|
-
view,
|
|
770
|
-
like,
|
|
771
|
-
page: this.page,
|
|
772
|
-
size: this.size,
|
|
773
|
-
sql: this.sql,
|
|
774
|
-
error: this.error,
|
|
775
|
-
list
|
|
776
|
-
}),
|
|
777
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('事件处理超时')), 5000))
|
|
778
|
-
]);
|
|
779
|
-
} catch (eventError) {
|
|
780
|
-
$.log.warn(`事件处理失败,但不影响查询返回: ${eventError.message}`);
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
|
|
784
713
|
return list;
|
|
785
714
|
})(),
|
|
786
715
|
timeoutPromise
|
|
787
716
|
]);
|
|
788
717
|
} catch (err) {
|
|
789
718
|
this.error = err.message;
|
|
790
|
-
|
|
791
|
-
|
|
719
|
+
this.logger('error', '查询数据失败', err);
|
|
720
|
+
// 返回空数组作为默认值,保持返回值类型一致
|
|
721
|
+
return [];
|
|
792
722
|
}
|
|
793
723
|
};
|
|
794
724
|
|
|
@@ -806,7 +736,7 @@ Sql.prototype.get = async function(query, sort, view, like, timeout = 30000) {
|
|
|
806
736
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
807
737
|
* @return {Promise<Object>} 执行结果
|
|
808
738
|
*/
|
|
809
|
-
Sql.prototype.addOrSet = async function(where, set, like) {
|
|
739
|
+
Sql.prototype.addOrSet = async function (where, set, like) {
|
|
810
740
|
if (!this.table || !where || !set) {
|
|
811
741
|
throw new Error('表名、条件或数据未设置');
|
|
812
742
|
}
|
|
@@ -837,11 +767,6 @@ Sql.prototype.addOrSet = async function(where, set, like) {
|
|
|
837
767
|
}
|
|
838
768
|
}
|
|
839
769
|
} else {
|
|
840
|
-
// 触发前置事件
|
|
841
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function' && typeof body === "object") {
|
|
842
|
-
await $.eventer.run("sqlite_add_before:" + this.table, { body });
|
|
843
|
-
}
|
|
844
|
-
|
|
845
770
|
for (const k in set) {
|
|
846
771
|
if (!Object.prototype.hasOwnProperty.call(set, k)) continue;
|
|
847
772
|
|
|
@@ -856,35 +781,21 @@ Sql.prototype.addOrSet = async function(where, set, like) {
|
|
|
856
781
|
|
|
857
782
|
const bl = await this.addSql(key.replace(",", ""), value.replace(",", ""));
|
|
858
783
|
|
|
859
|
-
// 触发后置事件
|
|
860
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function' && typeof body === "object") {
|
|
861
|
-
await $.eventer.run("sqlite_add_after:" + this.table, { body, sql: this.sql, error: this.error, bl });
|
|
862
|
-
}
|
|
863
|
-
|
|
864
784
|
return bl;
|
|
865
785
|
} else {
|
|
866
|
-
// 触发前置事件
|
|
867
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function' && typeof set === "object") {
|
|
868
|
-
await $.eventer.run("sqlite_set_before:" + this.table, { query, body, like, page: this.page, size: this.size, sql: this.sql });
|
|
869
|
-
}
|
|
870
|
-
|
|
871
786
|
if (typeof set === "object") {
|
|
872
787
|
set = await this.toSet(set);
|
|
873
788
|
}
|
|
874
789
|
|
|
875
790
|
const bl1 = await this.setSql(whereStr, set);
|
|
876
791
|
|
|
877
|
-
// 触发后置事件
|
|
878
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function' && typeof body === "object") {
|
|
879
|
-
await $.eventer.run("sqlite_set_after:" + this.table, { query, body, like, page: this.page, size: this.size, sql: this.sql, error: this.error, bl: bl1 });
|
|
880
|
-
}
|
|
881
|
-
|
|
882
792
|
return bl1;
|
|
883
793
|
}
|
|
884
794
|
} catch (err) {
|
|
885
795
|
this.error = err.message;
|
|
886
|
-
|
|
887
|
-
|
|
796
|
+
this.logger('error', '添加或修改数据失败', err);
|
|
797
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
798
|
+
return 0;
|
|
888
799
|
}
|
|
889
800
|
};
|
|
890
801
|
|
|
@@ -895,7 +806,7 @@ Sql.prototype.addOrSet = async function(where, set, like) {
|
|
|
895
806
|
* @param {Number} timeout 超时时间(毫秒),默认30000ms
|
|
896
807
|
* @return {Promise|Number} 记录数
|
|
897
808
|
*/
|
|
898
|
-
Sql.prototype.count = async function(query, like, timeout = 30000) {
|
|
809
|
+
Sql.prototype.count = async function (query, like, timeout = 30000) {
|
|
899
810
|
if (!this.table) {
|
|
900
811
|
throw new Error('表名未设置');
|
|
901
812
|
}
|
|
@@ -908,18 +819,6 @@ Sql.prototype.count = async function(query, like, timeout = 30000) {
|
|
|
908
819
|
|
|
909
820
|
return await Promise.race([
|
|
910
821
|
(async () => {
|
|
911
|
-
// 安全触发事件
|
|
912
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
913
|
-
try {
|
|
914
|
-
await Promise.race([
|
|
915
|
-
$.eventer.run("sqlite_count_before:" + this.table, { query, like }),
|
|
916
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('事件处理超时')), 5000))
|
|
917
|
-
]);
|
|
918
|
-
} catch (eventError) {
|
|
919
|
-
$.log.warn(`事件处理失败,但不影响统计: ${eventError.message}`);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
|
|
923
822
|
// 正确生成count SQL
|
|
924
823
|
const where = typeof query === 'string' ? query : await this.toWhere(query, like);
|
|
925
824
|
const sql = "SELECT COUNT(*) as num FROM `" + this.table + "`" + (where ? " WHERE " + where : "");
|
|
@@ -927,32 +826,15 @@ Sql.prototype.count = async function(query, like, timeout = 30000) {
|
|
|
927
826
|
const list = await this.run(sql);
|
|
928
827
|
const total = list && list[0] && list[0].num ? parseInt(list[0].num) : 0;
|
|
929
828
|
|
|
930
|
-
// 安全触发事件
|
|
931
|
-
if (typeof $.eventer === 'object' && typeof $.eventer.run === 'function') {
|
|
932
|
-
try {
|
|
933
|
-
await Promise.race([
|
|
934
|
-
$.eventer.run("sqlite_count_after:" + this.table, {
|
|
935
|
-
query,
|
|
936
|
-
like,
|
|
937
|
-
sql: this.sql,
|
|
938
|
-
error: this.error,
|
|
939
|
-
total
|
|
940
|
-
}),
|
|
941
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('事件处理超时')), 5000))
|
|
942
|
-
]);
|
|
943
|
-
} catch (eventError) {
|
|
944
|
-
$.log.warn(`事件处理失败,但不影响统计返回: ${eventError.message}`);
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
948
829
|
return total;
|
|
949
830
|
})(),
|
|
950
831
|
timeoutPromise
|
|
951
832
|
]);
|
|
952
833
|
} catch (err) {
|
|
953
834
|
this.error = err.message;
|
|
954
|
-
|
|
955
|
-
|
|
835
|
+
this.logger('error', '统计记录数失败', err);
|
|
836
|
+
// 返回0作为默认统计值,保持返回值类型一致
|
|
837
|
+
return 0;
|
|
956
838
|
}
|
|
957
839
|
};
|
|
958
840
|
|
|
@@ -963,7 +845,7 @@ Sql.prototype.count = async function(query, like, timeout = 30000) {
|
|
|
963
845
|
* @param {Number} timeout 超时时间(毫秒),默认30000ms
|
|
964
846
|
* @return {Promise<Number>} 记录数
|
|
965
847
|
*/
|
|
966
|
-
Sql.prototype.getCount = async function(query, like, timeout = 30000) {
|
|
848
|
+
Sql.prototype.getCount = async function (query, like, timeout = 30000) {
|
|
967
849
|
return await this.count(query, like, timeout);
|
|
968
850
|
};
|
|
969
851
|
|
|
@@ -971,12 +853,11 @@ Sql.prototype.getCount = async function(query, like, timeout = 30000) {
|
|
|
971
853
|
/**
|
|
972
854
|
* @description 添加多条数据
|
|
973
855
|
* @param {Array} list 对象数组
|
|
974
|
-
* @param {
|
|
975
|
-
* @param {Number} batchSize 批量大小,默认100
|
|
856
|
+
* @param {Number} batch_size 批量大小,默认100
|
|
976
857
|
* @param {Number} timeout 超时时间,默认60000毫秒
|
|
977
858
|
* @return {Promise|Object} 执行结果
|
|
978
859
|
*/
|
|
979
|
-
Sql.prototype.addList = async function(list,
|
|
860
|
+
Sql.prototype.addList = async function (list, batch_size = 100, timeout = 60000) {
|
|
980
861
|
if (!this.table || !Array.isArray(list) || list.length === 0) {
|
|
981
862
|
throw new Error('表名或数据列表未设置');
|
|
982
863
|
}
|
|
@@ -989,20 +870,20 @@ Sql.prototype.addList = async function(list, lock = true, batchSize = 100, timeo
|
|
|
989
870
|
return await Promise.race([
|
|
990
871
|
(async () => {
|
|
991
872
|
// 如果数据量较小,直接处理
|
|
992
|
-
if (list.length <=
|
|
873
|
+
if (list.length <= batch_size) {
|
|
993
874
|
// 使用批量插入语法,不使用事务包装
|
|
994
875
|
this.sql = this.toBatchAddSql(list);
|
|
995
876
|
return await this.exec(this.sql);
|
|
996
877
|
}
|
|
997
878
|
|
|
998
879
|
// 分批处理大数据量
|
|
999
|
-
const totalBatches = Math.ceil(list.length /
|
|
1000
|
-
$.log.info(`开始分批添加数据,共${totalBatches}批,每批${
|
|
880
|
+
const totalBatches = Math.ceil(list.length / batch_size);
|
|
881
|
+
$.log.info(`开始分批添加数据,共${totalBatches}批,每批${batch_size}条`);
|
|
1001
882
|
|
|
1002
883
|
// 分批执行,每批一个单独的批量插入语句
|
|
1003
884
|
let finalResult = null;
|
|
1004
885
|
for (let i = 0; i < totalBatches; i++) {
|
|
1005
|
-
const batch = list.slice(i *
|
|
886
|
+
const batch = list.slice(i * batch_size, (i + 1) * batch_size);
|
|
1006
887
|
$.log.debug(`处理第${i + 1}/${totalBatches}批数据,${batch.length}条`);
|
|
1007
888
|
|
|
1008
889
|
// 生成批量插入SQL
|
|
@@ -1024,12 +905,9 @@ Sql.prototype.addList = async function(list, lock = true, batchSize = 100, timeo
|
|
|
1024
905
|
timeoutPromise
|
|
1025
906
|
]);
|
|
1026
907
|
} catch (error) {
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
list_length: list.length
|
|
1031
|
-
});
|
|
1032
|
-
throw error;
|
|
908
|
+
this.logger('error', '批量添加数据失败', error);
|
|
909
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
910
|
+
return 0;
|
|
1033
911
|
}
|
|
1034
912
|
};
|
|
1035
913
|
|
|
@@ -1038,7 +916,7 @@ Sql.prototype.addList = async function(list, lock = true, batchSize = 100, timeo
|
|
|
1038
916
|
* @param {Array} list 数据列表
|
|
1039
917
|
* @return {String} 批量插入SQL语句
|
|
1040
918
|
*/
|
|
1041
|
-
Sql.prototype.toBatchAddSql = function(list) {
|
|
919
|
+
Sql.prototype.toBatchAddSql = function (list) {
|
|
1042
920
|
if (!this.table || !Array.isArray(list) || list.length === 0) {
|
|
1043
921
|
throw new Error('表名或数据列表未设置');
|
|
1044
922
|
}
|
|
@@ -1060,7 +938,7 @@ Sql.prototype.toBatchAddSql = function(list) {
|
|
|
1060
938
|
const columns = keys.join(',');
|
|
1061
939
|
|
|
1062
940
|
// 构建值部分
|
|
1063
|
-
const
|
|
941
|
+
const values = [];
|
|
1064
942
|
for (const item of list) {
|
|
1065
943
|
const values = [];
|
|
1066
944
|
for (const k of keys) {
|
|
@@ -1071,11 +949,11 @@ Sql.prototype.toBatchAddSql = function(list) {
|
|
|
1071
949
|
}
|
|
1072
950
|
values.push(this.escape(val));
|
|
1073
951
|
}
|
|
1074
|
-
|
|
952
|
+
values.push(`(${values.join(',')})`);
|
|
1075
953
|
}
|
|
1076
954
|
|
|
1077
955
|
// 生成最终SQL
|
|
1078
|
-
const sql = `INSERT INTO \`${this.table}\` (${columns}) VALUES ${
|
|
956
|
+
const sql = `INSERT INTO \`${this.table}\` (${columns}) VALUES ${values.join(',')}`;
|
|
1079
957
|
return sql;
|
|
1080
958
|
};
|
|
1081
959
|
|
|
@@ -1083,11 +961,11 @@ Sql.prototype.toBatchAddSql = function(list) {
|
|
|
1083
961
|
* 删除多条数据
|
|
1084
962
|
* @param {Array} list 对象数组
|
|
1085
963
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
1086
|
-
* @param {Number}
|
|
964
|
+
* @param {Number} batch_size 每批处理数量,默认100
|
|
1087
965
|
* @param {Number} timeout 超时时间(毫秒),默认60000
|
|
1088
966
|
* @return {Promise<Object>} 执行结果
|
|
1089
967
|
*/
|
|
1090
|
-
Sql.prototype.delList = async function(list, like,
|
|
968
|
+
Sql.prototype.delList = async function (list, like, batch_size = 100, timeout = 60000) {
|
|
1091
969
|
if (!this.table || !Array.isArray(list) || list.length === 0) {
|
|
1092
970
|
throw new Error('表名或数据列表未设置');
|
|
1093
971
|
}
|
|
@@ -1100,7 +978,7 @@ Sql.prototype.delList = async function(list, like, batchSize = 100, timeout = 60
|
|
|
1100
978
|
return await Promise.race([
|
|
1101
979
|
(async () => {
|
|
1102
980
|
// 如果数据量较小,直接处理
|
|
1103
|
-
if (list.length <=
|
|
981
|
+
if (list.length <= batch_size) {
|
|
1104
982
|
let sql = "";
|
|
1105
983
|
for (const item of list) {
|
|
1106
984
|
sql += this.toDelSql(item.query, like);
|
|
@@ -1110,8 +988,8 @@ Sql.prototype.delList = async function(list, like, batchSize = 100, timeout = 60
|
|
|
1110
988
|
}
|
|
1111
989
|
|
|
1112
990
|
// 分批处理大数据量
|
|
1113
|
-
const totalBatches = Math.ceil(list.length /
|
|
1114
|
-
$.log.info(`开始分批删除数据,共${totalBatches}批,每批${
|
|
991
|
+
const totalBatches = Math.ceil(list.length / batch_size);
|
|
992
|
+
$.log.info(`开始分批删除数据,共${totalBatches}批,每批${batch_size}条`);
|
|
1115
993
|
|
|
1116
994
|
// 使用事务包装整个操作以保证原子性
|
|
1117
995
|
let finalResult = null;
|
|
@@ -1121,7 +999,7 @@ Sql.prototype.delList = async function(list, like, batchSize = 100, timeout = 60
|
|
|
1121
999
|
|
|
1122
1000
|
// 分批处理
|
|
1123
1001
|
for (let i = 0; i < totalBatches; i++) {
|
|
1124
|
-
const batch = list.slice(i *
|
|
1002
|
+
const batch = list.slice(i * batch_size, (i + 1) * batch_size);
|
|
1125
1003
|
$.log.debug(`处理第${i + 1}/${totalBatches}批数据,${batch.length}条`);
|
|
1126
1004
|
|
|
1127
1005
|
let batchSql = "";
|
|
@@ -1144,11 +1022,12 @@ Sql.prototype.delList = async function(list, like, batchSize = 100, timeout = 60
|
|
|
1144
1022
|
// 发生错误时回滚事务
|
|
1145
1023
|
try {
|
|
1146
1024
|
await this.exec("ROLLBACK;", 15000);
|
|
1147
|
-
|
|
1025
|
+
this.logger('error', '批量删除数据失败,事务已回滚', error);
|
|
1148
1026
|
} catch (rollbackError) {
|
|
1149
|
-
|
|
1027
|
+
this.logger('error', '批量删除数据失败,事务回滚也失败', rollbackError);
|
|
1150
1028
|
}
|
|
1151
|
-
|
|
1029
|
+
// 记录错误日志
|
|
1030
|
+
this.logger('error', 'SQL语句执行失败', error);
|
|
1152
1031
|
}
|
|
1153
1032
|
|
|
1154
1033
|
$.log.success(`批量删除数据完成,共${list.length}条`);
|
|
@@ -1157,20 +1036,20 @@ Sql.prototype.delList = async function(list, like, batchSize = 100, timeout = 60
|
|
|
1157
1036
|
timeoutPromise
|
|
1158
1037
|
]);
|
|
1159
1038
|
} catch (err) {
|
|
1160
|
-
this.error
|
|
1161
|
-
|
|
1162
|
-
|
|
1039
|
+
this.logger('error', '批量删除数据失败', err);
|
|
1040
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
1041
|
+
return 0;
|
|
1163
1042
|
}
|
|
1164
1043
|
};
|
|
1165
1044
|
/**
|
|
1166
1045
|
* 更新多条数据
|
|
1167
1046
|
* @param {Array} list 对象数组
|
|
1168
1047
|
* @param {Boolean} like 是否使用like匹配, 为空使用默认方式
|
|
1169
|
-
* @param {Number}
|
|
1048
|
+
* @param {Number} batch_size 每批处理数量,默认100
|
|
1170
1049
|
* @param {Number} timeout 超时时间(毫秒),默认60000
|
|
1171
1050
|
* @return {Promise<Object>} 执行结果
|
|
1172
1051
|
*/
|
|
1173
|
-
Sql.prototype.setList = async function(list, like = false,
|
|
1052
|
+
Sql.prototype.setList = async function (list, like = false, batch_size = 100, timeout = 60000) {
|
|
1174
1053
|
if (!this.table || !Array.isArray(list) || list.length === 0) {
|
|
1175
1054
|
throw new Error('表名或数据列表未设置');
|
|
1176
1055
|
}
|
|
@@ -1183,7 +1062,7 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1183
1062
|
return await Promise.race([
|
|
1184
1063
|
(async () => {
|
|
1185
1064
|
// 如果数据量较小,直接处理
|
|
1186
|
-
if (list.length <=
|
|
1065
|
+
if (list.length <= batch_size) {
|
|
1187
1066
|
let sql = "";
|
|
1188
1067
|
for (const item of list) {
|
|
1189
1068
|
sql += this.toSetSql(item.query, item.obj, like);
|
|
@@ -1193,8 +1072,8 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1193
1072
|
}
|
|
1194
1073
|
|
|
1195
1074
|
// 分批处理大数据量
|
|
1196
|
-
const totalBatches = Math.ceil(list.length /
|
|
1197
|
-
$.log.info(`开始分批更新数据,共${totalBatches}批,每批${
|
|
1075
|
+
const totalBatches = Math.ceil(list.length / batch_size);
|
|
1076
|
+
$.log.info(`开始分批更新数据,共${totalBatches}批,每批${batch_size}条`);
|
|
1198
1077
|
|
|
1199
1078
|
// 使用事务包装整个操作以保证原子性
|
|
1200
1079
|
let finalResult = null;
|
|
@@ -1204,7 +1083,7 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1204
1083
|
|
|
1205
1084
|
// 分批处理
|
|
1206
1085
|
for (let i = 0; i < totalBatches; i++) {
|
|
1207
|
-
const batch = list.slice(i *
|
|
1086
|
+
const batch = list.slice(i * batch_size, (i + 1) * batch_size);
|
|
1208
1087
|
$.log.debug(`处理第${i + 1}/${totalBatches}批数据,${batch.length}条`);
|
|
1209
1088
|
|
|
1210
1089
|
let batchSql = "";
|
|
@@ -1227,11 +1106,10 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1227
1106
|
// 发生错误时回滚事务
|
|
1228
1107
|
try {
|
|
1229
1108
|
await this.exec("ROLLBACK;", 15000);
|
|
1230
|
-
|
|
1109
|
+
this.logger('error', '批量更新数据失败,事务已回滚', error);
|
|
1231
1110
|
} catch (rollbackError) {
|
|
1232
|
-
|
|
1111
|
+
this.logger('error', '批量更新数据失败,事务回滚也失败', rollbackError);
|
|
1233
1112
|
}
|
|
1234
|
-
throw error;
|
|
1235
1113
|
}
|
|
1236
1114
|
|
|
1237
1115
|
$.log.success(`批量更新数据完成,共${list.length}条`);
|
|
@@ -1240,9 +1118,9 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1240
1118
|
timeoutPromise
|
|
1241
1119
|
]);
|
|
1242
1120
|
} catch (err) {
|
|
1243
|
-
this.error
|
|
1244
|
-
|
|
1245
|
-
|
|
1121
|
+
this.logger('error', '批量更新数据失败', err);
|
|
1122
|
+
// 返回默认操作结果对象,保持返回值类型一致
|
|
1123
|
+
return 0;
|
|
1246
1124
|
}
|
|
1247
1125
|
};
|
|
1248
1126
|
|
|
@@ -1253,7 +1131,7 @@ Sql.prototype.setList = async function(list, like = false, batchSize = 100, time
|
|
|
1253
1131
|
* @param {Object} sqlDt sql模板集合
|
|
1254
1132
|
* @return {Bool} 有则返回true,没有则返回false
|
|
1255
1133
|
*/
|
|
1256
|
-
Sql.prototype.hasParam = function(paramDt, sqlDt) {
|
|
1134
|
+
Sql.prototype.hasParam = function (paramDt, sqlDt) {
|
|
1257
1135
|
var bl = false;
|
|
1258
1136
|
for (var key in sqlDt) {
|
|
1259
1137
|
var value = paramDt[key];
|
|
@@ -1271,7 +1149,7 @@ Sql.prototype.hasParam = function(paramDt, sqlDt) {
|
|
|
1271
1149
|
* @param {Object} sqlDt sql模板集合
|
|
1272
1150
|
* @return {Bool} 没有模板则返回名称,都有则返回undefined
|
|
1273
1151
|
*/
|
|
1274
|
-
Sql.prototype.notParam = function(paramDt, sqlDt) {
|
|
1152
|
+
Sql.prototype.notParam = function (paramDt, sqlDt) {
|
|
1275
1153
|
var name;
|
|
1276
1154
|
for (var key in paramDt) {
|
|
1277
1155
|
if (!sqlDt[key]) {
|
|
@@ -1288,7 +1166,7 @@ Sql.prototype.notParam = function(paramDt, sqlDt) {
|
|
|
1288
1166
|
* @param {Object} sqlDt sql模板集合
|
|
1289
1167
|
* @return {Object} 返回过滤后的参数集合
|
|
1290
1168
|
*/
|
|
1291
|
-
Sql.prototype.filterParam = function(paramDt, sqlDt) {
|
|
1169
|
+
Sql.prototype.filterParam = function (paramDt, sqlDt) {
|
|
1292
1170
|
var dt = [];
|
|
1293
1171
|
for (var key in paramDt) {
|
|
1294
1172
|
if (!sqlDt[key]) {
|
|
@@ -1304,7 +1182,7 @@ Sql.prototype.filterParam = function(paramDt, sqlDt) {
|
|
|
1304
1182
|
* @param {Object} sqlDt 模板集合
|
|
1305
1183
|
* @return {String} 返回拼接的查询参数
|
|
1306
1184
|
*/
|
|
1307
|
-
Sql.prototype.tplQuery = function(paramDt, sqlDt) {
|
|
1185
|
+
Sql.prototype.tplQuery = function (paramDt, sqlDt) {
|
|
1308
1186
|
var sql = "";
|
|
1309
1187
|
if (sqlDt) {
|
|
1310
1188
|
var l = this.config.separator;
|
|
@@ -1388,7 +1266,7 @@ Sql.prototype.tplQuery = function(paramDt, sqlDt) {
|
|
|
1388
1266
|
* @param {Object} sqlDt 模板集合
|
|
1389
1267
|
* @return {String} 返回拼接的查询参数
|
|
1390
1268
|
*/
|
|
1391
|
-
Sql.prototype.tplBody = function(paramDt, sqlDt) {
|
|
1269
|
+
Sql.prototype.tplBody = function (paramDt, sqlDt) {
|
|
1392
1270
|
var sql = "";
|
|
1393
1271
|
if (!sqlDt || sqlDt.length === 0) {
|
|
1394
1272
|
for (var key in paramDt) {
|
|
@@ -1412,11 +1290,11 @@ Sql.prototype.tplBody = function(paramDt, sqlDt) {
|
|
|
1412
1290
|
* @param {Object} obj 模型对象
|
|
1413
1291
|
* @return {Object} 返回监听操作的对象
|
|
1414
1292
|
*/
|
|
1415
|
-
Sql.prototype.model = function(model) {
|
|
1293
|
+
Sql.prototype.model = function (model) {
|
|
1416
1294
|
var _this = this;
|
|
1417
1295
|
return new Proxy(model, {
|
|
1418
|
-
set: function(obj, prop, value) {
|
|
1419
|
-
if (typeof(value) === "number") {
|
|
1296
|
+
set: function (obj, prop, value) {
|
|
1297
|
+
if (typeof (value) === "number") {
|
|
1420
1298
|
var n = obj[prop];
|
|
1421
1299
|
var cha = value - n;
|
|
1422
1300
|
if (cha > 0) {
|
|
@@ -1451,7 +1329,7 @@ Sql.prototype.model = function(model) {
|
|
|
1451
1329
|
* @param {Number} timeout 超时时间(毫秒),默认30000ms
|
|
1452
1330
|
* @return {Promise|Object|null} 查询结果
|
|
1453
1331
|
*/
|
|
1454
|
-
Sql.prototype.getObj = async function(query, sort, view, like, timeout = 30000) {
|
|
1332
|
+
Sql.prototype.getObj = async function (query, sort, view, like, timeout = 30000) {
|
|
1455
1333
|
try {
|
|
1456
1334
|
// 保存当前分页设置
|
|
1457
1335
|
const oldPage = this.page;
|
|
@@ -1479,9 +1357,9 @@ Sql.prototype.getObj = async function(query, sort, view, like, timeout = 30000)
|
|
|
1479
1357
|
return obj;
|
|
1480
1358
|
} catch (err) {
|
|
1481
1359
|
this.error = err.message;
|
|
1482
|
-
|
|
1483
|
-
throw err;
|
|
1360
|
+
this.logger('error', '查询单条数据失败', err);
|
|
1484
1361
|
}
|
|
1362
|
+
return null;
|
|
1485
1363
|
};
|
|
1486
1364
|
|
|
1487
1365
|
|
|
@@ -1492,72 +1370,65 @@ Sql.prototype.getObj = async function(query, sort, view, like, timeout = 30000)
|
|
|
1492
1370
|
* @returns {Promise<boolean>} 是否加载成功
|
|
1493
1371
|
*/
|
|
1494
1372
|
Sql.prototype.load = async function (file) {
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
error: error.message,
|
|
1555
|
-
file: file
|
|
1556
|
-
});
|
|
1557
|
-
|
|
1558
|
-
// 抛出错误
|
|
1559
|
-
throw error;
|
|
1560
|
-
}
|
|
1373
|
+
try {
|
|
1374
|
+
// 记录操作日志
|
|
1375
|
+
if (this.config && this.config.debug) {
|
|
1376
|
+
$.log.debug(`[${this.constructor.name}] [load] 开始从文件加载数据库`, {
|
|
1377
|
+
file: file
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
// 检查文件是否存在
|
|
1382
|
+
if (!file.hasFile()) {
|
|
1383
|
+
throw new Error(`SQL文件不存在: ${file}`);
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
// 读取SQL文件内容
|
|
1387
|
+
const sqlContent = await $.file.readText(file);
|
|
1388
|
+
|
|
1389
|
+
if (!sqlContent || sqlContent.trim() === '') {
|
|
1390
|
+
throw new Error(`SQL文件内容为空: ${file}`);
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
// 分割SQL语句(按分号分割,但需要注意处理字符串中的分号)
|
|
1394
|
+
const sqlStatements = this._splitSqlStatements(sqlContent);
|
|
1395
|
+
|
|
1396
|
+
// 开始事务执行SQL语句
|
|
1397
|
+
await this.exec('BEGIN TRANSACTION');
|
|
1398
|
+
|
|
1399
|
+
try {
|
|
1400
|
+
// 逐个执行SQL语句
|
|
1401
|
+
for (const sql of sqlStatements) {
|
|
1402
|
+
const trimmedSql = sql.trim();
|
|
1403
|
+
if (trimmedSql) {
|
|
1404
|
+
await this.exec(trimmedSql);
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
// 提交事务
|
|
1409
|
+
await this.exec('COMMIT');
|
|
1410
|
+
|
|
1411
|
+
if (this.config && this.config.debug) {
|
|
1412
|
+
$.log.info(`[${this.constructor.name}] [load] 数据库加载成功`, {
|
|
1413
|
+
file: file,
|
|
1414
|
+
statementCount: sqlStatements.length
|
|
1415
|
+
});
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
return true;
|
|
1419
|
+
} catch (err) {
|
|
1420
|
+
// 回滚事务
|
|
1421
|
+
await this.exec('ROLLBACK').catch(rollbackErr => {
|
|
1422
|
+
this.logger('error', '事务回滚失败', rollbackErr);
|
|
1423
|
+
});
|
|
1424
|
+
|
|
1425
|
+
// 记录错误日志
|
|
1426
|
+
this.logger('error', 'SQL语句执行失败', err);
|
|
1427
|
+
}
|
|
1428
|
+
} catch (error) {
|
|
1429
|
+
// 记录错误日志
|
|
1430
|
+
this.logger('error', '数据库加载失败', error);
|
|
1431
|
+
}
|
|
1561
1432
|
};
|
|
1562
1433
|
|
|
1563
1434
|
/**
|
|
@@ -1566,84 +1437,86 @@ Sql.prototype.load = async function (file) {
|
|
|
1566
1437
|
* @param {String} sqlContent - SQL内容
|
|
1567
1438
|
* @returns {Array} SQL语句数组
|
|
1568
1439
|
*/
|
|
1569
|
-
Sql.prototype._splitSqlStatements = function(sqlContent) {
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1440
|
+
Sql.prototype._splitSqlStatements = function (sqlContent) {
|
|
1441
|
+
const statements = [];
|
|
1442
|
+
let inString = false;
|
|
1443
|
+
let stringChar = '';
|
|
1444
|
+
let inComment = false;
|
|
1445
|
+
let currentStatement = '';
|
|
1446
|
+
|
|
1447
|
+
for (let i = 0; i < sqlContent.length; i++) {
|
|
1448
|
+
const char = sqlContent[i];
|
|
1449
|
+
const nextChar = i + 1 < sqlContent.length ? sqlContent[i + 1] : '';
|
|
1450
|
+
|
|
1451
|
+
// 处理注释
|
|
1452
|
+
if (!inString && !inComment && char === '-' && nextChar === '-') {
|
|
1453
|
+
inComment = true;
|
|
1454
|
+
i++; // 跳过第二个'-'
|
|
1455
|
+
continue;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
if (inComment && char === '\n') {
|
|
1459
|
+
inComment = false;
|
|
1460
|
+
continue;
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
if (inComment) {
|
|
1464
|
+
continue;
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
// 处理多行注释
|
|
1468
|
+
if (!inString && !inComment && char === '/' && nextChar === '*') {
|
|
1469
|
+
inComment = true;
|
|
1470
|
+
i++; // 跳过'*'
|
|
1471
|
+
continue;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
if (inComment && char === '*' && nextChar === '/') {
|
|
1475
|
+
inComment = false;
|
|
1476
|
+
i++; // 跳过'/'
|
|
1477
|
+
continue;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
// 处理字符串
|
|
1481
|
+
if (!inComment && (char === "'" || char === '"') && (!inString || stringChar === char)) {
|
|
1482
|
+
// 检查是否是转义的引号
|
|
1483
|
+
let escaped = false;
|
|
1484
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
1485
|
+
if (sqlContent[j] === '\\') {
|
|
1486
|
+
escaped = !escaped;
|
|
1487
|
+
} else {
|
|
1488
|
+
break;
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
if (!escaped) {
|
|
1493
|
+
if (inString && stringChar === char) {
|
|
1494
|
+
inString = false;
|
|
1495
|
+
stringChar = '';
|
|
1496
|
+
} else if (!inString) {
|
|
1497
|
+
inString = true;
|
|
1498
|
+
stringChar = char;
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
// 分割语句
|
|
1504
|
+
if (!inString && !inComment && char === ';') {
|
|
1505
|
+
statements.push(currentStatement.trim());
|
|
1506
|
+
currentStatement = '';
|
|
1507
|
+
} else {
|
|
1508
|
+
currentStatement += char;
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
// 添加最后一个语句(如果有)
|
|
1513
|
+
if (currentStatement.trim()) {
|
|
1514
|
+
statements.push(currentStatement.trim());
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
return statements;
|
|
1647
1518
|
};
|
|
1648
1519
|
|
|
1649
|
-
module.exports =
|
|
1520
|
+
module.exports = {
|
|
1521
|
+
Sql
|
|
1522
|
+
};
|