w-orm-postgresql 1.0.7 → 1.0.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/README.md +443 -428
- package/dist/w-orm-postgresql.umd.js +2 -2
- package/dist/w-orm-postgresql.umd.js.map +1 -1
- package/docs/WOrmPostgresql.html +194 -14
- package/docs/WOrmPostgresql.mjs.html +313 -80
- package/docs/index.html +2 -2
- package/g-basic.mjs +23 -9
- package/package.json +2 -2
- package/src/WOrmPostgresql.mjs +311 -78
- package/test/api-postgresql.test.mjs +1458 -0
- package/test/basic.test.mjs +0 -681
package/src/WOrmPostgresql.mjs
CHANGED
|
@@ -368,11 +368,131 @@ function WOrmPostgresql(opt = {}) {
|
|
|
368
368
|
}
|
|
369
369
|
|
|
370
370
|
/**
|
|
371
|
-
*
|
|
371
|
+
* 由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳
|
|
372
|
+
*
|
|
373
|
+
* 函數名依主鍵欄位命名為selectByTime而不另掛selectById別名,因本套件之主鍵為具業務語義之time,
|
|
374
|
+
* 與以無語義識別碼為主鍵者性質不同,該差異須由呼叫端知悉而非由別名掩蓋。
|
|
375
|
+
* 主鍵未命中或主鍵值無效皆回傳null而不reject,命中之判定基準與insert、save、del內對既有數據之認定一致。
|
|
376
|
+
*
|
|
377
|
+
* @memberOf WOrmPostgresql
|
|
378
|
+
* @param {String|Date} time 輸入主鍵time值,本套件以time欄位為主鍵
|
|
379
|
+
* @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息
|
|
380
|
+
*/
|
|
381
|
+
async function selectByTime(time) {
|
|
382
|
+
let isErr = false
|
|
383
|
+
let res = null
|
|
384
|
+
|
|
385
|
+
//check
|
|
386
|
+
if (!isDate(time)) {
|
|
387
|
+
//未給有效主鍵值視為查無數據, 判定基準與insert、save、del內對time之認定一致
|
|
388
|
+
return null
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
//find, 本套件以time欄位為主鍵, 與save、del、genConflictSQL之認定一致
|
|
392
|
+
let find = {
|
|
393
|
+
time,
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
//cache, 與select共用快取, 因快取鍵值由find與order組成, 故此處等同select(find)之結果
|
|
397
|
+
if (useCache) {
|
|
398
|
+
let cache = getCache(find, {})
|
|
399
|
+
if (isarr(cache)) {
|
|
400
|
+
return get(cache, 0, null)
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
//client
|
|
405
|
+
let client = new PgClient({ connectionString })
|
|
406
|
+
|
|
407
|
+
//connect
|
|
408
|
+
try {
|
|
409
|
+
|
|
410
|
+
//connect
|
|
411
|
+
await client.connect()
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
isErr = true
|
|
416
|
+
res = err
|
|
417
|
+
client = null
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
//check
|
|
421
|
+
if (isErr) {
|
|
422
|
+
return Promise.reject(res)
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
try {
|
|
426
|
+
|
|
427
|
+
//mr, 不使用limit以令結果與select(find)完全等價, 方能安全共用快取,
|
|
428
|
+
//time為主鍵時本就僅回傳1筆, 不會因此多拉數據
|
|
429
|
+
let mr = mongoSql.sql({
|
|
430
|
+
type: 'select',
|
|
431
|
+
table: cl,
|
|
432
|
+
where: find,
|
|
433
|
+
})
|
|
434
|
+
// console.log('mr', mr)
|
|
435
|
+
// console.log('mr.query', mr.query)
|
|
436
|
+
// console.log('mr.values', mr.values)
|
|
437
|
+
|
|
438
|
+
//select
|
|
439
|
+
let r = await client.query(mr.query, mr.values)
|
|
440
|
+
// console.log('r', r)
|
|
441
|
+
|
|
442
|
+
//rows
|
|
443
|
+
let rows = get(r, 'rows')
|
|
444
|
+
|
|
445
|
+
//check
|
|
446
|
+
if (!isarr(rows)) {
|
|
447
|
+
throw new Error(`can not select by time[${time}]`)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
//cache
|
|
451
|
+
if (useCache) {
|
|
452
|
+
setCache(find, {}, rows)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
//v
|
|
456
|
+
let v = get(rows, 0, null)
|
|
457
|
+
|
|
458
|
+
//check, 判定基準與save、del內對既有數據之認定一致
|
|
459
|
+
if (iseobj(v)) {
|
|
460
|
+
res = v
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
//不存在time, 回傳null
|
|
464
|
+
res = null
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
}
|
|
468
|
+
catch (err) {
|
|
469
|
+
isErr = true
|
|
470
|
+
res = err
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
await client.end()
|
|
474
|
+
client = null
|
|
475
|
+
}
|
|
476
|
+
// console.log('res', res)
|
|
477
|
+
|
|
478
|
+
//check
|
|
479
|
+
if (isErr) {
|
|
480
|
+
return Promise.reject(res)
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return res
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* 插入數據,僅於主鍵time不存在時寫入,已存在者跳過且不覆寫
|
|
488
|
+
*
|
|
489
|
+
* n為輸入筆數,即本次嘗試插入之基準;nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果,
|
|
490
|
+
* 不視為錯誤。同批含重複time時僅首筆計入nInserted。
|
|
491
|
+
* 因主鍵time承載觀測時間之業務意義,未帶有效time時不自動補值,一律以reject回報。
|
|
372
492
|
*
|
|
373
493
|
* @memberOf WOrmPostgresql
|
|
374
494
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
375
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
495
|
+
* @returns {Promise} 回傳Promise,resolve回傳插入結果物件{n,nInserted,ok},reject回傳錯誤訊息
|
|
376
496
|
*/
|
|
377
497
|
async function insert(data) {
|
|
378
498
|
let isErr = false
|
|
@@ -436,18 +556,22 @@ function WOrmPostgresql(opt = {}) {
|
|
|
436
556
|
// console.log('mr.query', mr.query)
|
|
437
557
|
// console.log('mr.values', mr.values)
|
|
438
558
|
|
|
439
|
-
|
|
559
|
+
//添加conflict, 令已存在time者跳過而不中斷整批插入, 主鍵認定與genConflictSQL一致
|
|
560
|
+
//由PostgreSQL於單一語句內原子完成[檢查time未存在]與[寫入], 併發時同一time僅有一次成功,
|
|
561
|
+
//同批含重複time時亦僅首筆成功, 故不須逐筆插入即可取得實際插入筆數
|
|
562
|
+
let sql = `${mr.query} ON CONFLICT (time) DO NOTHING`
|
|
563
|
+
|
|
564
|
+
//nAll
|
|
440
565
|
let nAll = size(data)
|
|
441
|
-
let nInsert = nAll //一次插入全部數據加速, 但也因此沒法個別處理conflict, 無法個別計算已插入數量
|
|
442
566
|
|
|
443
|
-
//insert
|
|
444
|
-
await client.query(
|
|
445
|
-
.then(() => {
|
|
567
|
+
//insert, ON CONFLICT DO NOTHING時rowCount即為實際插入筆數
|
|
568
|
+
await client.query(sql, mr.values)
|
|
569
|
+
.then((r) => {
|
|
446
570
|
|
|
447
571
|
//res
|
|
448
572
|
res = {
|
|
449
573
|
n: nAll,
|
|
450
|
-
nInserted:
|
|
574
|
+
nInserted: r.rowCount,
|
|
451
575
|
ok: 1,
|
|
452
576
|
}
|
|
453
577
|
|
|
@@ -491,13 +615,21 @@ function WOrmPostgresql(opt = {}) {
|
|
|
491
615
|
}
|
|
492
616
|
|
|
493
617
|
/**
|
|
494
|
-
*
|
|
618
|
+
* 儲存數據,以主鍵time為準更新既有數據,未給之欄位保留
|
|
619
|
+
*
|
|
620
|
+
* 回傳陣列恆與輸入等長,輸入單一物件亦回傳長度1之陣列。
|
|
621
|
+
* 各筆之n為主鍵命中筆數,值為0或1,命中(不論內容有無變更)或經插入而產生皆為1;
|
|
622
|
+
* nInserted與nModified恆同時出現,無對應行為時填0。
|
|
623
|
+
* [內容相同]之判定基準為待寫入物件合併進現值後與現值相同,非待寫入物件與現值全等,
|
|
624
|
+
* 故只給部份欄位且該些欄位值皆與現值相同時,合併結果等於現值,nModified為0,
|
|
625
|
+
* 令nModified忠實反映資料庫端是否真的寫入。
|
|
626
|
+
* 因主鍵time承載觀測時間之業務意義,未帶有效time時不自動補值,一律以reject回報。
|
|
495
627
|
*
|
|
496
628
|
* @memberOf WOrmPostgresql
|
|
497
629
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
498
630
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
499
631
|
* @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
|
|
500
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
632
|
+
* @returns {Promise} 回傳Promise,resolve回傳儲存結果陣列[{n,nInserted,nModified,ok}],reject回傳錯誤訊息
|
|
501
633
|
*/
|
|
502
634
|
async function save(data, option = {}) {
|
|
503
635
|
let isErr = false
|
|
@@ -588,98 +720,160 @@ function WOrmPostgresql(opt = {}) {
|
|
|
588
720
|
|
|
589
721
|
}
|
|
590
722
|
|
|
591
|
-
|
|
723
|
+
//快速路徑, 先不寫入直接由前述預讀判斷內容是否相同, 內容相同者本就不須寫入,
|
|
724
|
+
//預讀值縱使已被其他寫入者更動而過期亦不影響正確性, 因內容相同時本次save等價於無操作,
|
|
725
|
+
//無操作可視為於預讀當下即已完成, 其後他人之寫入結果與[本次save先執行再輪到他人]相同
|
|
592
726
|
if (iseobj(_v)) {
|
|
593
|
-
//存在
|
|
594
727
|
|
|
595
728
|
//_vt
|
|
596
729
|
let _vt = omit(_v, 'time')
|
|
597
730
|
// console.log('_vt', _vt)
|
|
598
731
|
|
|
599
|
-
//vt
|
|
600
|
-
|
|
732
|
+
//vt, [內容相同]之判定基準為[待寫入物件合併進現值後與現值相同],
|
|
733
|
+
//非[待寫入物件與現值全等], 故只給部份欄位且該些欄位值皆與現值相同時視為相同而不寫入,
|
|
734
|
+
//合併採淺層覆蓋, 與後端以EXCLUDED整欄取代之寫入行為一致
|
|
735
|
+
let vt = {
|
|
736
|
+
..._vt,
|
|
737
|
+
...omit(v, 'time'),
|
|
738
|
+
}
|
|
601
739
|
// console.log('vt', vt)
|
|
602
740
|
|
|
603
|
-
if (isEqual(
|
|
741
|
+
if (isEqual(vt, _vt)) {
|
|
604
742
|
//相同時不更新
|
|
605
743
|
|
|
606
744
|
//rest
|
|
607
745
|
rest = {
|
|
608
746
|
n: 1,
|
|
747
|
+
nInserted: 0,
|
|
609
748
|
nModified: 0,
|
|
610
749
|
ok: 1,
|
|
611
750
|
}
|
|
612
751
|
// console.log('相同時不更新', rest, v)
|
|
613
752
|
|
|
753
|
+
return rest
|
|
614
754
|
}
|
|
615
|
-
else {
|
|
616
|
-
//不相同時須更新
|
|
617
|
-
|
|
618
|
-
//mr
|
|
619
|
-
let mr = mongoSql.sql({
|
|
620
|
-
type: 'insert',
|
|
621
|
-
table: cl,
|
|
622
|
-
values: v,
|
|
623
|
-
})
|
|
624
|
-
// console.log('mr', mr)
|
|
625
|
-
// console.log('mr.query', mr.query)
|
|
626
|
-
// console.log('mr.values', mr.values)
|
|
627
755
|
|
|
628
|
-
|
|
629
|
-
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
|
|
759
|
+
//check
|
|
760
|
+
if (!autoInsert) {
|
|
761
|
+
//不存在且未開啟autoInsert則不寫入
|
|
762
|
+
|
|
763
|
+
//rest
|
|
764
|
+
rest = {
|
|
765
|
+
n: 0,
|
|
766
|
+
nInserted: 0,
|
|
767
|
+
nModified: 0,
|
|
768
|
+
ok: 1,
|
|
769
|
+
}
|
|
770
|
+
// console.log('不存在', rest, v)
|
|
771
|
+
|
|
772
|
+
return rest
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
//check
|
|
778
|
+
if (autoInsert) {
|
|
779
|
+
//由PostgreSQL於單一語句內原子完成[查找time]與[插入或更新],
|
|
780
|
+
//併發時不會因他方已先插入同一time而報錯, 亦不會有兩方各自讀到同一舊值再各自寫入
|
|
781
|
+
|
|
782
|
+
//mr
|
|
783
|
+
let mr = mongoSql.sql({
|
|
784
|
+
type: 'insert',
|
|
785
|
+
table: cl,
|
|
786
|
+
values: v,
|
|
787
|
+
})
|
|
788
|
+
// console.log('mr', mr)
|
|
789
|
+
// console.log('mr.query', mr.query)
|
|
790
|
+
// console.log('mr.values', mr.values)
|
|
791
|
+
|
|
792
|
+
//添加conflict, 僅有time欄位時genConflictSQL無可更新欄位而回傳空字串,
|
|
793
|
+
//此時退回DO NOTHING, 以免併發插入同一time者報錯
|
|
794
|
+
let conflict = genConflictSQL(v)
|
|
795
|
+
if (!isestr(conflict)) {
|
|
796
|
+
conflict = 'ON CONFLICT (time) DO NOTHING'
|
|
797
|
+
}
|
|
630
798
|
|
|
631
|
-
|
|
632
|
-
|
|
799
|
+
//sql, xmax為0表該列由本語句插入, 非0表係由DO UPDATE更新而來,
|
|
800
|
+
//衝突且落入DO NOTHING時不回傳任何列, 代表該time已存在且未變更
|
|
801
|
+
let sql = `${mr.query} ${conflict} RETURNING (xmax = 0) AS inserted`
|
|
633
802
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
803
|
+
//save
|
|
804
|
+
await client.query(sql, mr.values)
|
|
805
|
+
.then((r) => {
|
|
806
|
+
|
|
807
|
+
//rows
|
|
808
|
+
let rows = get(r, 'rows')
|
|
809
|
+
|
|
810
|
+
//check
|
|
811
|
+
if (!isearr(rows)) {
|
|
812
|
+
//衝突且未更新
|
|
637
813
|
|
|
638
814
|
//rest
|
|
639
815
|
rest = {
|
|
640
816
|
n: 1,
|
|
641
|
-
|
|
817
|
+
nInserted: 0,
|
|
818
|
+
nModified: 0,
|
|
642
819
|
ok: 1,
|
|
643
820
|
}
|
|
644
|
-
// console.log('不相同時須更新', rest, vt)
|
|
645
821
|
|
|
646
|
-
}
|
|
647
|
-
|
|
822
|
+
}
|
|
823
|
+
else if (get(rows, '0.inserted') === true) {
|
|
824
|
+
//原不存在而插入
|
|
648
825
|
|
|
649
826
|
//rest
|
|
650
827
|
rest = {
|
|
651
828
|
n: 1,
|
|
829
|
+
nInserted: 1,
|
|
652
830
|
nModified: 0,
|
|
653
|
-
ok:
|
|
654
|
-
err: err.message,
|
|
831
|
+
ok: 1,
|
|
655
832
|
}
|
|
833
|
+
// console.log('之前不存在且可自動插入', rest, v)
|
|
656
834
|
|
|
657
|
-
}
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
//原已存在而更新
|
|
658
838
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
839
|
+
//rest
|
|
840
|
+
rest = {
|
|
841
|
+
n: 1,
|
|
842
|
+
nInserted: 0,
|
|
843
|
+
nModified: 1,
|
|
844
|
+
ok: 1,
|
|
845
|
+
}
|
|
846
|
+
// console.log('不相同時須更新', rest, v)
|
|
663
847
|
|
|
664
|
-
|
|
665
|
-
rest = {
|
|
666
|
-
n: 0,
|
|
667
|
-
nModified: 0,
|
|
668
|
-
ok: 1,
|
|
669
|
-
}
|
|
670
|
-
// console.log('不存在', rest, v)
|
|
848
|
+
}
|
|
671
849
|
|
|
672
|
-
|
|
850
|
+
})
|
|
851
|
+
.catch((err) => {
|
|
673
852
|
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
853
|
+
//rest
|
|
854
|
+
rest = {
|
|
855
|
+
n: 1,
|
|
856
|
+
nInserted: 0,
|
|
857
|
+
nModified: 0,
|
|
858
|
+
ok: 0,
|
|
859
|
+
err: err.message,
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
})
|
|
863
|
+
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
//未開啟autoInsert則僅能更新既有數據, 不可用INSERT以免無中生有,
|
|
867
|
+
//由UPDATE...WHERE time原子完成[查找time]與[更新], 併發時不會遺失更新
|
|
677
868
|
|
|
678
869
|
//mr
|
|
679
870
|
let mr = mongoSql.sql({
|
|
680
|
-
type: '
|
|
871
|
+
type: 'update',
|
|
681
872
|
table: cl,
|
|
682
|
-
|
|
873
|
+
updates: omit(v, 'time'),
|
|
874
|
+
where: {
|
|
875
|
+
time: v.time,
|
|
876
|
+
},
|
|
683
877
|
})
|
|
684
878
|
// console.log('mr', mr)
|
|
685
879
|
// console.log('mr.query', mr.query)
|
|
@@ -687,15 +881,34 @@ function WOrmPostgresql(opt = {}) {
|
|
|
687
881
|
|
|
688
882
|
//save
|
|
689
883
|
await client.query(mr.query, mr.values)
|
|
690
|
-
.then(() => {
|
|
884
|
+
.then((r) => {
|
|
885
|
+
|
|
886
|
+
//check
|
|
887
|
+
if (r.rowCount > 0) {
|
|
888
|
+
//已更新
|
|
889
|
+
|
|
890
|
+
//rest
|
|
891
|
+
rest = {
|
|
892
|
+
n: 1,
|
|
893
|
+
nInserted: 0,
|
|
894
|
+
nModified: 1,
|
|
895
|
+
ok: 1,
|
|
896
|
+
}
|
|
897
|
+
// console.log('不相同時須更新', rest, v)
|
|
898
|
+
|
|
899
|
+
}
|
|
900
|
+
else {
|
|
901
|
+
//預讀後至更新前已被他人刪除, 視為不存在
|
|
902
|
+
|
|
903
|
+
//rest
|
|
904
|
+
rest = {
|
|
905
|
+
n: 0,
|
|
906
|
+
nInserted: 0,
|
|
907
|
+
nModified: 0,
|
|
908
|
+
ok: 1,
|
|
909
|
+
}
|
|
691
910
|
|
|
692
|
-
//rest
|
|
693
|
-
rest = {
|
|
694
|
-
n: 1,
|
|
695
|
-
nInserted: 1,
|
|
696
|
-
ok: 1,
|
|
697
911
|
}
|
|
698
|
-
// console.log('之前不存在且可自動插入', rest, v)
|
|
699
912
|
|
|
700
913
|
})
|
|
701
914
|
.catch((err) => {
|
|
@@ -704,6 +917,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
704
917
|
rest = {
|
|
705
918
|
n: 1,
|
|
706
919
|
nInserted: 0,
|
|
920
|
+
nModified: 0,
|
|
707
921
|
ok: 0,
|
|
708
922
|
err: err.message,
|
|
709
923
|
}
|
|
@@ -751,9 +965,14 @@ function WOrmPostgresql(opt = {}) {
|
|
|
751
965
|
/**
|
|
752
966
|
* 刪除數據
|
|
753
967
|
*
|
|
968
|
+
* 回傳陣列恆與輸入等長,各筆之n與nDeleted皆為主鍵命中筆數,值為0或1,未命中為0且屬正常結果。
|
|
969
|
+
* 判斷某筆是否真的被刪除一律以nDeleted為準。
|
|
970
|
+
* 未帶有效time者為該筆之輸入問題,回ok:0與err且不送查詢,不中斷其餘筆數,
|
|
971
|
+
* 以此與[主鍵未命中]之ok:1區辨。
|
|
972
|
+
*
|
|
754
973
|
* @memberOf WOrmPostgresql
|
|
755
974
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
756
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
975
|
+
* @returns {Promise} 回傳Promise,resolve回傳刪除結果陣列[{n,nDeleted,ok}],reject回傳錯誤訊息
|
|
757
976
|
*/
|
|
758
977
|
async function del(data) {
|
|
759
978
|
let isErr = false
|
|
@@ -799,39 +1018,49 @@ function WOrmPostgresql(opt = {}) {
|
|
|
799
1018
|
data = [data]
|
|
800
1019
|
}
|
|
801
1020
|
|
|
802
|
-
//check time
|
|
803
|
-
data = map(data, function(v, k) {
|
|
804
|
-
if (!isDate(v.time)) {
|
|
805
|
-
throw new Error(`invalid data[${k}].time[${v.time}]`)
|
|
806
|
-
}
|
|
807
|
-
return v
|
|
808
|
-
})
|
|
809
|
-
|
|
810
1021
|
//pmSeries
|
|
811
1022
|
res = await pmSeries(data, async(v) => {
|
|
812
1023
|
|
|
813
1024
|
//rest
|
|
814
1025
|
let rest = null
|
|
815
1026
|
|
|
1027
|
+
//time
|
|
1028
|
+
let time = get(v, 'time')
|
|
1029
|
+
|
|
1030
|
+
//check time, 未帶有效主鍵者不補值亦不送查詢,
|
|
1031
|
+
//因mongo-sql會將無效值轉為null而誤中其他數據, 故直接視為該筆無法處理
|
|
1032
|
+
if (!isDate(time)) {
|
|
1033
|
+
|
|
1034
|
+
//rest
|
|
1035
|
+
rest = {
|
|
1036
|
+
n: 0,
|
|
1037
|
+
nDeleted: 0,
|
|
1038
|
+
ok: 0,
|
|
1039
|
+
err: `invalid time[${time}]`,
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
return rest
|
|
1043
|
+
}
|
|
1044
|
+
|
|
816
1045
|
//mr
|
|
817
1046
|
let mr = mongoSql.sql({
|
|
818
1047
|
type: 'delete',
|
|
819
1048
|
table: cl,
|
|
820
1049
|
where: {
|
|
821
|
-
time
|
|
1050
|
+
time,
|
|
822
1051
|
},
|
|
823
1052
|
})
|
|
824
1053
|
// console.log('mr', mr)
|
|
825
1054
|
// console.log('mr.query', mr.query)
|
|
826
1055
|
// console.log('mr.values', mr.values)
|
|
827
1056
|
|
|
828
|
-
//del
|
|
1057
|
+
//del, n與nDeleted皆為主鍵命中筆數, 未命中為0
|
|
829
1058
|
await client.query(mr.query, mr.values)
|
|
830
1059
|
.then((r) => {
|
|
831
1060
|
|
|
832
1061
|
//res
|
|
833
1062
|
rest = {
|
|
834
|
-
n:
|
|
1063
|
+
n: r.rowCount,
|
|
835
1064
|
nDeleted: r.rowCount,
|
|
836
1065
|
ok: 1,
|
|
837
1066
|
}
|
|
@@ -888,9 +1117,12 @@ function WOrmPostgresql(opt = {}) {
|
|
|
888
1117
|
/**
|
|
889
1118
|
* 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
|
|
890
1119
|
*
|
|
1120
|
+
* n與nDeleted皆為實際刪除筆數,不取全表筆數。find未給或為空物件時刪除全部數據,
|
|
1121
|
+
* 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
|
|
1122
|
+
*
|
|
891
1123
|
* @memberOf WOrmPostgresql
|
|
892
1124
|
* @param {Object} [find={}] 輸入刪除條件物件
|
|
893
|
-
* @returns {Promise} 回傳Promise,resolve
|
|
1125
|
+
* @returns {Promise} 回傳Promise,resolve回傳刪除結果物件{n,nDeleted,ok},reject回傳錯誤訊息
|
|
894
1126
|
*/
|
|
895
1127
|
async function delAll(find = {}) {
|
|
896
1128
|
let isErr = false
|
|
@@ -996,6 +1228,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
996
1228
|
//save
|
|
997
1229
|
ee.createTable = createTable
|
|
998
1230
|
ee.select = select
|
|
1231
|
+
ee.selectByTime = selectByTime
|
|
999
1232
|
ee.insert = insert
|
|
1000
1233
|
ee.save = save
|
|
1001
1234
|
ee.del = del
|