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.
Files changed (6) hide show
  1. package/README.md +168 -102
  2. package/db.js +94 -115
  3. package/index.js +741 -548
  4. package/package.json +2 -2
  5. package/sql.js +245 -372
  6. 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, like) {
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
- $.log.error(`添加数据失败: ${err.message}`);
643
- throw err;
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
- $.log.error(`删除数据失败: ${err.message}`);
675
- throw err;
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
- $.log.error(`修改数据失败: ${err.message}`);
709
- throw err;
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
- $.log.error(`查询数据失败: ${err.message}`);
791
- throw err;
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
- $.log.error(`添加或修改数据失败: ${err.message}`);
887
- throw err;
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
- $.log.error(`统计记录数失败: ${err.message}`, { sql: this.sql });
955
- throw err;
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 {Boolean} lock 是否锁定
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, lock = true, batchSize = 100, timeout = 60000) {
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 <= batchSize) {
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 / batchSize);
1000
- $.log.info(`开始分批添加数据,共${totalBatches}批,每批${batchSize}条`);
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 * batchSize, (i + 1) * batchSize);
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
- $.log.error(`[${this.constructor.name}] [addList]`, '批量添加数据失败', {
1028
- error: error.message,
1029
- table: this.table,
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 valuesList = [];
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
- valuesList.push(`(${values.join(',')})`);
952
+ values.push(`(${values.join(',')})`);
1075
953
  }
1076
954
 
1077
955
  // 生成最终SQL
1078
- const sql = `INSERT INTO \`${this.table}\` (${columns}) VALUES ${valuesList.join(',')}`;
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} batchSize 每批处理数量,默认100
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, batchSize = 100, timeout = 60000) {
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 <= batchSize) {
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 / batchSize);
1114
- $.log.info(`开始分批删除数据,共${totalBatches}批,每批${batchSize}条`);
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 * batchSize, (i + 1) * batchSize);
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
- $.log.error(`批量删除数据失败,事务已回滚: ${error.message}`);
1025
+ this.logger('error', '批量删除数据失败,事务已回滚', error);
1148
1026
  } catch (rollbackError) {
1149
- $.log.error(`批量删除数据失败,事务回滚也失败: ${rollbackError.message}`);
1027
+ this.logger('error', '批量删除数据失败,事务回滚也失败', rollbackError);
1150
1028
  }
