w-orm-postgresql 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -16
- package/dist/w-orm-postgresql.umd.js +2 -2
- package/dist/w-orm-postgresql.umd.js.map +1 -1
- package/docs/WOrmPostgresql.html +138 -27
- package/docs/WOrmPostgresql.mjs.html +148 -56
- package/docs/index.html +2 -2
- package/g-basic.mjs +16 -16
- package/package.json +1 -1
- package/src/WOrmPostgresql.mjs +146 -54
- package/test/api-postgresql.test.mjs +513 -46
package/src/WOrmPostgresql.mjs
CHANGED
|
@@ -26,11 +26,16 @@ import pmSeries from 'wsemi/src/pmSeries.mjs'
|
|
|
26
26
|
/**
|
|
27
27
|
* 操作資料庫(PostgreSQL)
|
|
28
28
|
*
|
|
29
|
+
* 本套件之主鍵欄位由opt.pk指定,預設為time,select以外之五函數皆以此欄位認定主鍵。
|
|
30
|
+
* 因主鍵得為承載業務語義之欄位(如時序資料之觀測時間),insert與save於輸入未帶有效主鍵值時不自動補值,
|
|
31
|
+
* 一律以reject回報;del亦不補值,該筆回ok:0與err。
|
|
32
|
+
*
|
|
29
33
|
* @class
|
|
30
34
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
31
35
|
* @param {String} [opt.url='postgresql://127.0.0.1:5432'] 輸入連接資料庫字串,預設'postgresql://127.0.0.1:5432'
|
|
32
36
|
* @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
|
|
33
37
|
* @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
|
|
38
|
+
* @param {String} [opt.pk='time'] 輸入主鍵欄位名字串,預設'time'
|
|
34
39
|
* @param {Boolean} [opt.useCache=false] 輸入是否使用select快取,適用於單程序操作,預設false
|
|
35
40
|
* @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
|
|
36
41
|
*/
|
|
@@ -63,6 +68,26 @@ function WOrmPostgresql(opt = {}) {
|
|
|
63
68
|
useCache = false
|
|
64
69
|
}
|
|
65
70
|
|
|
71
|
+
//pkName, 主鍵欄位名, select以外之五函數皆以此欄位認定主鍵, 預設為time
|
|
72
|
+
let pkName = get(opt, 'pk')
|
|
73
|
+
if (!isestr(pkName)) {
|
|
74
|
+
pkName = 'time'
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
//checkPk, 判定主鍵值是否有效
|
|
78
|
+
//因主鍵欄位得由呼叫端指定, 其型別隨欄位而異, 故此處僅要求有給值而不限定型別,
|
|
79
|
+
//型別與欄位不符者由PostgreSQL回報, 各函數再依其規格處置
|
|
80
|
+
function checkPk(pkv) {
|
|
81
|
+
return isestr(pkv) || isnum(pkv) || isbol(pkv) || isDate(pkv)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//isErrPkType, 判定錯誤是否為[主鍵值型別與欄位不符]
|
|
85
|
+
//22P02為invalid_text_representation, 22007為invalid_datetime_format
|
|
86
|
+
function isErrPkType(err) {
|
|
87
|
+
let code = get(err, 'code')
|
|
88
|
+
return code === '22P02' || code === '22007'
|
|
89
|
+
}
|
|
90
|
+
|
|
66
91
|
//getValueType
|
|
67
92
|
function getValueType(value) {
|
|
68
93
|
if (isstr(value)) {
|
|
@@ -115,7 +140,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
115
140
|
let allKeys = keys(obj)
|
|
116
141
|
|
|
117
142
|
//conflictKeys
|
|
118
|
-
let conflictKeys = [
|
|
143
|
+
let conflictKeys = [pkName]
|
|
119
144
|
|
|
120
145
|
//updateKeys
|
|
121
146
|
let updateKeys = filter(allKeys, (k) => {
|
|
@@ -190,14 +215,22 @@ function WOrmPostgresql(opt = {}) {
|
|
|
190
215
|
|
|
191
216
|
/**
|
|
192
217
|
* 創建資料表
|
|
218
|
+
* 註: pk未給時採建構時之opt.pk。因insert與save倚賴主鍵之唯一約束達成原子性,
|
|
219
|
+
* 若給予與opt.pk不同之欄位,將建出其餘函數無法正確操作之資料表,故一般應留空或給予相同值
|
|
193
220
|
*
|
|
194
221
|
* @memberOf WOrmPostgresql
|
|
195
222
|
* @param {String} cl 輸入資料表名字串
|
|
196
|
-
* @param {String} pk
|
|
223
|
+
* @param {String} [pk=opt.pk] 輸入主鍵欄位名字串,預設為建構時之opt.pk
|
|
197
224
|
* @param {Array|Object} arr 輸入數據物件陣列或數據物件
|
|
198
225
|
* @returns {Promise} 回傳Promise,resolve回傳成功訊息,reject回傳錯誤訊息
|
|
199
226
|
*/
|
|
200
227
|
async function createTable(cl, pk, arr) {
|
|
228
|
+
|
|
229
|
+
//pk, 未給時採建構時設定之主鍵欄位
|
|
230
|
+
if (!isestr(pk)) {
|
|
231
|
+
pk = pkName
|
|
232
|
+
}
|
|
233
|
+
|
|
201
234
|
let isErr = false
|
|
202
235
|
let res = null
|
|
203
236
|
|
|
@@ -368,25 +401,29 @@ function WOrmPostgresql(opt = {}) {
|
|
|
368
401
|
}
|
|
369
402
|
|
|
370
403
|
/**
|
|
371
|
-
*
|
|
404
|
+
* 由主鍵查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳
|
|
405
|
+
* 註: 本套件之主鍵欄位由建構時之opt.pk指定,預設為time
|
|
406
|
+
*
|
|
407
|
+
* 主鍵未命中或主鍵值無效皆回傳null而不reject,命中之判定基準與insert、save、del內對既有數據之認定一致。
|
|
408
|
+
* 主鍵值之型別與欄位不符時PostgreSQL回報22P02或22007,亦屬主鍵值無效而回傳null。
|
|
372
409
|
*
|
|
373
410
|
* @memberOf WOrmPostgresql
|
|
374
|
-
* @param {String|Date}
|
|
375
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
411
|
+
* @param {String|Number|Date} pk 輸入主鍵值,即數據之主鍵欄位值
|
|
412
|
+
* @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此主鍵則回傳null,reject回傳錯誤訊息
|
|
376
413
|
*/
|
|
377
|
-
async function
|
|
414
|
+
async function selectByPk(pk) {
|
|
378
415
|
let isErr = false
|
|
379
416
|
let res = null
|
|
380
417
|
|
|
381
418
|
//check
|
|
382
|
-
if (!
|
|
383
|
-
//未給有效主鍵值視為查無數據, 判定基準與insert、save、del
|
|
419
|
+
if (!checkPk(pk)) {
|
|
420
|
+
//未給有效主鍵值視為查無數據, 判定基準與insert、save、del內對主鍵之認定一致
|
|
384
421
|
return null
|
|
385
422
|
}
|
|
386
423
|
|
|
387
|
-
//find,
|
|
424
|
+
//find, 以建構時設定之主鍵欄位查找, 與insert、save、del、genConflictSQL之認定一致
|
|
388
425
|
let find = {
|
|
389
|
-
|
|
426
|
+
[pkName]: pk,
|
|
390
427
|
}
|
|
391
428
|
|
|
392
429
|
//cache, 與select共用快取, 因快取鍵值由find與order組成, 故此處等同select(find)之結果
|
|
@@ -440,7 +477,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
440
477
|
|
|
441
478
|
//check
|
|
442
479
|
if (!isarr(rows)) {
|
|
443
|
-
throw new Error(`can not select by
|
|
480
|
+
throw new Error(`can not select by pk[${pk}]`)
|
|
444
481
|
}
|
|
445
482
|
|
|
446
483
|
//cache
|
|
@@ -456,14 +493,22 @@ function WOrmPostgresql(opt = {}) {
|
|
|
456
493
|
res = v
|
|
457
494
|
}
|
|
458
495
|
else {
|
|
459
|
-
|
|
496
|
+
//不存在主鍵, 回傳null
|
|
460
497
|
res = null
|
|
461
498
|
}
|
|
462
499
|
|
|
463
500
|
}
|
|
464
501
|
catch (err) {
|
|
465
|
-
|
|
466
|
-
|
|
502
|
+
|
|
503
|
+
//check, 主鍵值之型別與欄位不符者亦屬主鍵值無效, 依規格回傳null而不reject
|
|
504
|
+
if (isErrPkType(err)) {
|
|
505
|
+
res = null
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
isErr = true
|
|
509
|
+
res = err
|
|
510
|
+
}
|
|
511
|
+
|
|
467
512
|
}
|
|
468
513
|
finally {
|
|
469
514
|
await client.end()
|
|
@@ -480,11 +525,15 @@ function WOrmPostgresql(opt = {}) {
|
|
|
480
525
|
}
|
|
481
526
|
|
|
482
527
|
/**
|
|
483
|
-
*
|
|
528
|
+
* 插入數據,僅於主鍵不存在時寫入,已存在者跳過且不覆寫
|
|
529
|
+
*
|
|
530
|
+
* n為輸入筆數,即本次嘗試插入之基準;nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果,
|
|
531
|
+
* 不視為錯誤。同批含重複主鍵時僅首筆計入nInserted。
|
|
532
|
+
* 因主鍵得承載業務語義,未帶有效主鍵值時不自動補值,一律以reject回報。
|
|
484
533
|
*
|
|
485
534
|
* @memberOf WOrmPostgresql
|
|
486
535
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
487
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
536
|
+
* @returns {Promise} 回傳Promise,resolve回傳插入結果物件{n,nInserted,ok},reject回傳錯誤訊息
|
|
488
537
|
*/
|
|
489
538
|
async function insert(data) {
|
|
490
539
|
let isErr = false
|
|
@@ -530,10 +579,10 @@ function WOrmPostgresql(opt = {}) {
|
|
|
530
579
|
data = [data]
|
|
531
580
|
}
|
|
532
581
|
|
|
533
|
-
//check
|
|
582
|
+
//check pk, 因主鍵得承載業務語義故不自動補值, 未帶有效主鍵值者屬整批性錯誤
|
|
534
583
|
data = map(data, function(v, k) {
|
|
535
|
-
if (!
|
|
536
|
-
throw new Error(`invalid data[${k}]
|
|
584
|
+
if (!checkPk(get(v, pkName))) {
|
|
585
|
+
throw new Error(`invalid data[${k}].${pkName}[${get(v, pkName)}]`)
|
|
537
586
|
}
|
|
538
587
|
return v
|
|
539
588
|
})
|
|
@@ -548,10 +597,10 @@ function WOrmPostgresql(opt = {}) {
|
|
|
548
597
|
// console.log('mr.query', mr.query)
|
|
549
598
|
// console.log('mr.values', mr.values)
|
|
550
599
|
|
|
551
|
-
//添加conflict,
|
|
552
|
-
//由PostgreSQL於單一語句內原子完成[
|
|
553
|
-
|
|
554
|
-
let sql = `${mr.query} ON CONFLICT (
|
|
600
|
+
//添加conflict, 令已存在主鍵者跳過而不中斷整批插入, 主鍵認定與genConflictSQL一致
|
|
601
|
+
//由PostgreSQL於單一語句內原子完成[檢查主鍵未存在]與[寫入], 併發時同一主鍵僅有一次成功,
|
|
602
|
+
//同批含重複主鍵時亦僅首筆成功, 故不須逐筆插入即可取得實際插入筆數
|
|
603
|
+
let sql = `${mr.query} ON CONFLICT (${pkName}) DO NOTHING`
|
|
555
604
|
|
|
556
605
|
//nAll
|
|
557
606
|
let nAll = size(data)
|
|
@@ -607,13 +656,21 @@ function WOrmPostgresql(opt = {}) {
|
|
|
607
656
|
}
|
|
608
657
|
|
|
609
658
|
/**
|
|
610
|
-
*
|
|
659
|
+
* 儲存數據,以主鍵time為準更新既有數據,未給之欄位保留
|
|
660
|
+
*
|
|
661
|
+
* 回傳陣列恆與輸入等長,輸入單一物件亦回傳長度1之陣列。
|
|
662
|
+
* 各筆之n為主鍵命中筆數,值為0或1,命中(不論內容有無變更)或經插入而產生皆為1;
|
|
663
|
+
* nInserted與nModified恆同時出現,無對應行為時填0。
|
|
664
|
+
* [內容相同]之判定基準為待寫入物件合併進現值後與現值相同,非待寫入物件與現值全等,
|
|
665
|
+
* 故只給部份欄位且該些欄位值皆與現值相同時,合併結果等於現值,nModified為0,
|
|
666
|
+
* 令nModified忠實反映資料庫端是否真的寫入。
|
|
667
|
+
* 因主鍵得承載業務語義,未帶有效主鍵值時不自動補值,一律以reject回報。
|
|
611
668
|
*
|
|
612
669
|
* @memberOf WOrmPostgresql
|
|
613
670
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
614
671
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
615
672
|
* @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
|
|
616
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
673
|
+
* @returns {Promise} 回傳Promise,resolve回傳儲存結果陣列[{n,nInserted,nModified,ok}],reject回傳錯誤訊息
|
|
617
674
|
*/
|
|
618
675
|
async function save(data, option = {}) {
|
|
619
676
|
let isErr = false
|
|
@@ -658,10 +715,10 @@ function WOrmPostgresql(opt = {}) {
|
|
|
658
715
|
data = [data]
|
|
659
716
|
}
|
|
660
717
|
|
|
661
|
-
//check
|
|
718
|
+
//check pk, 因主鍵得承載業務語義故不自動補值, 未帶有效主鍵值者屬整批性錯誤
|
|
662
719
|
data = map(data, function(v, k) {
|
|
663
|
-
if (!
|
|
664
|
-
throw new Error(`invalid data[${k}]
|
|
720
|
+
if (!checkPk(get(v, pkName))) {
|
|
721
|
+
throw new Error(`invalid data[${k}].${pkName}[${get(v, pkName)}]`)
|
|
665
722
|
}
|
|
666
723
|
return v
|
|
667
724
|
})
|
|
@@ -672,6 +729,9 @@ function WOrmPostgresql(opt = {}) {
|
|
|
672
729
|
//rest
|
|
673
730
|
let rest = null
|
|
674
731
|
|
|
732
|
+
//pkv
|
|
733
|
+
let pkv = get(v, pkName)
|
|
734
|
+
|
|
675
735
|
//_v
|
|
676
736
|
let _v = null
|
|
677
737
|
if (true) {
|
|
@@ -681,7 +741,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
681
741
|
type: 'select',
|
|
682
742
|
table: cl,
|
|
683
743
|
where: {
|
|
684
|
-
|
|
744
|
+
[pkName]: pkv,
|
|
685
745
|
},
|
|
686
746
|
// limit: 10,
|
|
687
747
|
// order,
|
|
@@ -710,19 +770,25 @@ function WOrmPostgresql(opt = {}) {
|
|
|
710
770
|
if (iseobj(_v)) {
|
|
711
771
|
|
|
712
772
|
//_vt
|
|
713
|
-
let _vt = omit(_v,
|
|
773
|
+
let _vt = omit(_v, pkName)
|
|
714
774
|
// console.log('_vt', _vt)
|
|
715
775
|
|
|
716
|
-
//vt
|
|
717
|
-
|
|
776
|
+
//vt, [內容相同]之判定基準為[待寫入物件合併進現值後與現值相同],
|
|
777
|
+
//非[待寫入物件與現值全等], 故只給部份欄位且該些欄位值皆與現值相同時視為相同而不寫入,
|
|
778
|
+
//合併採淺層覆蓋, 與後端以EXCLUDED整欄取代之寫入行為一致
|
|
779
|
+
let vt = {
|
|
780
|
+
..._vt,
|
|
781
|
+
...omit(v, pkName),
|
|
782
|
+
}
|
|
718
783
|
// console.log('vt', vt)
|
|
719
784
|
|
|
720
|
-
if (isEqual(
|
|
785
|
+
if (isEqual(vt, _vt)) {
|
|
721
786
|
//相同時不更新
|
|
722
787
|
|
|
723
788
|
//rest
|
|
724
789
|
rest = {
|
|
725
790
|
n: 1,
|
|
791
|
+
nInserted: 0,
|
|
726
792
|
nModified: 0,
|
|
727
793
|
ok: 1,
|
|
728
794
|
}
|
|
@@ -741,6 +807,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
741
807
|
//rest
|
|
742
808
|
rest = {
|
|
743
809
|
n: 0,
|
|
810
|
+
nInserted: 0,
|
|
744
811
|
nModified: 0,
|
|
745
812
|
ok: 1,
|
|
746
813
|
}
|
|
@@ -766,11 +833,11 @@ function WOrmPostgresql(opt = {}) {
|
|
|
766
833
|
// console.log('mr.query', mr.query)
|
|
767
834
|
// console.log('mr.values', mr.values)
|
|
768
835
|
|
|
769
|
-
//添加conflict,
|
|
770
|
-
//此時退回DO NOTHING,
|
|
836
|
+
//添加conflict, 僅有主鍵欄位時genConflictSQL無可更新欄位而回傳空字串,
|
|
837
|
+
//此時退回DO NOTHING, 以免併發插入同一主鍵者報錯
|
|
771
838
|
let conflict = genConflictSQL(v)
|
|
772
839
|
if (!isestr(conflict)) {
|
|
773
|
-
conflict =
|
|
840
|
+
conflict = `ON CONFLICT (${pkName}) DO NOTHING`
|
|
774
841
|
}
|
|
775
842
|
|
|
776
843
|
//sql, xmax為0表該列由本語句插入, 非0表係由DO UPDATE更新而來,
|
|
@@ -791,18 +858,20 @@ function WOrmPostgresql(opt = {}) {
|
|
|
791
858
|
//rest
|
|
792
859
|
rest = {
|
|
793
860
|
n: 1,
|
|
861
|
+
nInserted: 0,
|
|
794
862
|
nModified: 0,
|
|
795
863
|
ok: 1,
|
|
796
864
|
}
|
|
797
865
|
|
|
798
866
|
}
|
|
799
867
|
else if (get(rows, '0.inserted') === true) {
|
|
800
|
-
|
|
868
|
+
//原不存在而插入
|
|
801
869
|
|
|
802
870
|
//rest
|
|
803
871
|
rest = {
|
|
804
872
|
n: 1,
|
|
805
873
|
nInserted: 1,
|
|
874
|
+
nModified: 0,
|
|
806
875
|
ok: 1,
|
|
807
876
|
}
|
|
808
877
|
// console.log('之前不存在且可自動插入', rest, v)
|
|
@@ -814,6 +883,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
814
883
|
//rest
|
|
815
884
|
rest = {
|
|
816
885
|
n: 1,
|
|
886
|
+
nInserted: 0,
|
|
817
887
|
nModified: 1,
|
|
818
888
|
ok: 1,
|
|
819
889
|
}
|
|
@@ -828,6 +898,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
828
898
|
rest = {
|
|
829
899
|
n: 1,
|
|
830
900
|
nInserted: 0,
|
|
901
|
+
nModified: 0,
|
|
831
902
|
ok: 0,
|
|
832
903
|
err: err.message,
|
|
833
904
|
}
|
|
@@ -837,15 +908,15 @@ function WOrmPostgresql(opt = {}) {
|
|
|
837
908
|
}
|
|
838
909
|
else {
|
|
839
910
|
//未開啟autoInsert則僅能更新既有數據, 不可用INSERT以免無中生有,
|
|
840
|
-
//由UPDATE...WHERE
|
|
911
|
+
//由UPDATE...WHERE主鍵原子完成[查找主鍵]與[更新], 併發時不會遺失更新
|
|
841
912
|
|
|
842
913
|
//mr
|
|
843
914
|
let mr = mongoSql.sql({
|
|
844
915
|
type: 'update',
|
|
845
916
|
table: cl,
|
|
846
|
-
updates: omit(v,
|
|
917
|
+
updates: omit(v, pkName),
|
|
847
918
|
where: {
|
|
848
|
-
|
|
919
|
+
[pkName]: pkv,
|
|
849
920
|
},
|
|
850
921
|
})
|
|
851
922
|
// console.log('mr', mr)
|
|
@@ -863,6 +934,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
863
934
|
//rest
|
|
864
935
|
rest = {
|
|
865
936
|
n: 1,
|
|
937
|
+
nInserted: 0,
|
|
866
938
|
nModified: 1,
|
|
867
939
|
ok: 1,
|
|
868
940
|
}
|
|
@@ -875,6 +947,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
875
947
|
//rest
|
|
876
948
|
rest = {
|
|
877
949
|
n: 0,
|
|
950
|
+
nInserted: 0,
|
|
878
951
|
nModified: 0,
|
|
879
952
|
ok: 1,
|
|
880
953
|
}
|
|
@@ -887,6 +960,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
887
960
|
//rest
|
|
888
961
|
rest = {
|
|
889
962
|
n: 1,
|
|
963
|
+
nInserted: 0,
|
|
890
964
|
nModified: 0,
|
|
891
965
|
ok: 0,
|
|
892
966
|
err: err.message,
|
|
@@ -935,9 +1009,14 @@ function WOrmPostgresql(opt = {}) {
|
|
|
935
1009
|
/**
|
|
936
1010
|
* 刪除數據
|
|
937
1011
|
*
|
|
1012
|
+
* 回傳陣列恆與輸入等長,各筆之n與nDeleted皆為主鍵命中筆數,值為0或1,未命中為0且屬正常結果。
|
|
1013
|
+
* 判斷某筆是否真的被刪除一律以nDeleted為準。
|
|
1014
|
+
* 未帶有效主鍵值者為該筆之輸入問題,回ok:0與err且不送查詢,不中斷其餘筆數,
|
|
1015
|
+
* 以此與[主鍵未命中]之ok:1區辨。
|
|
1016
|
+
*
|
|
938
1017
|
* @memberOf WOrmPostgresql
|
|
939
1018
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
940
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
1019
|
+
* @returns {Promise} 回傳Promise,resolve回傳刪除結果陣列[{n,nDeleted,ok}],reject回傳錯誤訊息
|
|
941
1020
|
*/
|
|
942
1021
|
async function del(data) {
|
|
943
1022
|
let isErr = false
|
|
@@ -983,39 +1062,49 @@ function WOrmPostgresql(opt = {}) {
|
|
|
983
1062
|
data = [data]
|
|
984
1063
|
}
|
|
985
1064
|
|
|
986
|
-
//check time
|
|
987
|
-
data = map(data, function(v, k) {
|
|
988
|
-
if (!isDate(v.time)) {
|
|
989
|
-
throw new Error(`invalid data[${k}].time[${v.time}]`)
|
|
990
|
-
}
|
|
991
|
-
return v
|
|
992
|
-
})
|
|
993
|
-
|
|
994
1065
|
//pmSeries
|
|
995
1066
|
res = await pmSeries(data, async(v) => {
|
|
996
1067
|
|
|
997
1068
|
//rest
|
|
998
1069
|
let rest = null
|
|
999
1070
|
|
|
1071
|
+
//pkv
|
|
1072
|
+
let pkv = get(v, pkName)
|
|
1073
|
+
|
|
1074
|
+
//check pk, 未帶有效主鍵者不補值亦不送查詢,
|
|
1075
|
+
//因mongo-sql會將無效值轉為null而誤中其他數據, 故直接視為該筆無法處理
|
|
1076
|
+
if (!checkPk(pkv)) {
|
|
1077
|
+
|
|
1078
|
+
//rest
|
|
1079
|
+
rest = {
|
|
1080
|
+
n: 0,
|
|
1081
|
+
nDeleted: 0,
|
|
1082
|
+
ok: 0,
|
|
1083
|
+
err: `invalid ${pkName}[${pkv}]`,
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
return rest
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1000
1089
|
//mr
|
|
1001
1090
|
let mr = mongoSql.sql({
|
|
1002
1091
|
type: 'delete',
|
|
1003
1092
|
table: cl,
|
|
1004
1093
|
where: {
|
|
1005
|
-
|
|
1094
|
+
[pkName]: pkv,
|
|
1006
1095
|
},
|
|
1007
1096
|
})
|
|
1008
1097
|
// console.log('mr', mr)
|
|
1009
1098
|
// console.log('mr.query', mr.query)
|
|
1010
1099
|
// console.log('mr.values', mr.values)
|
|
1011
1100
|
|
|
1012
|
-
//del
|
|
1101
|
+
//del, n與nDeleted皆為主鍵命中筆數, 未命中為0
|
|
1013
1102
|
await client.query(mr.query, mr.values)
|
|
1014
1103
|
.then((r) => {
|
|
1015
1104
|
|
|
1016
1105
|
//res
|
|
1017
1106
|
rest = {
|
|
1018
|
-
n:
|
|
1107
|
+
n: r.rowCount,
|
|
1019
1108
|
nDeleted: r.rowCount,
|
|
1020
1109
|
ok: 1,
|
|
1021
1110
|
}
|
|
@@ -1072,9 +1161,12 @@ function WOrmPostgresql(opt = {}) {
|
|
|
1072
1161
|
/**
|
|
1073
1162
|
* 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
|
|
1074
1163
|
*
|
|
1164
|
+
* n與nDeleted皆為實際刪除筆數,不取全表筆數。find未給或為空物件時刪除全部數據,
|
|
1165
|
+
* 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
|
|
1166
|
+
*
|
|
1075
1167
|
* @memberOf WOrmPostgresql
|
|
1076
1168
|
* @param {Object} [find={}] 輸入刪除條件物件
|
|
1077
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
1169
|
+
* @returns {Promise} 回傳Promise,resolve回傳刪除結果物件{n,nDeleted,ok},reject回傳錯誤訊息
|
|
1078
1170
|
*/
|
|
1079
1171
|
async function delAll(find = {}) {
|
|
1080
1172
|
let isErr = false
|
|
@@ -1180,7 +1272,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
1180
1272
|
//save
|
|
1181
1273
|
ee.createTable = createTable
|
|
1182
1274
|
ee.select = select
|
|
1183
|
-
ee.
|
|
1275
|
+
ee.selectByPk = selectByPk
|
|
1184
1276
|
ee.insert = insert
|
|
1185
1277
|
ee.save = save
|
|
1186
1278
|
ee.del = del
|