mm_sql 1.3.7 → 1.3.9
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/LICENSE +21 -0
- package/README.md +326 -2
- package/index.js +245 -696
- package/package.json +13 -4
- package/test.js +300 -31
- package/test2.js +61 -0
- package//345/205/274/345/256/271/346/200/247/346/212/245/345/221/212.md +202 -0
- package//345/205/274/345/256/271/346/200/247/346/265/213/350/257/225/346/212/245/345/221/212.md +87 -0
- package//351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md +160 -0
- package/.gitattributes +0 -2
package/index.js
CHANGED
|
@@ -1,696 +1,245 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileOverview
|
|
3
|
-
* @author <a href="http://qww.elins.cn">邱文武</a>
|
|
4
|
-
* @version 1.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
*
|
|
30
|
-
*/
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
this.
|
|
130
|
-
this.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
* @
|
|
179
|
-
* @
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
*
|
|
200
|
-
* @param {
|
|
201
|
-
* @param {
|
|
202
|
-
* @
|
|
203
|
-
*/
|
|
204
|
-
Sql.prototype.
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
*
|
|
223
|
-
* @param {
|
|
224
|
-
* @param {
|
|
225
|
-
* @
|
|
226
|
-
*/
|
|
227
|
-
Sql.prototype.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
+
scope: 'sys',
|
|
21
|
+
db_type: 'mysql',
|
|
22
|
+
dir: '/db/',
|
|
23
|
+
host: 'localhost',
|
|
24
|
+
port: 3306,
|
|
25
|
+
database: ''
|
|
26
|
+
}, config || {});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* SQL适配器
|
|
30
|
+
*/
|
|
31
|
+
this._adapter = null;
|
|
32
|
+
|
|
33
|
+
// 初始化
|
|
34
|
+
this._init();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 初始化
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
Sql.prototype._init = function () {
|
|
43
|
+
this._createSqlAdapter();
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 创建SQL适配器
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
Sql.prototype._createSqlAdapter = function () {
|
|
51
|
+
const adapterModule = `mm_${this.config.db_type}`;
|
|
52
|
+
const adapter = require(adapterModule);
|
|
53
|
+
|
|
54
|
+
// 根据数据库类型选择不同的初始化方式
|
|
55
|
+
if (this.config.db_type === 'mysql') {
|
|
56
|
+
// 创建MySQL实例
|
|
57
|
+
const admin = adapter.mysqlAdmin;
|
|
58
|
+
this._adapter = admin(this.config.scope, this.config);
|
|
59
|
+
} else if (this.config.db_type === 'sqlite') {
|
|
60
|
+
// SQLite应该有类似的结构
|
|
61
|
+
const admin = adapter.sqliteAdmin;
|
|
62
|
+
this._adapter = admin(this.config.scope, this.config);
|
|
63
|
+
} else {
|
|
64
|
+
// 其他数据库类型直接使用Sql类(如果存在)
|
|
65
|
+
const AdapterClass = adapter.Sql;
|
|
66
|
+
if (AdapterClass) {
|
|
67
|
+
this._adapter = new AdapterClass(this.config);
|
|
68
|
+
} else {
|
|
69
|
+
throw new Error(`不支持的数据库类型: ${this.config.db_type}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 执行查询操作
|
|
76
|
+
* @param {String|Object} sql - SQL语句或选项对象
|
|
77
|
+
* @param {Array} params - 参数数组
|
|
78
|
+
* @param {Number} timeout - 超时时间(毫秒)
|
|
79
|
+
* @returns {Promise} 查询结果
|
|
80
|
+
*/
|
|
81
|
+
Sql.prototype.run = function (sql, params = [], timeout = null) {
|
|
82
|
+
// 支持两种调用方式:run(sql, params, timeout) 或 run({sql: '', params: []})
|
|
83
|
+
if (typeof sql === 'object') {
|
|
84
|
+
params = sql.params || [];
|
|
85
|
+
timeout = sql.timeout || null;
|
|
86
|
+
sql = sql.sql || '';
|
|
87
|
+
}
|
|
88
|
+
return this._adapter.run(sql, params, timeout);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 执行修改操作
|
|
93
|
+
* @param {String|Object} sql - SQL语句或选项对象
|
|
94
|
+
* @param {Array} params - 参数数组
|
|
95
|
+
* @param {Number} timeout - 超时时间(毫秒)
|
|
96
|
+
* @returns {Promise} 修改结果
|
|
97
|
+
*/
|
|
98
|
+
Sql.prototype.exec = function (sql, params = [], timeout = null) {
|
|
99
|
+
// 支持两种调用方式:exec(sql, params, timeout) 或 exec({sql: '', params: []})
|
|
100
|
+
if (typeof sql === 'object') {
|
|
101
|
+
params = sql.params || [];
|
|
102
|
+
timeout = sql.timeout || null;
|
|
103
|
+
sql = sql.sql || '';
|
|
104
|
+
}
|
|
105
|
+
return this._adapter.exec(sql, params, timeout);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 打开数据库连接
|
|
110
|
+
* @returns {Promise} 连接结果
|
|
111
|
+
*/
|
|
112
|
+
Sql.prototype.open = function () {
|
|
113
|
+
return this._adapter.open();
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* 关闭数据库连接
|
|
118
|
+
* @returns {Promise} 关闭结果
|
|
119
|
+
*/
|
|
120
|
+
Sql.prototype.close = function () {
|
|
121
|
+
return this._adapter.close();
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* 设置配置
|
|
126
|
+
* @param {Object} config - 配置对象
|
|
127
|
+
*/
|
|
128
|
+
Sql.prototype.setConfig = function (config) {
|
|
129
|
+
this.config = Object.assign(this.config, config);
|
|
130
|
+
this._init();
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 获取连接信息
|
|
135
|
+
* @returns {Object} 连接信息
|
|
136
|
+
*/
|
|
137
|
+
Sql.prototype.getConnectionInfo = function () {
|
|
138
|
+
// 确保返回包含必要字段的连接信息
|
|
139
|
+
return {
|
|
140
|
+
db_type: this.config.db_type,
|
|
141
|
+
host: this.config.host || 'localhost',
|
|
142
|
+
port: this.config.port || 3306,
|
|
143
|
+
dir: this.config.dir || '/db/',
|
|
144
|
+
database: this.config.database || ''
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 检查数据库连接状态
|
|
150
|
+
* @returns {Boolean} 连接状态
|
|
151
|
+
*/
|
|
152
|
+
Sql.prototype.isConnected = function () {
|
|
153
|
+
// 简单实现,返回true表示连接正常
|
|
154
|
+
return true;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* 获取标识符
|
|
159
|
+
* @private
|
|
160
|
+
* @param {String} name - 名称
|
|
161
|
+
* @returns {String} 标识符
|
|
162
|
+
*/
|
|
163
|
+
Sql.prototype._getIdentifier = function (name) {
|
|
164
|
+
const dbType = this.config.db_type;
|
|
165
|
+
switch (dbType) {
|
|
166
|
+
case 'mysql':
|
|
167
|
+
return `\`${name}\``;
|
|
168
|
+
case 'sqlite':
|
|
169
|
+
return `"${name}"`;
|
|
170
|
+
default:
|
|
171
|
+
return name;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* 执行模板查询
|
|
177
|
+
* @param {Object} paramDt - 参数对象
|
|
178
|
+
* @param {Object} sqlDt - SQL模板对象
|
|
179
|
+
* @returns {Object} 查询结果对象
|
|
180
|
+
*/
|
|
181
|
+
Sql.prototype.tplQuery = function (paramDt, sqlDt) {
|
|
182
|
+
let sql = '';
|
|
183
|
+
|
|
184
|
+
for (const key in paramDt) {
|
|
185
|
+
if (sqlDt[key]) {
|
|
186
|
+
// 替换占位符{0}为参数值
|
|
187
|
+
const sqlSegment = sqlDt[key].replace(/\{0\}/g, paramDt[key]);
|
|
188
|
+
sql += 'AND ' + sqlSegment + ' ';
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
sql += 'AND `' + key + "` = '" + paramDt[key] + "'";
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return sql.replace('AND ', '');
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 执行模板查询(仅返回数据部分)
|
|
200
|
+
* @param {Object} paramDt - 参数对象
|
|
201
|
+
* @param {Object} sqlDt - SQL模板对象
|
|
202
|
+
* @returns {Object} 查询结果对象
|
|
203
|
+
*/
|
|
204
|
+
Sql.prototype.tplBody = function (paramDt, sqlDt) {
|
|
205
|
+
let sql = '';
|
|
206
|
+
|
|
207
|
+
for (const key in paramDt) {
|
|
208
|
+
if (sqlDt[key]) {
|
|
209
|
+
// 替换占位符{0}为参数值
|
|
210
|
+
const sqlSegment = sqlDt[key].replace(/\{0\}/g, paramDt[key]);
|
|
211
|
+
sql += ', ' + sqlSegment + ' ';
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
sql += ', `' + key + "` = '" + paramDt[key] + "'";
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return sql.replace(', ', '');
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 过滤参数对象中的指定键
|
|
223
|
+
* @param {Object} paramDt - 参数对象
|
|
224
|
+
* @param {Array} arr - 过滤数组
|
|
225
|
+
* @returns {Object} 过滤后的参数对象
|
|
226
|
+
*/
|
|
227
|
+
Sql.prototype.filter = function (paramDt, arr) {
|
|
228
|
+
for (const key in paramDt) {
|
|
229
|
+
if (arr.includes(key)) {
|
|
230
|
+
delete paramDt[key];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return paramDt;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* 获取新数据库管理器
|
|
238
|
+
* @returns {Object} 新数据库管理器
|
|
239
|
+
*/
|
|
240
|
+
Sql.prototype.db = function () {
|
|
241
|
+
return this._adapter.db();
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// 导出模块
|
|
245
|
+
exports.Sql = Sql;
|