w-orm-postgresql 1.0.0

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 (51) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/LICENSE +21 -0
  6. package/README.md +324 -0
  7. package/SECURITY.md +5 -0
  8. package/babel.config.js +15 -0
  9. package/dist/w-orm-postgresql.umd.js +7 -0
  10. package/dist/w-orm-postgresql.umd.js.map +1 -0
  11. package/docs/WOrmPostgresql.html +1655 -0
  12. package/docs/WOrmPostgresql.mjs.html +952 -0
  13. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  14. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  17. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  21. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  31. package/docs/index.html +84 -0
  32. package/docs/scripts/collapse.js +39 -0
  33. package/docs/scripts/commonNav.js +28 -0
  34. package/docs/scripts/linenumber.js +25 -0
  35. package/docs/scripts/nav.js +12 -0
  36. package/docs/scripts/polyfill.js +4 -0
  37. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  38. package/docs/scripts/prettify/lang-css.js +2 -0
  39. package/docs/scripts/prettify/prettify.js +28 -0
  40. package/docs/scripts/search.js +99 -0
  41. package/docs/styles/jsdoc.css +776 -0
  42. package/docs/styles/prettify.css +80 -0
  43. package/g-basic.mjs +306 -0
  44. package/package.json +32 -0
  45. package/script.txt +18 -0
  46. package/src/WOrmPostgresql.mjs +880 -0
  47. package/test/basic.test.mjs +429 -0
  48. package/toolg/addVersion.mjs +4 -0
  49. package/toolg/cleanFolder.mjs +4 -0
  50. package/toolg/gDistRollup.mjs +25 -0
  51. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,880 @@
