mm_sql 1.3.6 → 1.3.8

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/index.js CHANGED
@@ -1,696 +1,239 @@
1
- /**
2
- * @fileOverview sql语句帮助类函数
3
- * @author <a href="http://qww.elins.cn">邱文武</a>
4
- * @version 1.2
5
- */
6
- require('mm_expand');
7
-
8
- /**
9
- * @class 数据库语法通用类
10
- * @property {Function} filter 设置并过滤参数
11
- */
12
- class Sql {
13
- /**
14
- * @description 数据库管理器
15
- * @param {Function} run 查询函数
16
- * @param {Function} exec 更改函数
17
- */
18
- constructor(run, exec) {
19
- /**
20
- * 查询函数
21
- */
22
- this.run = run;
23
- /**
24
- * 更改函数 用于增删改
25
- */
26
- this.exec = exec;
27
-
28
- /**
29
- * sql语句
30
- */
31
- this.sql = "";
32
- /**
33
- * 错误提示
34
- */
35
- this.error;
36
- /**
37
- * 查询结果
38
- */
39
- this.results = [];
40
-
41
- /**
42
- * 表名
43
- */
44
- this.table = "";
45
- /**
46
- * 显示页
47
- */
48
- this.page = 0;
49
- /**
50
- * 显示条数
51
- */
52
- this.size = 30;
53
- /**
54
- * 请求方式 add、del、set、get、import、export等,跟函数名一致
55
- */
56
- this.method = "";
57
-
58
- /**
59
- * 显示的字段
60
- */
61
- this.field = "";
62
-
63
- /**
64
- * 排序方式
65
- */
66
- this.orderby = "";
67
-
68
- /**
69
- * 是否统计查询结果数
70
- */
71
- this.count_ret = "false";
72
-
73
- /**
74
- * 过滤查询参数字典
75
- */
76
- this.config = {
77
- /**
78
- * 分隔符 用于查询时的多条件处理
79
- */
80
- "separator": "|",
81
- /**
82
- * 过滤
83
- */
84
- "filter": {
85
- /**
86
- * 表名
87
- */
88
- "table": "table",
89
- /**
90
- * 查询的页码
91
- */
92
- "page": "page",
93
- /**
94
- * 查询每页条数
95
- */
96
- "size": "size",
97
- /**
98
- * 操作方式: 传入参数method=add, 支持参数 add增、del删、set改、get查,为空则为get
99
- */
100
- "method": "method",
101
- /**
102
- * 排序
103
- */
104
- "orderby": "orderby",
105
- /**
106
- * 查询显示的字段
107
- */
108
- "field": "field",
109
- /**
110
- * 统计结果: 统计符合条件的结果数,只有当page等于1或0时才会统计
111
- */
112
- "count_ret": "count_ret"
113
- }
114
- };
115
- }
116
- }
117
-
118
- /**
119
- * @description 清理存储的数据
120
- */
121
- Sql.prototype.clear = async function() {
122
- this.run = run;
123
- this.exec = exec;
124
- this.sql = "";
125
- this.error;
126
- this.results = [];
127
- this.table = "";
128
- this.page = 0;
129
- this.size = 30;
130
- this.method = "";
131
- this.field = "";
132
- this.orderby = "";
133
- this.count_ret = "false";
134
- };
135
-
136
- /**
137
- * @description 过滤查询参数
138
- * @param {Object} query 查询参数
139
- */
140
- Sql.prototype.filter = function(query) {
141
- var m = this.config.filter;
142
- for (var k in m) {
143
- var key = m[k];
144
- if (query[key]) {
145
- this[k] = query[key];
146
- delete query[key];
147
- }
148
- }
149
- };
150
-
151
- /**
152
- * @description 查询条件拼接
153
- * @param {String} where 查询条件
154
- * @param {String} sort 排序
155
- * @param {String} view 返回的字段
156
- * @return {String} 返回查询条件语句
157
- */
158
- Sql.prototype.toQuery = function(where, sort, view) {
159
- var sql = "SELECT {1} FROM `{0}`";
160
- if (!view) {
161
- view = "*";
162
- }
163
- if (where) {
164
- sql += " WHERE " + where;
165
- }
166
- if (sort) {
167
- sql += " ORDER BY " + sort;
168
- }
169
- sql = sql.replace("{0}", this.table).replace("{1}", view);
170
- if (this.size && this.page) {
171
- var start = this.size * (this.page - 1);
172
- sql += " limit " + start + ',' + this.size;
173
- }
174
- return sql;
175
- };
176
- /* === 传字符串参数 === */
177
- /**
178
- * @description 增加数据
179
- * @param {String} key 用作增加的键集合
180
- * @param {String} val 用作增加的值集合
181
- * @return {Promise|Object} 执行结果
182
- */
183
- Sql.prototype.addSql = function(key, val) {
184
- var sql = "INSERT INTO `{0}` ({1}) VALUES ({2});";
185
- sql = sql.replace("{0}", this.table).replace("{1}", key).replace("{2}", val);
186
- return this.exec(sql);
187
- };
188
- /**
189
- * @description 删除数据
190
- * @param {String} where 删除条件
191
- * @return {Promise|Object} 执行结果
192
- */
193
- Sql.prototype.delSql = function(where) {
194
- var sql = "DELETE FROM `{0}` WHERE {1};";
195
- sql = sql.replace("{0}", this.table).replace("{1}", where);
196
- return this.exec(sql);
197
- };
198
- /**
199
- * 修改数据
200
- * @param {String} where 查询条件
201
- * @param {String} set 修改的键值
202
- * @return {Promise|Object} 执行结果
203
- */
204
- Sql.prototype.setSql = function(where, set) {
205
- var sql = "UPDATE `{0}` SET {1} WHERE {2};";
206
- sql = sql.replace("{0}", this.table).replace("{1}", set).replace("{2}", where);
207
- return this.exec(sql);
208
- };
209
- /**
210
- * @description 查询数据
211
- * @param {String} where 查询条件
212
- * @param {String} sort 排序
213
- * @param {String} view 显示的字段
214
- * @return {Promise|Array} 查询结果数组
215
- */
216
- Sql.prototype.getSql = function(where, sort, view) {
217
- var sql = this.toQuery(where, sort, view);
218
- return this.run(sql);
219
- };
220
-
221
- /**
222
- * @description 添加或修改
223
- * @param {String} where 查询条件
224
- * @param {String} set 修改的键值
225
- * @return {Promise|Object} 执行结果
226
- */
227
- Sql.prototype.addOrSetSql = async function(where, set) {
228
- if (!where || !set) {
229
- return -1;
230
- }
231
- var count = await this.countSql(where);
232
- if (count === 0) {
233
- var arr = set.split(',');
234
- var key = "";
235
- var value = "";
236
- arr.map(function(o) {
237
- var ar = o.split('=');
238
- if (ar.length === 2) {
239
- key += "," + ar[0];
240
- value += "," + ar[1];
241
- }
242
- });
243
- return await this.addSql(key.replace(',', ''), value.replace(',', ''));
244
- }
245
- return await this.setSql(where, set);
246
- };
247
-
248
- /**
249
- * @description 查询符合结果总数
250
- * @param {String} where 查询条件
251
- * @return {Promise|Number} 返回结果总数
252
- */
253
- Sql.prototype.countSql = async function(where) {
254
- var sql = "SELECT count(*) count FROM `" + this.table + "`";
255
- if (where) {
256
- sql += ' WHERE ' + where;
257
- }
258
- var n = 0;
259
- var arr = await this.run(sql);
260
- if (arr.length) {
261
- n = arr[0].count;
262
- }
263
- return n;
264
- };
265
- /**
266
- * @description 查询数据并返回符合条件总数
267
- * @param {String} where 查询条件
268
- * @param {String} sort 排序
269
- * @param {String} view 返回的字段
270
- * @return {Promise|Object} 查询到的内容列表和符合条件总数
271
- */
272
- Sql.prototype.getCountSql = async function(where, sort, view) {
273
- var list = [];
274
- var count = await this.countSql(where);
275
- if (count > 0) {
276
- list = await this.getSql(where, sort, view);
277
- }
278
- var ret = {
279
- list: list,
280
- count: count
281
- };
282
- return ret;
283
- };
284
- /* === sql语句拼接函数 === */
285
- ///
286
- /**
287
- * @description 转为where语句
288
- * @param {Object} obj 用作拼接的对象
289
- * @return {String} where格式sql语句字符串
290
- */
291
- Sql.prototype.toWhere = function(obj) {
292
- var where = "";
293
- for (var k in obj) {
294
- where += " and `" + k + "`='" + obj[k] + "'";
295
- }
296
- return where.replace(" and ", "");
297
- };
298
- /**
299
- * @description 转为set语句
300
- * @param {Object} obj 用作拼接的对象
301
- * @return {String} set格式sql语句字符串
302
- */
303
- Sql.prototype.toSet = function(obj) {
304
- var set = "";
305
- for (var k in obj) {
306
- set += ",`" + k + "`='" + obj[k] + "'";
307
- }
308
- return set.replace(",", "");
309
- };
310
-
311
- /**
312
- * @description 转添加sql语句
313
- * @param {Object} item 用作添加的键值
314
- * @return {String} sql语句
315
- */
316
- Sql.prototype.toAddSql = function(item) {
317
- var key = "";
318
- var val = "";
319
- for (var k in item) {
320
- key += ",`" + k + "`";
321
- val += ",'" + item[k] + "'";
322
- }
323
- var sql = "INSERT INTO `{0}` ({1}) VALUES ({2});";
324
- return sql.replace("{0}", this.table).replace("{1}", key.replace(",", "")).replace("{2}", val.replace(",", ""));
325
- };
326
-
327
- /**
328
- * @description 转删除sql语句
329
- * @param {Object} query 查询键值
330
- * @return {String} sql语句
331
- */
332
- Sql.prototype.toDelSql = function(query) {
333
- var where = this.toWhere(query);
334
- var sql = "DELETE FROM `{0}` WHERE {1};";
335
- return sql.replace("{0}", this.table).replace("{1}", where);
336
- };
337
-
338
- /**
339
- * @description 转修改sql语句
340
- * @param {Object} query 查询的键值集合
341
- * @param {Object} item 修改的键值集合
342
- * @return {String} sql语句
343
- */
344
- Sql.prototype.toSetSql = function(query, item) {
345
- var where = this.toWhere(query);
346
- var set = this.toSet(item);
347
- var sql = "UPDATE `{0}` SET {1} WHERE {2};";
348
- return sql.replace("{0}", this.table).replace("{1}", set).replace("{2}", where);
349
- };
350
-
351
- /**
352
- * @description 转查询sql语句
353
- * @param {Object} query 查询键值集合
354
- * @param {String} sort 排序规则
355
- * @param {String} view 显示的字段
356
- * @return {String} sql语句
357
- */
358
- Sql.prototype.toGetSql = function(query, sort, view) {
359
- var where = this.toWhere(query);
360
- var sql = this.toQuery(where, sort, view);
361
- return sql;
362
- };
363
- /* === 传入对象操作 === */
364
- /**
365
- * @description 增加数据
366
- * @param {Object} item 添加的对象
367
- * @return {Promise|Object} 执行结果
368
- */
369
- Sql.prototype.add = function(item) {
370
- var sql = this.toAddSql(item);
371
- return this.exec(sql);
372
- };
373
- /**
374
- * @description 删除数据
375
- * @param {Object} query 查询条件集合
376
- * @return {Promise|Object} 执行结果
377
- */
378
- Sql.prototype.del = function(query) {
379
- var sql = this.toDelSql(query);
380
- return this.exec(sql);
381
- };
382
-
383
- /**
384
- * @description 修改数据
385
- * @param {Object} query 查询条件集合
386
- * @param {Object} item 修改的键值集合
387
- * @return {Promise|Object} 执行结果
388
- */
389
- Sql.prototype.set = function(query, item) {
390
- var sql = this.toSetSql(query, item);
391
- return this.exec(sql);
392
- };
393
-
394
- /**
395
- * @description 查询数据
396
- * @param {Object} query 查询条件
397
- * @param {String} sort 排序
398
- * @param {String} view 返回的字段
399
- * @return {Promise|Array} 查询结果
400
- */
401
- Sql.prototype.get = function(query, sort, view) {
402
- var sql = this.toGetSql(query, sort, view);
403
- return this.run(sql);
404
- };
405
-
406
- /**
407
- * @description 添加或修改
408
- * @param {Object} where 查询条件集合
409
- * @param {Object} set 修改的键值
410
- * @return {Promise|Object} 执行结果
411
- */
412
- Sql.prototype.addOrSet = async function(where, set) {
413
- return await this.addOrSetSql(this.toWhere(where), this.toSet(set));
414
- };
415
-
416
- /**
417
- * @description 查询符合结果总数
418
- * @param {Object} query 查询条件集合
419
- * @return {Promise|Number} 查询结果
420
- */
421
- Sql.prototype.count = function(query) {
422
- return this.countSql(this.toWhere(query));
423
- };
424
-
425
- /**
426
- * @description 查询数据并返回符合条件总数
427
- * @param {Object} query 查询条件
428
- * @param {String} sort 排序
429
- * @param {String} view 返回的字段
430
- * @return {Promise|Object} 查询到的内容列表和符合条件总数
431
- */
432
- Sql.prototype.getCount = async function(query, sort, view) {
433
- return this.getCountSql(this.toWhere(query), sort, view);
434
- };
435
-
436
- /* === 传入数组操作 === */
437
- /**
438
- * @description 添加多条数据
439
- * @param {Array} list 对象数组
440
- * @return {Promise|Object} 执行结果
441
- */
442
- Sql.prototype.addList = function(list) {
443
- var sql = "START TRANSACTION;\n";
444
- var len = list.length;
445
- for (var i = 0; i < len; i++) {
446
- sql += this.toAddSql(list[i]);
447
- }
448
- return this.exec(sql);
449
- };
450
- /**
451
- * @description 删除多条数据
452
- * @param {Array} list 对象数组
453
- * @return {Promise|Object} 执行结果
454
- */
455
- Sql.prototype.delList = function(list) {
456
- var sql = "";
457
- var len = list.length;
458
- for (var i = 0; i < len; i++) {
459
- sql += this.toDelSql(list[i].query);
460
- }
461
- return this.exec(sql);
462
- };
463
- /**
464
- * @description 修改多条数据
465
- * @param {Array} list 对象数组
466
- * @return {Promise|Object} 执行结果
467
- */
468
- Sql.prototype.setList = function(list) {
469
- var sql = "";
470
- var len = list.length;
471
- for (var i = 0; i < len; i++) {
472
- sql += this.toSetSql(list[i].query, list[i].item);
473
- }
474
- return this.exec(sql);
475
- };
476
-
477
- /* 辅助类 */
478
- /**
479
- * @description 判断SQL模板是否包含某些参数
480
- * @param {Object} paramDt 参数集合
481
- * @param {Object} sqlDt sql模板集合
482
- * @return {Bool} 有则返回true,没有则返回false
483
- */
484
- Sql.prototype.has_param = function(paramDt, sqlDt) {
485
- var bl = false;
486
- for (var key in sqlDt) {
487
- if (paramDt[key] !== undefined && paramDt[key] !== null && paramDt[key] !== '') {
488
- bl = true;
489
- break;
490
- }
491
- }
492
- return bl;
493
- };
494
-
495
- /**
496
- * @description 判断某些参数是否没有SQL模板
497
- * @param {Object} paramDt 参数集合
498
- * @param {Object} sqlDt sql模板集合
499
- * @return {Bool} 没有模板则返回名称,都有则返回undefined
500
- */
501
- Sql.prototype.not_param = function(paramDt, sqlDt) {
502
- var name;
503
- for (var key in paramDt) {
504
- if (!sqlDt[key]) {
505
- name = key;
506
- break;
507
- }
508
- }
509
- return name;
510
- };
511
-
512
- /**
513
- * @description 过滤参数,仅保留没有sql模板的参数
514
- * @param {Object} paramDt 参数集合
515
- * @param {Object} sqlDt sql模板集合
516
- * @return {Object} 返回过滤后的参数集合
517
- */
518
- Sql.prototype.filter_param = function(paramDt, sqlDt) {
519
- var dt = [];
520
- for (var key in paramDt) {
521
- if (!sqlDt[key]) {
522
- dt.Add(key, o.Value);
523
- }
524
- }
525
- return dt;
526
- };
527
-
528
- /**
529
- * @description 通过模板拼接查询参数
530
- * @param {Object} paramDt 参数集合
531
- * @param {Object} sqlDt 模板集合
532
- * @return {String} 返回拼接的查询参数
533
- */
534
- Sql.prototype.tpl_query = function(paramDt, sqlDt) {
535
- var sql = "";
536
- if(sqlDt){
537
- var l = this.config.separator;
538
- if (l) {
539
- for (var key in paramDt) {
540
- var value = paramDt[key] + '';
541
- var arr = value.split(l);
542
- var tpl = sqlDt[key];
543
- if (tpl) {
544
- if (arr.length > 1) {
545
- // 如果数量大于0,则增加多条件
546
- var sl = "(";
547
- var len = arr.length;
548
- for (var i = 0; i < len; i++) {
549
- sl += " || " + tpl.replaceAll("{0}", arr[i]);
550
- }
551
- sl = sl.replace(" || ", "") + ")";
552
- sql += " && " + sl;
553
- } else {
554
- sql += " && " + tpl.replaceAll("{0}", value);
555
- }
556
- } else {
557
- if (arr.length > 1) {
558
- // 如果数量大于0,则增加多条件
559
- var sl = "(";
560
- var len = arr.length;
561
- for (var i = 0; i < len; i++) {
562
- sl += " || `" + key + "` = '" + arr[i] + "'";
563
- }
564
- sl = sl.replace(" || ", "") + ")";
565
- sql += " && " + sl;
566
- } else {
567
- sql += " && `" + key + "` = '" + value + "'";
568
- }
569
- }
570
- }
571
- } else {
572
- for (var key in paramDt) {
573
- if (sqlDt[key]) {
574
- sql += " && " + sqlDt[key].replaceAll("{0}", paramDt[key]);
575
- } else {
576
- sql += " && `" + key + "` = '" + paramDt[key] + "'";
577
- }
578
- }
579
- }
580
- }
581
- else {
582
- // 如果没有模板,则直接拼接参数
583
- var l = this.config.separator;
584
- if (l) {
585
- // 使用分隔数组拼接
586
- for (var key in paramDt) {
587
- var arr = paramDt[key].split(l);
588
- if (arr.length > 1) {
589
- // 如果数量大于0,则增加多条件
590
- var sl = "(";
591
- var len = arr.length;
592
- for (var i = 0; i < len; i++) {
593
- sl += " || `" + key + "` = '" + arr[i] + "'";
594
- }
595
- sl = sl.replace(" || ", "") + ")";
596
- sql += " && " + sl;
597
- } else {
598
- sql += " && `" + key + "` = '" + paramDt[key] + "'";
599
- }
600
- }
601
- } else {
602
- // 直接拼接
603
- for (var key in paramDt) {
604
- sql += " && `" + key + "` = '" + paramDt[key] + "'";
605
- }
606
- }
607
- }
608
- return sql.replace(" && ", "");
609
- };
610
-
611
- /**
612
- * @description 通过模板拼接修改参数
613
- * @param {Object} paramDt 参数集合
614
- * @param {Object} sqlDt 模板集合
615
- * @return {String} 返回拼接的查询参数
616
- */
617
- Sql.prototype.tpl_body = function(paramDt, sqlDt) {
618
- var sql = "";
619
- if (!sqlDt || sqlDt.length === 0) {
620
- for (var key in paramDt) {
621
- sql += " , `" + key + "` = '" + val[key];
622
- }
623
- } else {
624
- for (var key in paramDt) {
625
- if (sqlDt[key]) {
626
- sql += " , " + sqlDt[key].replace("{0}", paramDt[key]).replace('+ -', '- ').replace('- -', '+ ');
627
- } else {
628
- sql += " , `" + key + "` = '" + paramDt[key] + "'";
629
- }
630
- }
631
- }
632
- return sql.replace(" , ", "");
633
- };
634
-
635
- /**
636
- * @description 构建实体模型
637
- * @param {Object} obj 模型对象
638
- * @return {Object} 返回监听操作的对象
639
- */
640
- Sql.prototype.model = function(model) {
641
- var _this = this;
642
- return new Proxy(model, {
643
- set: function(obj, prop, value) {
644
- if (typeof(value) === "number") {
645
- var n = obj[prop];
646
- var cha = value - n;
647
- if (cha > 0) {
648
- _this.setSql("`" + _this.key + "`=" + obj[_this.key] + "", "`" + prop + "`=`" + prop + "` + " + cha);
649
- } else if (cha < 0) {
650
- _this.setSql("`" + _this.key + "`=" + obj[_this.key] + "", "`" + prop + "`=`" + prop + "` - " + (-cha));
651
- } else {
652
- _this.setSql("`" + _this.key + "`=" + obj[_this.key] + "", "`" + prop + "`=" + value);
653
- }
654
- } else {
655
- var query = {};
656
- query[_this.key] = obj[_this.key];
657
- var set = {};
658
- set[prop] = value;
659
- _this.set(query, set);
660
- }
661
- obj[prop] = value;
662
- return obj;
663
- }
664
- });
665
- };
666
-
667
- /**
668
- * @description 查询一条数据
669
- * @param {Object} query 查询条件
670
- * @param {String} sort 排序
671
- * @param {String} view 返回的字段
672
- * @return {Promise|Array} 查询结果
673
- */
674
- Sql.prototype.getObj = async function(query, sort, view) {
675
- this.page = 1;
676
- this.size = 1;
677
- if (this.key) {
678
- if (view && view.indexOf(this.key) === -1 && view.indexOf('*') === -1) {
679
- view += ",`" + this.key + "`";
680
- }
681
- }
682
- var sql = this.toGetSql(query, sort, view);
683
- var list = await this.run(sql);
684
- if (list.length > 0) {
685
- var obj = list[0];
686
- if (this.key) {
687
- return this.model(obj);
688
- } else {
689
- return obj;
690
- }
691
- } else {
692
- return null;
693
- }
694
- };
695
-
696
- module.exports = Sql;
1
+ /**
2
+ * @fileOverview SQL通用类
3
+ * @author <a href="http://qww.elins.cn">邱文武</a>
4
+ * @version 1.0
5
+ */
6
+
7
+ /**
8
+ * @class 数据库SQL类
9
+ */
10
+ class Sql {
11
+ /**
12
+ * @constructor
13
+ * @param {Object} config - 配置对象
14
+ */
15
+ constructor(config) {
16
+ /**
17
+ * 配置信息
18
+ */
19
+ this.config = Object.assign({
20
+ db_type: 'mysql'
21
+ }, config || {});
22
+
23
+ /**
24
+ * SQL适配器
25
+ */
26
+ this._adapter = null;
27
+
28
+ // 初始化
29
+ this._init();
30
+ }
31
+ }
32
+
33
+ /**
34
+ * 初始化
35
+ * @private
36
+ */
37
+ Sql.prototype._init = function () {
38
+ this._createSqlAdapter();
39
+ };
40
+
41
+ /**
42
+ * 创建SQL适配器
43
+ * @private
44
+ */
45
+ Sql.prototype._createSqlAdapter = function () {
46
+ const adapterModule = `mm_${this.config.db_type}`;
47
+ const adapter = require(adapterModule);
48
+
49
+ // 根据数据库类型选择不同的初始化方式
50
+ if (this.config.db_type === 'mysql') {
51
+ // 创建MySQL实例
52
+ const Mysql = adapter.Mysql;
53
+ this._adapter = new Mysql(this.config);
54
+ } else if (this.config.db_type === 'sqlite') {
55
+ // SQLite应该有类似的结构
56
+ const Sqlite = adapter.Sqlite;
57
+ this._adapter = new Sqlite(this.config);
58
+ } else {
59
+ // 其他数据库类型直接使用Sql类(如果存在)
60
+ const AdapterClass = adapter.Sql;
61
+ if (AdapterClass) {
62
+ this._adapter = new AdapterClass(this.config);
63
+ } else {
64
+ throw new Error(`不支持的数据库类型: ${this.config.db_type}`);
65
+ }
66
+ }
67
+ };
68
+
69
+ /**
70
+ * 执行查询操作
71
+ * @param {String|Object} sql - SQL语句或选项对象
72
+ * @param {Array} params - 参数数组
73
+ * @param {Number} timeout - 超时时间(毫秒)
74
+ * @returns {Promise} 查询结果
75
+ */
76
+ Sql.prototype.run = function (sql, params = [], timeout = null) {
77
+ // 支持两种调用方式:run(sql, params, timeout) 或 run({sql: '', params: []})
78
+ if (typeof sql === 'object') {
79
+ params = sql.params || [];
80
+ timeout = sql.timeout || null;
81
+ sql = sql.sql || '';
82
+ }
83
+ return this._adapter.run(sql, params, timeout);
84
+ };
85
+
86
+ /**
87
+ * 执行修改操作
88
+ * @param {String|Object} sql - SQL语句或选项对象
89
+ * @param {Array} params - 参数数组
90
+ * @param {Number} timeout - 超时时间(毫秒)
91
+ * @returns {Promise} 修改结果
92
+ */
93
+ Sql.prototype.exec = function (sql, params = [], timeout = null) {
94
+ // 支持两种调用方式:exec(sql, params, timeout) 或 exec({sql: '', params: []})
95
+ if (typeof sql === 'object') {
96
+ params = sql.params || [];
97
+ timeout = sql.timeout || null;
98
+ sql = sql.sql || '';
99
+ }
100
+ return this._adapter.exec(sql, params, timeout);
101
+ };
102
+
103
+ /**
104
+ * 打开数据库连接
105
+ * @returns {Promise} 连接结果
106
+ */
107
+ Sql.prototype.open = function () {
108
+ return this._adapter.open();
109
+ };
110
+
111
+ /**
112
+ * 关闭数据库连接
113
+ * @returns {Promise} 关闭结果
114
+ */
115
+ Sql.prototype.close = function () {
116
+ return this._adapter.close();
117
+ };
118
+
119
+ /**
120
+ * 设置配置
121
+ * @param {Object} config - 配置对象
122
+ */
123
+ Sql.prototype.setConfig = function (config) {
124
+ this.config = Object.assign(this.config, config);
125
+ this._init();
126
+ };
127
+
128
+ /**
129
+ * 获取连接信息
130
+ * @returns {Object} 连接信息
131
+ */
132
+ Sql.prototype.getConnectionInfo = function () {
133
+ // 确保返回包含必要字段的连接信息
134
+ return {
135
+ db_type: this.config.db_type,
136
+ host: this.config.host || 'localhost',
137
+ port: this.config.port || 3306,
138
+ database: this.config.database || ''
139
+ };
140
+ };
141
+
142
+ /**
143
+ * 检查数据库连接状态
144
+ * @returns {Boolean} 连接状态
145
+ */
146
+ Sql.prototype.isConnected = function () {
147
+ // 简单实现,返回true表示连接正常
148
+ return true;
149
+ };
150
+
151
+ /**
152
+ * 获取标识符
153
+ * @private
154
+ * @param {String} name - 名称
155
+ * @returns {String} 标识符
156
+ */
157
+ Sql.prototype._getIdentifier = function (name) {
158
+ const dbType = this.config.db_type;
159
+ switch (dbType) {
160
+ case 'mysql':
161
+ return `\`${name}\``;
162
+ case 'sqlite':
163
+ return `"${name}"`;
164
+ default:
165
+ return name;
166
+ }
167
+ };
168
+
169
+ /**
170
+ * 执行模板查询
171
+ * @param {Object} paramDt - 参数对象
172
+ * @param {Object} sqlDt - SQL模板对象
173
+ * @returns {Object} 查询结果对象
174
+ */
175
+ Sql.prototype.tplQuery = function (paramDt, sqlDt) {
176
+ let sql = '';
177
+
178
+ for (const key in paramDt) {
179
+ if (sqlDt[key]) {
180
+ // 替换占位符{0}为参数值
181
+ const sqlSegment = sqlDt[key].replace(/\{0\}/g, paramDt[key]);
182
+ sql += 'AND ' + sqlSegment + ' ';
183
+ }
184
+ else {
185
+ sql += 'AND `' + key + "` = '" + paramDt[key] + "'";
186
+ }
187
+ }
188
+
189
+ return sql.replace('AND ', '');
190
+ };
191
+
192
+ /**
193
+ * 执行模板查询(仅返回数据部分)
194
+ * @param {Object} paramDt - 参数对象
195
+ * @param {Object} sqlDt - SQL模板对象
196
+ * @returns {Object} 查询结果对象
197
+ */
198
+ Sql.prototype.tplBody = function (paramDt, sqlDt) {
199
+ let sql = '';
200
+
201
+ for (const key in paramDt) {
202
+ if (sqlDt[key]) {
203
+ // 替换占位符{0}为参数值
204
+ const sqlSegment = sqlDt[key].replace(/\{0\}/g, paramDt[key]);
205
+ sql += ', ' + sqlSegment + ' ';
206
+ }
207
+ else {
208
+ sql += ', `' + key + "` = '" + paramDt[key] + "'";
209
+ }
210
+ }
211
+
212
+ return sql.replace(', ', '');
213
+ };
214
+
215
+ /**
216
+ * 过滤参数对象中的指定键
217
+ * @param {Object} paramDt - 参数对象
218
+ * @param {Array} arr - 过滤数组
219
+ * @returns {Object} 过滤后的参数对象
220
+ */
221
+ Sql.prototype.filter = function (paramDt, arr) {
222
+ for (const key in paramDt) {
223
+ if (arr.includes(key)) {
224
+ delete paramDt[key];
225
+ }
226
+ }
227
+ return paramDt;
228
+ };
229
+
230
+ /**
231
+ * 获取新数据库管理器
232
+ * @returns {Object} 新数据库管理器
233
+ */
234
+ Sql.prototype.db = function () {
235
+ return this._adapter.db();
236
+ };
237
+
238
+ // 导出模块
239
+ exports.Sql = Sql;