1151
- throw error;
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 = err.message;
1161
- $.log.error(`批量删除数据失败: ${err.message}`);
1162
- throw err;
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} batchSize 每批处理数量,默认100
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, batchSize = 100, timeout = 60000) {
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 <= batchSize) {
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 / batchSize);
1197
- $.log.info(`开始分批更新数据,共${totalBatches}批,每批${batchSize}条`);
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 * batchSize, (i + 1) * batchSize);
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
- $.log.error(`批量更新数据失败,事务已回滚: ${error.message}`);
1109
+ this.logger('error', '批量更新数据失败,事务已回滚', error);
1231
1110
  } catch (rollbackError) {
1232
- $.log.error(`批量更新数据失败,事务回滚也失败: ${rollbackError.message}`);
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 = err.message;
1244
- $.log.error(`批量更新数据失败: ${err.message}`);
1245
- throw err;
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
- $.log.error(`查询单条数据失败: ${err.message}`, { sql: this.sql });
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
- try {
1496
- // 记录操作日志
1497
- if (this.config && this.config.debug) {
1498
- $.log.debug(`[${this.constructor.name}] [load] 开始从文件加载数据库`, {
1499
- file: file
1500
- });
1501
- }
1502
-
1503
- // 检查文件是否存在
1504
- if (!file.hasFile()) {
1505
- throw new Error(`SQL文件不存在: ${file}`);
1506
- }
1507
-
1508
- // 读取SQL文件内容
1509
- const sqlContent = await $.file.readText(file);
1510
-
1511
- if (!sqlContent || sqlContent.trim() === '') {
1512
- throw new Error(`SQL文件内容为空: ${file}`);
1513
- }
1514
-
1515
- // 分割SQL语句(按分号分割,但需要注意处理字符串中的分号)
1516
- const sqlStatements = this._splitSqlStatements(sqlContent);
1517
-
1518
- // 开始事务执行SQL语句
1519
- await this.exec('BEGIN TRANSACTION');
1520
-
1521
- try {
1522
- // 逐个执行SQL语句
1523
- for (const sql of sqlStatements) {
1524
- const trimmedSql = sql.trim();
1525
- if (trimmedSql) {
1526
- await this.exec(trimmedSql);
1527
- }
1528
- }
1529
-
1530
- // 提交事务
1531
- await this.exec('COMMIT');
1532
-
1533
- if (this.config && this.config.debug) {
1534
- $.log.info(`[${this.constructor.name}] [load] 数据库加载成功`, {
1535
- file: file,
1536
- statementCount: sqlStatements.length
1537
- });
1538
- }
1539
-
1540
- return true;
1541
- } catch (err) {
1542
- // 回滚事务
1543
- await this.exec('ROLLBACK').catch(rollbackErr => {
1544
- $.log.error(`[${this.constructor.name}] [load] 事务回滚失败`, {
1545
- error: rollbackErr.message
1546
- });
1547
- });
1548
-
1549
- throw err;
1550
- }
1551
- } catch (error) {
1552
- // 记录错误日志
1553
- $.log.error(`[${this.constructor.name}] [load] 数据库加载失败`, {
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
- const statements = [];
1571
- let inString = false;
1572
- let stringChar = '';
1573
- let inComment = false;
1574
- let currentStatement = '';
1575
-
1576
- for (let i = 0; i < sqlContent.length; i++) {
1577
- const char = sqlContent[i];
1578
- const nextChar = i + 1 < sqlContent.length ? sqlContent[i + 1] : '';
1579
-
1580
- // 处理注释
1581
- if (!inString && !inComment && char === '-' && nextChar === '-') {
1582
- inComment = true;
1583
- i++; // 跳过第二个'-'
1584
- continue;
1585
- }
1586
-
1587
- if (inComment && char === '\n') {
1588
- inComment = false;
1589
- continue;
1590
- }
1591
-
1592
- if (inComment) {
1593
- continue;
1594
- }
1595
-
1596
- // 处理多行注释
1597
- if (!inString && !inComment && char === '/' && nextChar === '*') {
1598
- inComment = true;
1599
- i++; // 跳过'*'
1600
- continue;
1601
- }
1602
-
1603
- if (inComment && char === '*' && nextChar === '/') {
1604
- inComment = false;
1605
- i++; // 跳过'/'
1606
- continue;
1607
- }
1608
-
1609
- // 处理字符串
1610
- if (!inComment && (char === "'" || char === '"') && (!inString || stringChar === char)) {
1611
- // 检查是否是转义的引号
1612
- let escaped = false;
1613
- for (let j = i - 1; j >= 0; j--) {
1614
- if (sqlContent[j] === '\\') {
1615
- escaped = !escaped;
1616
- } else {
1617
- break;
1618
- }
1619
- }
1620
-
1621
- if (!escaped) {
1622
- if (inString && stringChar === char) {
1623
- inString = false;
1624
- stringChar = '';
1625
- } else if (!inString) {
1626
- inString = true;
1627
- stringChar = char;
1628
- }
1629
- }
1630
- }
1631
-
1632
- // 分割语句
1633
- if (!inString && !inComment && char === ';') {
1634
- statements.push(currentStatement.trim());
1635
- currentStatement = '';
1636
- } else {
1637
- currentStatement += char;
1638
- }
1639
- }
1640
-
1641
- // 添加最后一个语句(如果有)
1642
- if (currentStatement.trim()) {
1643
- statements.push(currentStatement.trim());
1644
- }
1645
-
1646
- return statements;
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 = Sql;
1520
+ module.exports = {
1521
+ Sql
1522
+ };