1
+ import events from 'events'
2
+ import pg from 'pg'
3
+ import mongoSql from 'mongo-sql'
4
+ import size from 'lodash-es/size.js'
5
+ import get from 'lodash-es/get.js'
6
+ import map from 'lodash-es/map.js'
7
+ import keys from 'lodash-es/keys.js'
8
+ import filter from 'lodash-es/filter.js'
9
+ import omit from 'lodash-es/omit.js'
10
+ import trim from 'lodash-es/trim.js'
11
+ import isEqual from 'lodash-es/isEqual.js'
12
+ import cloneDeep from 'lodash-es/cloneDeep.js'
13
+ import isstr from 'wsemi/src/isstr.mjs'
14
+ import isestr from 'wsemi/src/isestr.mjs'
15
+ import isarr from 'wsemi/src/isarr.mjs'
16
+ import isearr from 'wsemi/src/isearr.mjs'
17
+ import iseobj from 'wsemi/src/iseobj.mjs'
18
+ import isnum from 'wsemi/src/isnum.mjs'
19
+ import isint from 'wsemi/src/isint.mjs'
20
+ import isbol from 'wsemi/src/isbol.mjs'
21
+ import isDate from 'wsemi/src/isDate.mjs'
22
+ import pmSeries from 'wsemi/src/pmSeries.mjs'
23
+
24
+
25
+ /**
26
+ * 操作資料庫(PostgreSQL)
27
+ *
28
+ * @class
29
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
30
+ * @param {String} [opt.url='postgresql://127.0.0.1:5432'] 輸入連接資料庫字串,預設'postgresql://127.0.0.1:5432'
31
+ * @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
32
+ * @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
33
+ * @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
34
+ */
35
+ function WOrmPostgresql(opt = {}) {
36
+
37
+ //url
38
+ let url = get(opt, 'url')
39
+ if (!isestr(url)) {
40
+ // url = `postgresql://${user}:${password}@${ip}:${port}`
41
+ url = 'postgresql://user:password@127.0.0.1:5432'
42
+ }
43
+
44
+ //db
45
+ let db = get(opt, 'db')
46
+ if (!isestr(db)) {
47
+ db = 'worm'
48
+ }
49
+
50
+ //cl
51
+ let cl = get(opt, 'cl')
52
+ if (!isestr(cl)) {
53
+ cl = 'test'
54
+ }
55
+
56
+ //getValueType
57
+ function getValueType(value) {
58
+ if (isstr(value)) {
59
+ let isoTimeRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?$/
60
+ return isoTimeRegex.test(value) ? 'TIMESTAMPTZ' : 'TEXT'
61
+ }
62
+ else if (isnum(value)) {
63
+ return isint(value) ? 'INTEGER' : 'DOUBLE PRECISION'
64
+ }
65
+ else if (isbol(value)) {
66
+ return 'BOOLEAN'
67
+ }
68
+ else if (value === null) {
69
+ return 'TEXT'
70
+ }
71
+ else {
72
+ return 'JSONB'
73
+ }
74
+ }
75
+
76
+ //genSqlForCreateTable
77
+ function genSqlForCreateTable(tableName, pk, obj) {
78
+
79
+ //check
80
+ if (!iseobj(obj)) {
81
+ throw new Error(`obj[${obj}] is not an effective object`)
82
+ }
83
+
84
+ //columns
85
+ let columns = Object.entries(obj).map(([key, value]) => {
86
+ let type = getValueType(value)
87
+ let c = ` ${key} ${type}`
88
+ if (key === pk) {
89
+ c = `${c} PRIMARY KEY`
90
+ }
91
+ return c
92
+ })
93
+
94
+ //c
95
+ let c = `CREATE TABLE ${tableName} (\n${columns.join(',\n')}\n);`
96
+ // console.log('c', c)
97
+
98
+ return c
99
+ }
100
+
101
+ //genConflictSQL
102
+ function genConflictSQL(obj) {
103
+
104
+ //allKeys
105
+ let allKeys = keys(obj)
106
+
107
+ //conflictKeys
108
+ let conflictKeys = ['time']
109
+
110
+ //updateKeys
111
+ let updateKeys = filter(allKeys, (k) => {
112
+ return !conflictKeys.includes(k)
113
+ })
114
+
115
+ //check
116
+ if (size(updateKeys) === 0) {
117
+ return ''
118
+ }
119
+
120
+ //updateClause
121
+ let updateClause = updateKeys
122
+ .map(key => `${key} = EXCLUDED.${key}`)
123
+ .join(',\n ')
124
+
125
+ //c
126
+ let c = `
127
+ ON CONFLICT (${conflictKeys.join(', ')}) DO UPDATE SET
128
+ ${updateClause}
129
+ `
130
+
131
+ //trim
132
+ c = trim(c)
133
+
134
+ return c
135
+ }
136
+
137
+ //connectionString
138
+ let connectionString = `${url}/${db}`
139
+ // console.log('connectionString', connectionString)
140
+
141
+ //ee
142
+ let ee = new events.EventEmitter()
143
+
144
+ //PgClient
145
+ let PgClient = pg.Client
146
+ // console.log('PgClient', PgClient)
147
+
148
+ /**
149
+ * 創建資料表
150
+ *
151
+ * @memberOf WOrmPostgresql
152
+ * @param {String} cl 輸入資料表名字串
153
+ * @param {String} pk 輸入主鍵字串
154
+ * @param {Array|Object} arr 輸入數據物件陣列或數據物件
155
+ * @returns {Promise} 回傳Promise,resolve回傳成功訊息,reject回傳錯誤訊息
156
+ */
157
+ async function createTable(cl, pk, arr) {
158
+ let isErr = false
159
+ let res = null
160
+
161
+ //client
162
+ let client = new PgClient({ connectionString })
163
+
164
+ //connect
165
+ try {
166
+
167
+ //connect
168
+ await client.connect()
169
+
170
+ }
171
+ catch (err) {
172
+ isErr = true
173
+ res = err
174
+ client = null
175
+ }
176
+
177
+ //check
178
+ if (isErr) {
179
+ return Promise.reject(res)
180
+ }
181
+
182
+ try {
183
+
184
+ //obj
185
+ let obj = arr
186
+ if (isearr(obj)) {
187
+ obj = obj[0]
188
+ }
189
+
190
+ //check
191
+ if (!iseobj(obj)) {
192
+ throw new Error(`obj[${obj}] is not an effective object`)
193
+ }
194
+
195
+ //sql
196
+ let sql = genSqlForCreateTable(cl, pk, obj)
197
+ // console.log('sql', sql)
198
+
199
+ //select
200
+ await client.query(sql)
201
+ .then(() => {
202
+ res = {
203
+ ok: 1,
204
+ }
205
+ })
206
+ .catch((err) => {
207
+ isErr = true
208
+ res = err.message
209
+ })
210
+
211
+ }
212
+ catch (err) {
213
+ isErr = true
214
+ res = err
215
+ }
216
+ finally {
217
+ await client.end()
218
+ client = null
219
+ }
220
+ // console.log('res', res)
221
+
222
+ //check
223
+ if (isErr) {
224
+ return Promise.reject(res)
225
+ }
226
+
227
+ return res
228
+ }
229
+
230
+ /**
231
+ * 查詢數據
232
+ *
233
+ * @memberOf WOrmPostgresql
234
+ * @param {Object} [find={}] 輸入查詢條件物件
235
+ * @param {Object} [order={}] 輸入排序條件物件
236
+ * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
237
+ */
238
+ async function select(find = {}, order = {}) {
239
+ let isErr = false
240
+ let res = null
241
+
242
+ //client
243
+ let client = new PgClient({ connectionString })
244
+
245
+ //connect
246
+ try {
247
+
248
+ //connect
249
+ await client.connect()
250
+
251
+ }
252
+ catch (err) {
253
+ isErr = true
254
+ res = err
255
+ client = null
256
+ }
257
+
258
+ //check
259
+ if (isErr) {
260
+ return Promise.reject(res)
261
+ }
262
+
263
+ try {
264
+
265
+ //mr
266
+ let mr = mongoSql.sql({
267
+ type: 'select',
268
+ table: cl,
269
+ where: find,
270
+ // limit: 10,
271
+ order,
272
+ })
273
+ // console.log('mr', mr)
274
+ // console.log('mr.query', mr.query)
275
+ // console.log('mr.values', mr.values)
276
+
277
+ //select
278
+ let r = await client.query(mr.query, mr.values)
279
+ // console.log('r', r)
280
+
281
+ //res
282
+ res = get(r, 'rows')
283
+
284
+ //check
285
+ if (!isarr(res)) {
286
+ isErr = true
287
+ res = `can not select by find[${JSON.stringify(find)}]`
288
+ }
289
+
290
+ }
291
+ catch (err) {
292
+ isErr = true
293
+ res = err
294
+ }
295
+ finally {
296
+ await client.end()
297
+ client = null
298
+ }
299
+ // console.log('res', res)
300
+
301
+ //check
302
+ if (isErr) {
303
+ return Promise.reject(res)
304
+ }
305
+
306
+ return res
307
+ }
308
+
309
+ /**
310
+ * 插入數據
311
+ *
312
+ * @memberOf WOrmPostgresql
313
+ * @param {Object|Array} data 輸入數據物件或陣列
314
+ * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
315
+ */
316
+ async function insert(data) {
317
+ let isErr = false
318
+ let res = null
319
+
320
+ //cloneDeep
321
+ data = cloneDeep(data)
322
+
323
+ //client
324
+ let client = new PgClient({ connectionString })
325
+
326
+ //connect
327
+ try {
328
+
329
+ //connect
330
+ await client.connect()
331
+
332
+ }
333
+ catch (err) {
334
+ isErr = true
335
+ res = err
336
+ client = null
337
+ }
338
+
339
+ //check
340
+ if (isErr) {
341
+ return Promise.reject(res)
342
+ }
343
+
344
+ try {
345
+
346
+ //check
347
+ if (!isarr(data)) {
348
+ data = [data]
349
+ }
350
+
351
+ //check time
352
+ data = map(data, function(v, k) {
353
+ if (!isDate(v.time)) {
354
+ throw new Error(`invalid data[${k}].time[${v.time}]`)
355
+ }
356
+ return v
357
+ })
358
+
359
+ //mr
360
+ let mr = mongoSql.sql({
361
+ type: 'insert',
362
+ table: cl,
363
+ values: data,
364
+ })
365
+ // console.log('mr', mr)
366
+ // console.log('mr.query', mr.query)
367
+ // console.log('mr.values', mr.values)
368
+
369
+ //nAll, nInsert
370
+ let nAll = size(data)
371
+ let nInsert = nAll //一次插入全部數據加速, 但也因此沒法個別處理conflict, 無法個別計算已插入數量
372
+
373
+ //insert
374
+ await client.query(mr.query, mr.values)
375
+ .then(() => {
376
+
377
+ //res
378
+ res = {
379
+ n: nAll,
380
+ nInserted: nInsert,
381
+ ok: 1,
382
+ }
383
+
384
+ //emit
385
+ ee.emit('change', 'insert', data, res)
386
+
387
+ })
388
+ .catch((err) => {
389
+ isErr = true
390
+ res = err.message
391
+ })
392
+
393
+ }
394
+ catch (err) {
395
+ isErr = true
396
+ res = err
397
+ }
398
+ finally {
399
+ await client.end()
400
+ client = null
401
+ }
402
+
403
+ //check
404
+ if (isErr) {
405
+ return Promise.reject(res)
406
+ }
407
+
408
+ return res
409
+ }
410
+
411
+ /**
412
+ * 儲存數據
413
+ *
414
+ * @memberOf WOrmPostgresql
415
+ * @param {Object|Array} data 輸入數據物件或陣列
416
+ * @param {Object} [option={}] 輸入設定物件,預設為{}
417
+ * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
418
+ * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
419
+ */
420
+ async function save(data, option = {}) {
421
+ let isErr = false
422
+ let res = null
423
+
424
+ //cloneDeep
425
+ data = cloneDeep(data)
426
+
427
+ //autoInsert
428
+ let autoInsert = get(option, 'autoInsert', true)
429
+
430
+ //client
431
+ let client = new PgClient({ connectionString })
432
+
433
+ //connect
434
+ try {
435
+
436
+ //connect
437
+ await client.connect()
438
+
439
+ }
440
+ catch (err) {
441
+ isErr = true
442
+ res = err
443
+ client = null
444
+ }
445
+
446
+ //check
447
+ if (isErr) {
448
+ return Promise.reject(res)
449
+ }
450
+
451
+ try {
452
+
453
+ //check
454
+ if (!isarr(data)) {
455
+ data = [data]
456
+ }
457
+
458
+ //check time
459
+ data = map(data, function(v, k) {
460
+ if (!isDate(v.time)) {
461
+ throw new Error(`invalid data[${k}].time[${v.time}]`)
462
+ }
463
+ return v
464
+ })
465
+
466
+ //pmSeries
467
+ res = await pmSeries(data, async(v) => {
468
+
469
+ //rest
470
+ let rest = null
471
+
472
+ //_v
473
+ let _v = null
474
+ if (true) {
475
+
476
+ //mr
477
+ let mr = mongoSql.sql({
478
+ type: 'select',
479
+ table: cl,
480
+ where: {
481
+ time: v.time,
482
+ },
483
+ // limit: 10,
484
+ // order,
485
+ })
486
+ // console.log('mr', mr)
487
+ // console.log('mr.query', mr.query)
488
+ // console.log('mr.values', mr.values)
489
+
490
+ //select
491
+ let r = await client.query(mr.query, mr.values)
492
+ // console.log('r', r)
493
+
494
+ //rows
495
+ let rows = get(r, 'rows')
496
+ // console.log('rows', rows)
497
+
498
+ //_v
499
+ _v = get(rows, 0, null)
500
+ // console.log('_v', _v)
501
+
502
+ }
503
+
504
+ //check
505
+ if (iseobj(_v)) {
506
+ //存在
507
+
508
+ //_vt
509
+ let _vt = omit(_v, 'time')
510
+ // console.log('_vt', _vt)
511
+
512
+ //vt
513
+ let vt = omit(v, 'time')
514
+ // console.log('vt', vt)
515
+
516
+ if (isEqual(_vt, vt)) {
517
+ //相同時不更新
518
+
519
+ //rest
520
+ rest = {
521
+ n: 1,
522
+ nModified: 0,
523
+ ok: 1,
524
+ }
525
+ // console.log('相同時不更新', rest, v)
526
+
527
+ }
528
+ else {
529
+ //不相同時須更新
530
+
531
+ //mr
532
+ let mr = mongoSql.sql({
533
+ type: 'insert',
534
+ table: cl,
535
+ values: v,
536
+ })
537
+ // console.log('mr', mr)
538
+ // console.log('mr.query', mr.query)
539
+ // console.log('mr.values', mr.values)
540
+
541
+ //添加conflict
542
+ let conflict = genConflictSQL(v)
543
+
544
+ //sql
545
+ let sql = `${mr.query} ${conflict}`
546
+
547
+ //save
548
+ await client.query(sql, mr.values)
549
+ .then(() => {
550
+
551
+ //rest
552
+ rest = {
553
+ n: 1,
554
+ nModified: 1,
555
+ ok: 1,
556
+ }
557
+ // console.log('不相同時須更新', rest, vt)
558
+
559
+ })
560
+ .catch((err) => {
561
+
562
+ //rest
563
+ rest = {
564
+ n: 1,
565
+ nModified: 0,
566
+ ok: 0,
567
+ err: err.message,
568
+ }
569
+
570
+ })
571
+
572
+ }
573
+ }
574
+ else {
575
+ //不存在
576
+
577
+ //rest
578
+ rest = {
579
+ n: 0,
580
+ nModified: 0,
581
+ ok: 1,
582
+ }
583
+ // console.log('不存在', rest, v)
584
+
585
+ }
586
+
587
+ //autoInsert
588
+ if (autoInsert && rest.n === 0) {
589
+ //之前不存在(rest.n)且可自動插入(autoInsert=true)
590
+
591
+ //mr
592
+ let mr = mongoSql.sql({
593
+ type: 'insert',
594
+ table: cl,
595
+ values: v,
596
+ })
597
+ // console.log('mr', mr)
598
+ // console.log('mr.query', mr.query)
599
+ // console.log('mr.values', mr.values)
600
+
601
+ //save
602
+ await client.query(mr.query, mr.values)
603
+ .then(() => {
604
+
605
+ //rest
606
+ rest = {
607
+ n: 1,
608
+ nInserted: 1,
609
+ ok: 1,
610
+ }
611
+ // console.log('之前不存在且可自動插入', rest, v)
612
+
613
+ })
614
+ .catch((err) => {
615
+
616
+ //rest
617
+ rest = {
618
+ n: 1,
619
+ nInserted: 0,
620
+ ok: 0,
621
+ err: err.message,
622
+ }
623
+
624
+ })
625
+
626
+ }
627
+
628
+ return rest
629
+ })
630
+
631
+ //emit
632
+ ee.emit('change', 'save', data, res)
633
+
634
+ }
635
+ catch (err) {
636
+ isErr = true
637
+ res = err
638
+ }
639
+ finally {
640
+ await client.end()
641
+ client = null
642
+ }
643
+
644
+ //check
645
+ if (isErr) {
646
+ return Promise.reject(res)
647
+ }
648
+
649
+ return res
650
+ }
651
+
652
+ /**
653
+ * 刪除數據
654
+ *
655
+ * @memberOf WOrmPostgresql
656
+ * @param {Object|Array} data 輸入數據物件或陣列
657
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
658
+ */
659
+ async function del(data) {
660
+ let isErr = false
661
+ let res = null
662
+
663
+ //cloneDeep
664
+ data = cloneDeep(data)
665
+
666
+ //client
667
+ let client = new PgClient({ connectionString })
668
+
669
+ //connect
670
+ try {
671
+
672
+ //connect
673
+ await client.connect()
674
+
675
+ }
676
+ catch (err) {
677
+ isErr = true
678
+ res = err
679
+ client = null
680
+ }
681
+
682
+ //check
683
+ if (isErr) {
684
+ return Promise.reject(res)
685
+ }
686
+
687
+ try {
688
+
689
+ // //database, collection
690
+ // let database = client.db(opt.db)
691
+ // let collection = database.collection(opt.cl)
692
+
693
+ //check
694
+ if (!isarr(data)) {
695
+ data = [data]
696
+ }
697
+
698
+ //check time
699
+ data = map(data, function(v, k) {
700
+ if (!isDate(v.time)) {
701
+ throw new Error(`invalid data[${k}].time[${v.time}]`)
702
+ }
703
+ return v
704
+ })
705
+
706
+ //pmSeries
707
+ res = await pmSeries(data, async(v) => {
708
+
709
+ //rest
710
+ let rest = null
711
+
712
+ //mr
713
+ let mr = mongoSql.sql({
714
+ type: 'delete',
715
+ table: cl,
716
+ where: {
717
+ time: v.time,
718
+ },
719
+ })
720
+ // console.log('mr', mr)
721
+ // console.log('mr.query', mr.query)
722
+ // console.log('mr.values', mr.values)
723
+
724
+ //del
725
+ await client.query(mr.query, mr.values)
726
+ .then((r) => {
727
+
728
+ //res
729
+ rest = {
730
+ n: 1,
731
+ nDeleted: r.rowCount,
732
+ ok: 1,
733
+ }
734
+
735
+ })
736
+ .catch((err) => {
737
+
738
+ //rest
739
+ rest = {
740
+ n: 1,
741
+ nDeleted: 0,
742
+ ok: 0,
743
+ err: err.message,
744
+ }
745
+
746
+ })
747
+
748
+ return rest
749
+ })
750
+
751
+ //emit
752
+ ee.emit('change', 'del', data, res)
753
+
754
+ }
755
+ catch (err) {
756
+ isErr = true
757
+ res = err
758
+ }
759
+ finally {
760
+ await client.end()
761
+ client = null
762
+ }
763
+
764
+ //check
765
+ if (isErr) {
766
+ return Promise.reject(res)
767
+ }
768
+
769
+ return res
770
+ }
771
+
772
+ /**
773
+ * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
774
+ *
775
+ * @memberOf WOrmPostgresql
776
+ * @param {Object} [find={}] 輸入刪除條件物件
777
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
778
+ */
779
+ async function delAll(find = {}) {
780
+ let isErr = false
781
+ let res = null
782
+
783
+ //client
784
+ let client = new PgClient({ connectionString })
785
+
786
+ //connect
787
+ try {
788
+
789
+ //connect
790
+ await client.connect()
791
+
792
+ }
793
+ catch (err) {
794
+ isErr = true
795
+ res = err
796
+ client = null
797
+ }
798
+
799
+ //check
800
+ if (isErr) {
801
+ return Promise.reject(res)
802
+ }
803
+
804
+ try {
805
+
806
+ // //database, collection
807
+ // let database = client.db(opt.db)
808
+ // let collection = database.collection(opt.cl)
809
+
810
+ // //deleteMany
811
+ // res = await collection.deleteMany(find)
812
+
813
+ // //res
814
+ // res = {
815
+ // n: res.deletedCount,
816
+ // nDeleted: res.deletedCount,
817
+ // ok: res.acknowledged ? 1 : 0,
818
+ // }
819
+
820
+ //mr
821
+ let mr = mongoSql.sql({
822
+ type: 'delete',
823
+ table: cl,
824
+ where: find,
825
+ })
826
+ // console.log('mr', mr)
827
+ // console.log('mr.query', mr.query)
828
+ // console.log('mr.values', mr.values)
829
+
830
+ //delAll
831
+ await client.query(mr.query, mr.values)
832
+ .then((r) => {
833
+
834
+ //res
835
+ res = {
836
+ n: r.rowCount,
837
+ nDeleted: r.rowCount,
838
+ ok: 1,
839
+ }
840
+
841
+ //emit
842
+ ee.emit('change', 'delAll', null, res)
843
+
844
+ })
845
+ .catch((err) => {
846
+ isErr = true
847
+ res = err.message
848
+ })
849
+
850
+ }
851
+ catch (err) {
852
+ isErr = true
853
+ res = err
854
+ }
855
+ finally {
856
+ await client.end()
857
+ client = null
858
+ }
859
+
860
+ //check
861
+ if (isErr) {
862
+ return Promise.reject(res)
863
+ }
864
+
865
+ return res
866
+ }
867
+
868
+ //save
869
+ ee.createTable = createTable
870
+ ee.select = select
871
+ ee.insert = insert
872
+ ee.save = save
873
+ ee.del = del
874
+ ee.delAll = delAll
875
+
876
+ return ee
877
+ }
878
+
879
+
880
+ export default WOrmPostgresql