w-orm-postgresql 1.0.7 → 1.0.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/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 +167 -6
- package/docs/WOrmPostgresql.mjs.html +247 -62
- package/docs/index.html +2 -2
- package/g-basic.mjs +15 -1
- package/package.json +2 -2
- package/src/WOrmPostgresql.mjs +245 -60
- package/test/{basic.test.mjs → api-postgresql.test.mjs} +463 -21
package/docs/WOrmPostgresql.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li></ul></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li><li data-type='method'><a href="WOrmPostgresql.html#.selectByTime">selectByTime</a></li></ul></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -678,7 +678,7 @@
|
|
|
678
678
|
|
|
679
679
|
<dt class="tag-source">Source:</dt>
|
|
680
680
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
681
|
-
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#
|
|
681
|
+
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line942">line 942</a>
|
|
682
682
|
</li></ul></dd>
|
|
683
683
|
|
|
684
684
|
|
|
@@ -839,7 +839,7 @@
|
|
|
839
839
|
|
|
840
840
|
<dt class="tag-source">Source:</dt>
|
|
841
841
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
842
|
-
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#
|
|
842
|
+
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line1079">line 1079</a>
|
|
843
843
|
</li></ul></dd>
|
|
844
844
|
|
|
845
845
|
|
|
@@ -1017,7 +1017,7 @@
|
|
|
1017
1017
|
|
|
1018
1018
|
<dt class="tag-source">Source:</dt>
|
|
1019
1019
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1020
|
-
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#
|
|
1020
|
+
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line489">line 489</a>
|
|
1021
1021
|
</li></ul></dd>
|
|
1022
1022
|
|
|
1023
1023
|
|
|
@@ -1178,7 +1178,7 @@
|
|
|
1178
1178
|
|
|
1179
1179
|
<dt class="tag-source">Source:</dt>
|
|
1180
1180
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1181
|
-
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#
|
|
1181
|
+
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line618">line 618</a>
|
|
1182
1182
|
</li></ul></dd>
|
|
1183
1183
|
|
|
1184
1184
|
|
|
@@ -1663,6 +1663,167 @@
|
|
|
1663
1663
|
|
|
1664
1664
|
|
|
1665
1665
|
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
<h4 class="name" id=".selectByTime"><span class="type-signature type-signature-async, static">(async, static) </span>selectByTime<span class="signature">(time)</span><span class="type-signature"> → {Promise}</span></h4>
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
<dl class="details">
|
|
1678
|
+
|
|
1679
|
+
<dt class="tag-description">Description:</dt>
|
|
1680
|
+
<dd class="tag-description"><ul class="dummy"><li><p>由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳</p></li></ul></dd>
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
<dt class="tag-source">Source:</dt>
|
|
1685
|
+
<dd class="tag-source"><ul class="dummy"><li>
|
|
1686
|
+
<a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line377">line 377</a>
|
|
1687
|
+
</li></ul></dd>
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
|
|
1704
|
+
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
|
|
1708
|
+
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
</dl>
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
|
|
1733
|
+
<h5 class="h5-parameters">Parameters:</h5>
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
<table class="params">
|
|
1737
|
+
<thead>
|
|
1738
|
+
<tr>
|
|
1739
|
+
|
|
1740
|
+
<th>Name</th>
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
<th>Type</th>
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
<th class="last">Description</th>
|
|
1750
|
+
</tr>
|
|
1751
|
+
</thead>
|
|
1752
|
+
|
|
1753
|
+
<tbody>
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
<tr>
|
|
1757
|
+
|
|
1758
|
+
<td class="name"><code>time</code></td>
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
<td class="type">
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
<span class="param-type">String</span>
|
|
1765
|
+
|
|
|
1766
|
+
|
|
1767
|
+
<span class="param-type">Date</span>
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
</td>
|
|
1773
|
+
|
|
1774
|
+
|
|
1775
|
+
|
|
1776
|
+
|
|
1777
|
+
|
|
1778
|
+
<td class="description last"><p>輸入主鍵time值,本套件以time欄位為主鍵</p></td>
|
|
1779
|
+
</tr>
|
|
1780
|
+
|
|
1781
|
+
|
|
1782
|
+
</tbody>
|
|
1783
|
+
</table>
|
|
1784
|
+
|
|
1785
|
+
|
|
1786
|
+
|
|
1787
|
+
|
|
1788
|
+
|
|
1789
|
+
|
|
1790
|
+
|
|
1791
|
+
|
|
1792
|
+
|
|
1793
|
+
|
|
1794
|
+
|
|
1795
|
+
|
|
1796
|
+
|
|
1797
|
+
|
|
1798
|
+
|
|
1799
|
+
|
|
1800
|
+
<h5 class="h5-returns">Returns:</h5>
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
<div class="param-desc">
|
|
1804
|
+
<p>回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息</p>
|
|
1805
|
+
</div>
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
<dl class="param-type">
|
|
1810
|
+
<dt>
|
|
1811
|
+
Type
|
|
1812
|
+
</dt>
|
|
1813
|
+
<dd>
|
|
1814
|
+
|
|
1815
|
+
<span class="param-type">Promise</span>
|
|
1816
|
+
|
|
1817
|
+
|
|
1818
|
+
|
|
1819
|
+
</dd>
|
|
1820
|
+
</dl>
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
|
|
1666
1827
|
|
|
1667
1828
|
|
|
1668
1829
|
|
|
@@ -1682,7 +1843,7 @@
|
|
|
1682
1843
|
<br class="clear">
|
|
1683
1844
|
|
|
1684
1845
|
<footer>
|
|
1685
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1846
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 17:59:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1686
1847
|
</footer>
|
|
1687
1848
|
|
|
1688
1849
|
<script>prettyPrint();</script>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li></ul></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li><li data-type='method'><a href="WOrmPostgresql.html#.selectByTime">selectByTime</a></li></ul></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -414,6 +414,118 @@ function WOrmPostgresql(opt = {}) {
|
|
|
414
414
|
return res
|
|
415
415
|
}
|
|
416
416
|
|
|
417
|
+
/**
|
|
418
|
+
* 由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳
|
|
419
|
+
*
|
|
420
|
+
* @memberOf WOrmPostgresql
|
|
421
|
+
* @param {String|Date} time 輸入主鍵time值,本套件以time欄位為主鍵
|
|
422
|
+
* @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息
|
|
423
|
+
*/
|
|
424
|
+
async function selectByTime(time) {
|
|
425
|
+
let isErr = false
|
|
426
|
+
let res = null
|
|
427
|
+
|
|
428
|
+
//check
|
|
429
|
+
if (!isDate(time)) {
|
|
430
|
+
//未給有效主鍵值視為查無數據, 判定基準與insert、save、del內對time之認定一致
|
|
431
|
+
return null
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
//find, 本套件以time欄位為主鍵, 與save、del、genConflictSQL之認定一致
|
|
435
|
+
let find = {
|
|
436
|
+
time,
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
//cache, 與select共用快取, 因快取鍵值由find與order組成, 故此處等同select(find)之結果
|
|
440
|
+
if (useCache) {
|
|
441
|
+
let cache = getCache(find, {})
|
|
442
|
+
if (isarr(cache)) {
|
|
443
|
+
return get(cache, 0, null)
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
//client
|
|
448
|
+
let client = new PgClient({ connectionString })
|
|
449
|
+
|
|
450
|
+
//connect
|
|
451
|
+
try {
|
|
452
|
+
|
|
453
|
+
//connect
|
|
454
|
+
await client.connect()
|
|
455
|
+
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
isErr = true
|
|
459
|
+
res = err
|
|
460
|
+
client = null
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
//check
|
|
464
|
+
if (isErr) {
|
|
465
|
+
return Promise.reject(res)
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
try {
|
|
469
|
+
|
|
470
|
+
//mr, 不使用limit以令結果與select(find)完全等價, 方能安全共用快取,
|
|
471
|
+
//time為主鍵時本就僅回傳1筆, 不會因此多拉數據
|
|
472
|
+
let mr = mongoSql.sql({
|
|
473
|
+
type: 'select',
|
|
474
|
+
table: cl,
|
|
475
|
+
where: find,
|
|
476
|
+
})
|
|
477
|
+
// console.log('mr', mr)
|
|
478
|
+
// console.log('mr.query', mr.query)
|
|
479
|
+
// console.log('mr.values', mr.values)
|
|
480
|
+
|
|
481
|
+
//select
|
|
482
|
+
let r = await client.query(mr.query, mr.values)
|
|
483
|
+
// console.log('r', r)
|
|
484
|
+
|
|
485
|
+
//rows
|
|
486
|
+
let rows = get(r, 'rows')
|
|
487
|
+
|
|
488
|
+
//check
|
|
489
|
+
if (!isarr(rows)) {
|
|
490
|
+
throw new Error(`can not select by time[${time}]`)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
//cache
|
|
494
|
+
if (useCache) {
|
|
495
|
+
setCache(find, {}, rows)
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
//v
|
|
499
|
+
let v = get(rows, 0, null)
|
|
500
|
+
|
|
501
|
+
//check, 判定基準與save、del內對既有數據之認定一致
|
|
502
|
+
if (iseobj(v)) {
|
|
503
|
+
res = v
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
//不存在time, 回傳null
|
|
507
|
+
res = null
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
isErr = true
|
|
513
|
+
res = err
|
|
514
|
+
}
|
|
515
|
+
finally {
|
|
516
|
+
await client.end()
|
|
517
|
+
client = null
|
|
518
|
+
}
|
|
519
|
+
// console.log('res', res)
|
|
520
|
+
|
|
521
|
+
//check
|
|
522
|
+
if (isErr) {
|
|
523
|
+
return Promise.reject(res)
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
return res
|
|
527
|
+
}
|
|
528
|
+
|
|
417
529
|
/**
|
|
418
530
|
* 插入數據
|
|
419
531
|
*
|
|
@@ -483,18 +595,22 @@ function WOrmPostgresql(opt = {}) {
|
|
|
483
595
|
// console.log('mr.query', mr.query)
|
|
484
596
|
// console.log('mr.values', mr.values)
|
|
485
597
|
|
|
486
|
-
|
|
598
|
+
//添加conflict, 令已存在time者跳過而不中斷整批插入, 主鍵認定與genConflictSQL一致
|
|
599
|
+
//由PostgreSQL於單一語句內原子完成[檢查time未存在]與[寫入], 併發時同一time僅有一次成功,
|
|
600
|
+
//同批含重複time時亦僅首筆成功, 故不須逐筆插入即可取得實際插入筆數
|
|
601
|
+
let sql = `${mr.query} ON CONFLICT (time) DO NOTHING`
|
|
602
|
+
|
|
603
|
+
//nAll
|
|
487
604
|
let nAll = size(data)
|
|
488
|
-
let nInsert = nAll //一次插入全部數據加速, 但也因此沒法個別處理conflict, 無法個別計算已插入數量
|
|
489
605
|
|
|
490
|
-
//insert
|
|
491
|
-
await client.query(
|
|
492
|
-
.then(() => {
|
|
606
|
+
//insert, ON CONFLICT DO NOTHING時rowCount即為實際插入筆數
|
|
607
|
+
await client.query(sql, mr.values)
|
|
608
|
+
.then((r) => {
|
|
493
609
|
|
|
494
610
|
//res
|
|
495
611
|
res = {
|
|
496
612
|
n: nAll,
|
|
497
|
-
nInserted:
|
|
613
|
+
nInserted: r.rowCount,
|
|
498
614
|
ok: 1,
|
|
499
615
|
}
|
|
500
616
|
|
|
@@ -635,9 +751,10 @@ function WOrmPostgresql(opt = {}) {
|
|
|
635
751
|
|
|
636
752
|
}
|
|
637
753
|
|
|
638
|
-
|
|
754
|
+
//快速路徑, 先不寫入直接由前述預讀判斷內容是否相同, 內容相同者本就不須寫入,
|
|
755
|
+
//預讀值縱使已被其他寫入者更動而過期亦不影響正確性, 因內容相同時本次save等價於無操作,
|
|
756
|
+
//無操作可視為於預讀當下即已完成, 其後他人之寫入結果與[本次save先執行再輪到他人]相同
|
|
639
757
|
if (iseobj(_v)) {
|
|
640
|
-
//存在
|
|
641
758
|
|
|
642
759
|
//_vt
|
|
643
760
|
let _vt = omit(_v, 'time')
|
|
@@ -658,75 +775,125 @@ function WOrmPostgresql(opt = {}) {
|
|
|
658
775
|
}
|
|
659
776
|
// console.log('相同時不更新', rest, v)
|
|
660
777
|
|
|
778
|
+
return rest
|
|
661
779
|
}
|
|
662
|
-
else {
|
|
663
|
-
//不相同時須更新
|
|
664
|
-
|
|
665
|
-
//mr
|
|
666
|
-
let mr = mongoSql.sql({
|
|
667
|
-
type: 'insert',
|
|
668
|
-
table: cl,
|
|
669
|
-
values: v,
|
|
670
|
-
})
|
|
671
|
-
// console.log('mr', mr)
|
|
672
|
-
// console.log('mr.query', mr.query)
|
|
673
|
-
// console.log('mr.values', mr.values)
|
|
674
780
|
|
|
675
|
-
|
|
676
|
-
|
|
781
|
+
}
|
|
782
|
+
else {
|
|
783
|
+
|
|
784
|
+
//check
|
|
785
|
+
if (!autoInsert) {
|
|
786
|
+
//不存在且未開啟autoInsert則不寫入
|
|
787
|
+
|
|
788
|
+
//rest
|
|
789
|
+
rest = {
|
|
790
|
+
n: 0,
|
|
791
|
+
nModified: 0,
|
|
792
|
+
ok: 1,
|
|
793
|
+
}
|
|
794
|
+
// console.log('不存在', rest, v)
|
|
795
|
+
|
|
796
|
+
return rest
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
//check
|
|
802
|
+
if (autoInsert) {
|
|
803
|
+
//由PostgreSQL於單一語句內原子完成[查找time]與[插入或更新],
|
|
804
|
+
//併發時不會因他方已先插入同一time而報錯, 亦不會有兩方各自讀到同一舊值再各自寫入
|
|
805
|
+
|
|
806
|
+
//mr
|
|
807
|
+
let mr = mongoSql.sql({
|
|
808
|
+
type: 'insert',
|
|
809
|
+
table: cl,
|
|
810
|
+
values: v,
|
|
811
|
+
})
|
|
812
|
+
// console.log('mr', mr)
|
|
813
|
+
// console.log('mr.query', mr.query)
|
|
814
|
+
// console.log('mr.values', mr.values)
|
|
677
815
|
|
|
678
|
-
|
|
679
|
-
|
|
816
|
+
//添加conflict, 僅有time欄位時genConflictSQL無可更新欄位而回傳空字串,
|
|
817
|
+
//此時退回DO NOTHING, 以免併發插入同一time者報錯
|
|
818
|
+
let conflict = genConflictSQL(v)
|
|
819
|
+
if (!isestr(conflict)) {
|
|
820
|
+
conflict = 'ON CONFLICT (time) DO NOTHING'
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
//sql, xmax為0表該列由本語句插入, 非0表係由DO UPDATE更新而來,
|
|
824
|
+
//衝突且落入DO NOTHING時不回傳任何列, 代表該time已存在且未變更
|
|
825
|
+
let sql = `${mr.query} ${conflict} RETURNING (xmax = 0) AS inserted`
|
|
680
826
|
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
827
|
+
//save
|
|
828
|
+
await client.query(sql, mr.values)
|
|
829
|
+
.then((r) => {
|
|
830
|
+
|
|
831
|
+
//rows
|
|
832
|
+
let rows = get(r, 'rows')
|
|
833
|
+
|
|
834
|
+
//check
|
|
835
|
+
if (!isearr(rows)) {
|
|
836
|
+
//衝突且未更新
|
|
684
837
|
|
|
685
838
|
//rest
|
|
686
839
|
rest = {
|
|
687
840
|
n: 1,
|
|
688
|
-
nModified:
|
|
841
|
+
nModified: 0,
|
|
689
842
|
ok: 1,
|
|
690
843
|
}
|
|
691
|
-
// console.log('不相同時須更新', rest, vt)
|
|
692
844
|
|
|
693
|
-
}
|
|
694
|
-
|
|
845
|
+
}
|
|
846
|
+
else if (get(rows, '0.inserted') === true) {
|
|
847
|
+
//原不存在而插入, 回傳形狀同insert
|
|
695
848
|
|
|
696
849
|
//rest
|
|
697
850
|
rest = {
|
|
698
851
|
n: 1,
|
|
699
|
-
|
|
700
|
-
ok:
|
|
701
|
-
err: err.message,
|
|
852
|
+
nInserted: 1,
|
|
853
|
+
ok: 1,
|
|
702
854
|
}
|
|
855
|
+
// console.log('之前不存在且可自動插入', rest, v)
|
|
703
856
|
|
|
704
|
-
}
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
//原已存在而更新
|
|
705
860
|
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
861
|
+
//rest
|
|
862
|
+
rest = {
|
|
863
|
+
n: 1,
|
|
864
|
+
nModified: 1,
|
|
865
|
+
ok: 1,
|
|
866
|
+
}
|
|
867
|
+
// console.log('不相同時須更新', rest, v)
|
|
710
868
|
|
|
711
|
-
|
|
712
|
-
rest = {
|
|
713
|
-
n: 0,
|
|
714
|
-
nModified: 0,
|
|
715
|
-
ok: 1,
|
|
716
|
-
}
|
|
717
|
-
// console.log('不存在', rest, v)
|
|
869
|
+
}
|
|
718
870
|
|
|
719
|
-
|
|
871
|
+
})
|
|
872
|
+
.catch((err) => {
|
|
873
|
+
|
|
874
|
+
//rest
|
|
875
|
+
rest = {
|
|
876
|
+
n: 1,
|
|
877
|
+
nInserted: 0,
|
|
878
|
+
ok: 0,
|
|
879
|
+
err: err.message,
|
|
880
|
+
}
|
|
720
881
|
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
882
|
+
})
|
|
883
|
+
|
|
884
|
+
}
|
|
885
|
+
else {
|
|
886
|
+
//未開啟autoInsert則僅能更新既有數據, 不可用INSERT以免無中生有,
|
|
887
|
+
//由UPDATE...WHERE time原子完成[查找time]與[更新], 併發時不會遺失更新
|
|
724
888
|
|
|
725
889
|
//mr
|
|
726
890
|
let mr = mongoSql.sql({
|
|
727
|
-
type: '
|
|
891
|
+
type: 'update',
|
|
728
892
|
table: cl,
|
|
729
|
-
|
|
893
|
+
updates: omit(v, 'time'),
|
|
894
|
+
where: {
|
|
895
|
+
time: v.time,
|
|
896
|
+
},
|
|
730
897
|
})
|
|
731
898
|
// console.log('mr', mr)
|
|
732
899
|
// console.log('mr.query', mr.query)
|
|
@@ -734,15 +901,32 @@ function WOrmPostgresql(opt = {}) {
|
|
|
734
901
|
|
|
735
902
|
//save
|
|
736
903
|
await client.query(mr.query, mr.values)
|
|
737
|
-
.then(() => {
|
|
904
|
+
.then((r) => {
|
|
905
|
+
|
|
906
|
+
//check
|
|
907
|
+
if (r.rowCount > 0) {
|
|
908
|
+
//已更新
|
|
909
|
+
|
|
910
|
+
//rest
|
|
911
|
+
rest = {
|
|
912
|
+
n: 1,
|
|
913
|
+
nModified: 1,
|
|
914
|
+
ok: 1,
|
|
915
|
+
}
|
|
916
|
+
// console.log('不相同時須更新', rest, v)
|
|
917
|
+
|
|
918
|
+
}
|
|
919
|
+
else {
|
|
920
|
+
//預讀後至更新前已被他人刪除, 視為不存在
|
|
921
|
+
|
|
922
|
+
//rest
|
|
923
|
+
rest = {
|
|
924
|
+
n: 0,
|
|
925
|
+
nModified: 0,
|
|
926
|
+
ok: 1,
|
|
927
|
+
}
|
|
738
928
|
|
|
739
|
-
//rest
|
|
740
|
-
rest = {
|
|
741
|
-
n: 1,
|
|
742
|
-
nInserted: 1,
|
|
743
|
-
ok: 1,
|
|
744
929
|
}
|
|
745
|
-
// console.log('之前不存在且可自動插入', rest, v)
|
|
746
930
|
|
|
747
931
|
})
|
|
748
932
|
.catch((err) => {
|
|
@@ -750,7 +934,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
750
934
|
//rest
|
|
751
935
|
rest = {
|
|
752
936
|
n: 1,
|
|
753
|
-
|
|
937
|
+
nModified: 0,
|
|
754
938
|
ok: 0,
|
|
755
939
|
err: err.message,
|
|
756
940
|
}
|
|
@@ -1043,6 +1227,7 @@ function WOrmPostgresql(opt = {}) {
|
|
|
1043
1227
|
//save
|
|
1044
1228
|
ee.createTable = createTable
|
|
1045
1229
|
ee.select = select
|
|
1230
|
+
ee.selectByTime = selectByTime
|
|
1046
1231
|
ee.insert = insert
|
|
1047
1232
|
ee.save = save
|
|
1048
1233
|
ee.del = del
|
|
@@ -1067,7 +1252,7 @@ export default WOrmPostgresql
|
|
|
1067
1252
|
<br class="clear">
|
|
1068
1253
|
|
|
1069
1254
|
<footer>
|
|
1070
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1255
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 17:59:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1071
1256
|
</footer>
|
|
1072
1257
|
|
|
1073
1258
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li></ul></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li><li data-type='method'><a href="WOrmPostgresql.html#.selectByTime">selectByTime</a></li></ul></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 17:59:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
package/g-basic.mjs
CHANGED
|
@@ -168,6 +168,14 @@ async function test() {
|
|
|
168
168
|
let so = await wo.select({ name: 'rosemary' })
|
|
169
169
|
console.log('select by name', so)
|
|
170
170
|
|
|
171
|
+
//selectByTime
|
|
172
|
+
let sb = await wo.selectByTime('2025-01-01T00:10:00Z')
|
|
173
|
+
console.log('selectByTime', sb)
|
|
174
|
+
|
|
175
|
+
//selectByTime by time not existed
|
|
176
|
+
let sbn = await wo.selectByTime('2024-01-01T00:00:00Z')
|
|
177
|
+
console.log('selectByTime by time not existed', sbn)
|
|
178
|
+
|
|
171
179
|
//select by $and, $gt, $lt
|
|
172
180
|
let spa = await wo.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
|
|
173
181
|
console.log('select by $and, $gt, $lt', spa)
|
|
@@ -287,7 +295,7 @@ async function test() {
|
|
|
287
295
|
}
|
|
288
296
|
test()
|
|
289
297
|
// change delAll
|
|
290
|
-
// delAll then { n:
|
|
298
|
+
// delAll then { n: 0, nDeleted: 0, ok: 1 }
|
|
291
299
|
// change insert
|
|
292
300
|
// insert then { n: 13, nInserted: 13, ok: 1 }
|
|
293
301
|
// change save
|
|
@@ -326,6 +334,12 @@ test()
|
|
|
326
334
|
// { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
|
|
327
335
|
// { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 }
|
|
328
336
|
// ]
|
|
337
|
+
// selectByTime {
|
|
338
|
+
// time: 2025-01-01T00:10:00.000Z,
|
|
339
|
+
// name: 'rosemary(modify)',
|
|
340
|
+
// value: 113.98
|
|
341
|
+
// }
|
|
342
|
+
// selectByTime by time not existed null
|
|
329
343
|
// select by $and, $gt, $lt [
|
|
330
344
|
// { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
|
|
331
345
|
// { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
|