w-orm-reladb 1.1.9 → 1.1.11
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 +100 -28
- package/dist/w-orm-reladb.umd.js +2 -2
- package/dist/w-orm-reladb.umd.js.map +1 -1
- package/docs/WOrmReladb.html +62 -32
- package/docs/WOrmReladb.mjs.html +101 -29
- package/docs/cvFind.mjs.html +253 -410
- package/docs/global.html +336 -12
- package/docs/importModels.mjs.html +2 -2
- package/docs/index.html +2 -2
- package/g-mssql-transaction-commit.mjs +1 -1
- package/g-mssql-transaction-rollback.mjs +1 -1
- package/g-mssql.mjs +4 -4
- package/g-sqlite-encryption-transaction-commit.mjs +1 -1
- package/g-sqlite-encryption.mjs +4 -4
- package/g-sqlite-transaction-commit.mjs +1 -1
- package/g-sqlite-transaction-rollback.mjs +1 -1
- package/g-sqlite.mjs +4 -4
- package/models/tdate.js +38 -0
- package/models/tdatei.js +20 -0
- package/models/tfind.js +50 -0
- package/package.json +3 -3
- package/src/WOrmReladb.mjs +99 -27
- package/src/cvFind.mjs +251 -408
- package/test/api-date-write.mjs +467 -0
- package/test/api-find-whitelist.mjs +390 -0
- package/test/api-mssql.test.mjs +4 -0
- package/test/api-sqlite.test.mjs +4 -0
- package/test/api-suite.mjs +95 -136
- package/test/tools/withTz.mjs +43 -0
- package/test/unit-cvfind.test.mjs +241 -218
- package/test/unit-date-write.test.mjs +457 -0
package/docs/WOrmReladb.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="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#genDateChecker">genDateChecker</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#inDateRange">inDateRange</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -750,7 +750,7 @@
|
|
|
750
750
|
|
|
751
751
|
<dt class="tag-source">Source:</dt>
|
|
752
752
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
753
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
753
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line546">line 546</a>
|
|
754
754
|
</li></ul></dd>
|
|
755
755
|
|
|
756
756
|
|
|
@@ -858,7 +858,7 @@
|
|
|
858
858
|
|
|
859
859
|
<dt class="tag-source">Source:</dt>
|
|
860
860
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
861
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
861
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1788">line 1788</a>
|
|
862
862
|
</li></ul></dd>
|
|
863
863
|
|
|
864
864
|
|
|
@@ -972,7 +972,7 @@
|
|
|
972
972
|
|
|
973
973
|
<dt class="tag-source">Source:</dt>
|
|
974
974
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
975
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
975
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1481">line 1481</a>
|
|
976
976
|
</li></ul></dd>
|
|
977
977
|
|
|
978
978
|
|
|
@@ -1293,18 +1293,32 @@
|
|
|
1293
1293
|
<dl class="details">
|
|
1294
1294
|
|
|
1295
1295
|
<dt class="tag-description">Description:</dt>
|
|
1296
|
-
<dd class="tag-description"><ul class="dummy"><li><p
|
|
1296
|
+
<dd class="tag-description"><ul class="dummy"><li><p>依條件刪除多筆數據(破壞性操作, 須審慎使用, 非必要不用; 刪除單筆請用del), 需與del分開,避免未傳數據導致直接刪除全表</p>
|
|
1297
|
+
<p>使用須知:</p>
|
|
1298
|
+
<ol>
|
|
1299
|
+
<li>不給條件即刪除全部數據: find未給、為undefined或為{}時, 刪除資料表內全部數據, 不另行確認。給了條件才是部分刪除。</li>
|
|
1300
|
+
<li>傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
1301
|
+
一律整批reject, 不視為{}, 不刪除任何數據。</li>
|
|
1302
|
+
<li>條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
1303
|
+
$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
1304
|
+
null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
1305
|
+
sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、子查詢、函數值、Symbol鍵、undefined值、
|
|
1306
|
+
空的$nin/$and/$or等一律整批reject, 訊息為invalid find: 原因 at [路徑], 且不刪除任何數據。</li>
|
|
1307
|
+
<li>與select共用同一檢核與同一條件, select(find)命中之數據即本函數刪除之數據; 建議先以select(find)確認命中範圍再刪除。
|
|
1308
|
+
欄名須完全等於model之屬性名或資料庫欄名(區分大小寫); 純量須符合欄位型別; 主鍵欄之條件值依主鍵欄型別正規化。</li>
|
|
1309
|
+
<li>條件值若來自可能為undefined、null或空陣列之變數, 呼叫端須先自行判斷; undefined值會reject而非被忽略,
|
|
1310
|
+
空的$nin會reject, $in:[]則為恆假(刪除0筆)。</li>
|
|
1311
|
+
<li>語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
1312
|
+
排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。</li>
|
|
1313
|
+
</ol>
|
|
1297
1314
|
<p>註: n與nDeleted皆為實際刪除筆數,兩者恆相等,n不得取全表筆數
|
|
1298
|
-
註:
|
|
1299
|
-
註: find由cvFind轉譯且與select共用,刪除之數據即select(find)命中之數據;支援之條件與限制同select
|
|
1300
|
-
註: 不支援之運算子、非純量之值、與欄位型別不符之純量一律reject並發出error事件,不刪除任何數據;主鍵欄之條件值依主鍵欄型別正規化,同select
|
|
1301
|
-
註: find非物件(null、陣列、字串、數字)時刪除全部數據,此為現況保留,系列規格另案處理</p></li></ul></dd>
|
|
1315
|
+
註: 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤</p></li></ul></dd>
|
|
1302
1316
|
|
|
1303
1317
|
|
|
1304
1318
|
|
|
1305
1319
|
<dt class="tag-source">Source:</dt>
|
|
1306
1320
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1307
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
1321
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1683">line 1683</a>
|
|
1308
1322
|
</li></ul></dd>
|
|
1309
1323
|
|
|
1310
1324
|
|
|
@@ -1413,7 +1427,7 @@
|
|
|
1413
1427
|
</td>
|
|
1414
1428
|
|
|
1415
1429
|
|
|
1416
|
-
<td class="description last"><p
|
|
1430
|
+
<td class="description last"><p>輸入刪除條件物件(系列白名單, 見使用須知),不給予find則代表刪除全部數據</p></td>
|
|
1417
1431
|
</tr>
|
|
1418
1432
|
|
|
1419
1433
|
|
|
@@ -1634,7 +1648,7 @@
|
|
|
1634
1648
|
|
|
1635
1649
|
<dt class="tag-source">Source:</dt>
|
|
1636
1650
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1637
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
1651
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1830">line 1830</a>
|
|
1638
1652
|
</li></ul></dd>
|
|
1639
1653
|
|
|
1640
1654
|
|
|
@@ -2162,7 +2176,7 @@
|
|
|
2162
2176
|
|
|
2163
2177
|
<dt class="tag-source">Source:</dt>
|
|
2164
2178
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
2165
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
2179
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1878">line 1878</a>
|
|
2166
2180
|
</li></ul></dd>
|
|
2167
2181
|
|
|
2168
2182
|
|
|
@@ -2467,7 +2481,7 @@
|
|
|
2467
2481
|
|
|
2468
2482
|
<dt class="tag-source">Source:</dt>
|
|
2469
2483
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
2470
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
2484
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line562">line 562</a>
|
|
2471
2485
|
</li></ul></dd>
|
|
2472
2486
|
|
|
2473
2487
|
|
|
@@ -2575,7 +2589,7 @@
|
|
|
2575
2589
|
|
|
2576
2590
|
<dt class="tag-source">Source:</dt>
|
|
2577
2591
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
2578
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
2592
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line479">line 479</a>
|
|
2579
2593
|
</li></ul></dd>
|
|
2580
2594
|
|
|
2581
2595
|
|
|
@@ -2753,6 +2767,10 @@
|
|
|
2753
2767
|
註: 同批含重複主鍵時僅首筆計入nInserted,其餘視為已存在
|
|
2754
2768
|
註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
2755
2769
|
註: 主鍵值依主鍵欄型別正規化後寫入(字串類主鍵欄之123存為'123');型別不符(整數類主鍵欄給'012'等)即reject且同批皆不寫入,不以自動產生之主鍵取代
|
|
2770
|
+
註: DATE、DATEONLY欄之值(Date、epoch數值、日期字串)換算後年份須在1–9999(DATE依UTC,DATEONLY依存入之日期文字),範圍外者(如new Date(8.64e15)、'+010000-01-01T00:00:00Z')即reject且同批皆不寫入,
|
|
2771
|
+
錯誤訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],不回顯值;sqlite以文字存日期,範圍外年份之文字與時間序不一致,會使以日期為條件之delAll刪錯列,
|
|
2772
|
+
故兩方言一律於送出前拒收;無效時間(Invalid Date、NaN、無法解析之字串、空字串等,sqlite會存為字典序大於任何年份之文字Invalid date,mssql則由資料庫報錯)亦一併reject;
|
|
2773
|
+
庫內既有之範圍外日期不遷移,須自行清理或改寫(見README)
|
|
2756
2774
|
註: option.returnList開啟時改回與輸入等長且保序之逐筆結果陣列[{n,nInserted,ok}],
|
|
2757
2775
|
聚合計數只答得出[有幾筆是新的]而答不出[是哪幾筆],而後者正是去重之產出物;
|
|
2758
2776
|
逐筆元素之n與ok恆為1,資訊由nInserted承載,不變式為
|
|
@@ -2762,7 +2780,7 @@
|
|
|
2762
2780
|
|
|
2763
2781
|
<dt class="tag-source">Source:</dt>
|
|
2764
2782
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
2765
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
2783
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line843">line 843</a>
|
|
2766
2784
|
</li></ul></dd>
|
|
2767
2785
|
|
|
2768
2786
|
|
|
@@ -3132,6 +3150,8 @@
|
|
|
3132
3150
|
註: 不提供逐筆結果,故不出現ok為0與err;需要逐筆處置者改用insert
|
|
3133
3151
|
註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
3134
3152
|
註: 主鍵值依主鍵欄型別正規化後寫入(字串類主鍵欄之123存為'123');型別不符(整數類主鍵欄給'012'等)即reject且同批皆不寫入
|
|
3153
|
+
註: DATE、DATEONLY欄之值換算後年份須在1–9999,範圍外或無效者(如new Date(8.64e15)、new Date(NaN))即reject且同批皆不寫入,訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],
|
|
3154
|
+
不回顯值,兩方言一致於送出前拒收,規則同insert
|
|
3135
3155
|
註: [全有全無]為獨立於T7之額外要求——T7僅保證每筆之[檢查主鍵不存在]與[寫入]為原子,不保證整批。
|
|
3136
3156
|
mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實測1000筆之批次於末筆撞主鍵時已有946筆落盤,
|
|
3137
3157
|
故一律以交易包覆並於失敗時回滾;呼叫端已給transaction時改以巢狀交易(SAVEPOINT)包覆,
|
|
@@ -3141,7 +3161,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3141
3161
|
|
|
3142
3162
|
<dt class="tag-source">Source:</dt>
|
|
3143
3163
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3144
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3164
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1024">line 1024</a>
|
|
3145
3165
|
</li></ul></dd>
|
|
3146
3166
|
|
|
3147
3167
|
|
|
@@ -3469,13 +3489,15 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3469
3489
|
故只給部份欄位且該些欄位值皆與現值相同時,合併結果等於現值,nModified為0
|
|
3470
3490
|
註: 本筆失敗不中斷整批,該筆以ok為0並附err回報
|
|
3471
3491
|
註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
3472
|
-
註: 主鍵值依主鍵欄型別正規化(字串類主鍵欄之123即'123');型別不符(整數類主鍵欄給'012'等)屬呼叫端未履行契約,整批reject
|
|
3492
|
+
註: 主鍵值依主鍵欄型別正規化(字串類主鍵欄之123即'123');型別不符(整數類主鍵欄給'012'等)屬呼叫端未履行契約,整批reject且同批皆不寫入
|
|
3493
|
+
註: DATE、DATEONLY欄之值換算後年份須在1–9999,範圍外或無效者(如new Date(8.64e15)、new Date(NaN))屬呼叫端未履行契約,整批reject且同批皆不寫入(含autoInsert為false而不會寫入者;不降為該筆ok為0),
|
|
3494
|
+
訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],不回顯值,兩方言一致於送出前拒收,規則同insert</p></li></ul></dd>
|
|
3473
3495
|
|
|
3474
3496
|
|
|
3475
3497
|
|
|
3476
3498
|
<dt class="tag-source">Source:</dt>
|
|
3477
3499
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3478
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3500
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1362">line 1362</a>
|
|
3479
3501
|
</li></ul></dd>
|
|
3480
3502
|
|
|
3481
3503
|
|
|
@@ -3837,21 +3859,29 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3837
3859
|
|
|
3838
3860
|
<dt class="tag-description">Description:</dt>
|
|
3839
3861
|
<dd class="tag-description"><ul class="dummy"><li><p>查詢數據</p>
|
|
3840
|
-
<p
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3862
|
+
<p>使用須知(條件find為系列白名單, 規則同delAll, 見CLAUDE_rulebook.md之R11):</p>
|
|
3863
|
+
<ol>
|
|
3864
|
+
<li>不給條件即查詢全部數據: find未給、為undefined或為{}時回傳全部數據; 給了條件才是部分查詢。</li>
|
|
3865
|
+
<li>傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
3866
|
+
一律整批reject, 不視為{}。</li>
|
|
3867
|
+
<li>條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
3868
|
+
$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
3869
|
+
null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
3870
|
+
sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等
|
|
3871
|
+
一律整批reject, 訊息為invalid find: 原因 at [路徑], 且於載入model與連線前即檢核。</li>
|
|
3872
|
+
<li>欄名須完全等於model之屬性名或資料庫欄名(區分大小寫), 且為字母或底線開頭之字母/數字/底線(最多128字元);
|
|
3873
|
+
純量須符合欄位型別(如數值欄給'abc'會reject); 主鍵欄之條件值依主鍵欄型別正規化(字串類主鍵欄之{id:123}即{id:'123'})。</li>
|
|
3874
|
+
<li>與delAll共用同一檢核與同一條件, select(find)命中之數據即delAll(find)刪除之數據。</li>
|
|
3875
|
+
<li>語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
3876
|
+
排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。</li>
|
|
3877
|
+
</ol>
|
|
3878
|
+
<p>註: 恆回傳陣列, 無符合數據回傳空陣列</p></li></ul></dd>
|
|
3849
3879
|
|
|
3850
3880
|
|
|
3851
3881
|
|
|
3852
3882
|
<dt class="tag-source">Source:</dt>
|
|
3853
3883
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3854
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3884
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line604">line 604</a>
|
|
3855
3885
|
</li></ul></dd>
|
|
3856
3886
|
|
|
3857
3887
|
|
|
@@ -3960,7 +3990,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3960
3990
|
</td>
|
|
3961
3991
|
|
|
3962
3992
|
|
|
3963
|
-
<td class="description last"><p
|
|
3993
|
+
<td class="description last"><p>輸入查詢條件物件(系列白名單, 規則同delAll之使用須知第1-4點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject</p></td>
|
|
3964
3994
|
</tr>
|
|
3965
3995
|
|
|
3966
3996
|
|
|
@@ -4184,7 +4214,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
4184
4214
|
|
|
4185
4215
|
<dt class="tag-source">Source:</dt>
|
|
4186
4216
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
4187
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
4217
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line709">line 709</a>
|
|
4188
4218
|
</li></ul></dd>
|
|
4189
4219
|
|
|
4190
4220
|
|
|
@@ -4510,7 +4540,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
4510
4540
|
<br class="clear">
|
|
4511
4541
|
|
|
4512
4542
|
<footer>
|
|
4513
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
4543
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 23:23:31 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
4514
4544
|
</footer>
|
|
4515
4545
|
|
|
4516
4546
|
<script>prettyPrint();</script>
|
package/docs/WOrmReladb.mjs.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="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmReladb.html">WOrmReladb</a><ul class='methods'><li data-type='method'><a href="WOrmReladb.html#.closeSequelize">closeSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.createStorage">createStorage</a></li><li data-type='method'><a href="WOrmReladb.html#.del">del</a></li><li data-type='method'><a href="WOrmReladb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByDB">genModelsByDB</a></li><li data-type='method'><a href="WOrmReladb.html#.genModelsByTabs">genModelsByTabs</a></li><li data-type='method'><a href="WOrmReladb.html#.genTransaction">genTransaction</a></li><li data-type='method'><a href="WOrmReladb.html#.initSequelize">initSequelize</a></li><li data-type='method'><a href="WOrmReladb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmReladb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmReladb.html#.save">save</a></li><li data-type='method'><a href="WOrmReladb.html#.select">select</a></li><li data-type='method'><a href="WOrmReladb.html#.selectByPk">selectByPk</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#cvFind">cvFind</a></li><li><a href="global.html#genDateChecker">genDateChecker</a></li><li><a href="global.html#getColKind">getColKind</a></li><li><a href="global.html#getColScale">getColScale</a></li><li><a href="global.html#importModels">importModels</a></li><li><a href="global.html#inDateRange">inDateRange</a></li><li><a href="global.html#isKindOk">isKindOk</a></li><li><a href="global.html#normPk">normPk</a></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -72,7 +72,7 @@ import pmQueue from 'wsemi/src/pmQueue.mjs'
|
|
|
72
72
|
import WAutoSequelize from 'w-auto-sequelize/src/WAutoSequelize.mjs'
|
|
73
73
|
import importModels from './importModels.mjs'
|
|
74
74
|
import _genModelsByTabs from './genModelsByTabs.mjs'
|
|
75
|
-
import cvFind, { getColKind, getColScale, normPk } from './cvFind.mjs'
|
|
75
|
+
import cvFind, { getColKind, getColScale, normPk, chkFindShape, genDateChecker } from './cvFind.mjs'
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
//放置於全域宣告, 若使用useStable=true才可於當創建多實例時仍能全域控管
|
|
@@ -354,18 +354,15 @@ function WOrmReladb(opt = {}) {
|
|
|
354
354
|
|
|
355
355
|
/**
|
|
356
356
|
* 取cvFind所需之依賴物件
|
|
357
|
-
* 註:
|
|
358
|
-
* pk令主鍵欄之條件值依normPk正規化而與主鍵函數一致
|
|
357
|
+
* 註: attrs供欄名解析(嚴格鍵)與依欄位型別檢核條件之純量, pk令主鍵欄之條件值依normPk正規化而與主鍵函數一致
|
|
359
358
|
*
|
|
360
359
|
* @ignore
|
|
361
360
|
* @param {Object} md 輸入資料表model物件
|
|
362
|
-
* @returns {Object} 回傳{
|
|
361
|
+
* @returns {Object} 回傳{attrs, pk}
|
|
363
362
|
*/
|
|
364
363
|
function getFindCtx(md) {
|
|
365
364
|
return {
|
|
366
|
-
escape: (v) => md.sequelize.escape(v),
|
|
367
365
|
attrs: get(md, 'rawAttributes', {}),
|
|
368
|
-
dialect,
|
|
369
366
|
pk: opt.pk,
|
|
370
367
|
}
|
|
371
368
|
}
|
|
@@ -432,6 +429,30 @@ function WOrmReladb(opt = {}) {
|
|
|
432
429
|
}
|
|
433
430
|
|
|
434
431
|
|
|
432
|
+
/**
|
|
433
|
+
* 檢核各筆數據之DATE、DATEONLY欄值是否為年份在1–9999之有效時間(見cvFind.mjs之genDateChecker與inDateRange), 範圍外或無效者整批拋出
|
|
434
|
+
* 註: 通過檢核之物件值(Date及其子類別、包裝物件、陣列等)由檢核函數就地換成已檢核之標準值(Date或YYYY-MM-DD文字),令檢查之值即使用之值;操作對象為cloneDeep後之複本,呼叫端數據不變
|
|
435
|
+
* 註: 須於normPks之後、任何寫入之前對全部筆數一次完成, 令拋錯時同批之有效筆數亦不會被寫入, 資料庫不變; 與條件側共用同一範圍判定
|
|
436
|
+
* 註: 訊息只含筆數索引與欄名, 不回顯值; 同筆多欄範圍外者回報model屬性定義順序之第一個, 多筆範圍外者回報索引最小者
|
|
437
|
+
* 註: sqlite以文字存DATE, 範圍外年份之文字與時間序不一致(哨兵new Date(8.64e15)存為275760-09-13…, 被$lt某日期誤中而遭delAll刪除), 故寫入時即拒收;
|
|
438
|
+
* mssql之datetimeoffset、date範圍亦為0001–9999, 本函數於送出前即拒, 不依賴資料庫報錯, 兩方言行為一致
|
|
439
|
+
*
|
|
440
|
+
* @ignore
|
|
441
|
+
* @param {Object} md 輸入資料表model物件
|
|
442
|
+
* @param {Array} data 輸入已補齊並正規化主鍵之數據陣列
|
|
443
|
+
* @returns {undefined} 無回傳值
|
|
444
|
+
*/
|
|
445
|
+
function chkDates(md, data) {
|
|
446
|
+
let chk = genDateChecker(get(md, 'rawAttributes', {}))
|
|
447
|
+
data.forEach((v, k) => {
|
|
448
|
+
let col = chk(v)
|
|
449
|
+
if (col !== null) {
|
|
450
|
+
throw new Error(`invalid data: date is not a valid time in years 1-9999 at [data[${k}].${col}]`)
|
|
451
|
+
}
|
|
452
|
+
})
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
|
|
435
456
|
/**
|
|
436
457
|
* 依model之主鍵欄型別正規化主鍵值
|
|
437
458
|
* 註: 規則見cvFind.mjs之normPk(與w-orm-mdb同一規則), 用於selectByPk、del、save、insert與insertBulk,
|
|
@@ -603,18 +624,25 @@ function WOrmReladb(opt = {}) {
|
|
|
603
624
|
/**
|
|
604
625
|
* 查詢數據
|
|
605
626
|
*
|
|
606
|
-
*
|
|
607
|
-
*
|
|
608
|
-
*
|
|
609
|
-
*
|
|
610
|
-
*
|
|
611
|
-
*
|
|
612
|
-
*
|
|
613
|
-
*
|
|
627
|
+
* 使用須知(條件find為系列白名單, 規則同delAll, 見CLAUDE_rulebook.md之R11):
|
|
628
|
+
* 1. 不給條件即查詢全部數據: find未給、為undefined或為{}時回傳全部數據; 給了條件才是部分查詢。
|
|
629
|
+
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
630
|
+
* 一律整批reject, 不視為{}。
|
|
631
|
+
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
632
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
633
|
+
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
634
|
+
* sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等
|
|
635
|
+
* 一律整批reject, 訊息為invalid find: 原因 at [路徑], 且於載入model與連線前即檢核。
|
|
636
|
+
* 4. 欄名須完全等於model之屬性名或資料庫欄名(區分大小寫), 且為字母或底線開頭之字母/數字/底線(最多128字元);
|
|
637
|
+
* 純量須符合欄位型別(如數值欄給'abc'會reject); 主鍵欄之條件值依主鍵欄型別正規化(字串類主鍵欄之{id:123}即{id:'123'})。
|
|
638
|
+
* 5. 與delAll共用同一檢核與同一條件, select(find)命中之數據即delAll(find)刪除之數據。
|
|
639
|
+
* 6. 語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
640
|
+
* 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。
|
|
641
|
+
*
|
|
614
642
|
* 註: 恆回傳陣列, 無符合數據回傳空陣列
|
|
615
643
|
*
|
|
616
644
|
* @memberOf WOrmReladb
|
|
617
|
-
* @param {Object} [find={}] 輸入查詢條件物件
|
|
645
|
+
* @param {Object} [find={}] 輸入查詢條件物件(系列白名單, 規則同delAll之使用須知第1-4點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject
|
|
618
646
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
619
647
|
* @param {Object} [option.instance=null] 輸入實例instance物件,預設為null
|
|
620
648
|
* @param {Object} [option.transaction=null] 輸入交易(transaction)物件,預設為null
|
|
@@ -642,13 +670,20 @@ function WOrmReladb(opt = {}) {
|
|
|
642
670
|
//si
|
|
643
671
|
let si = instance
|
|
644
672
|
|
|
673
|
+
//inited, 本次呼叫是否已進入initSequelize(僅此時finally才關閉sequelize; 預檢失敗於其前者不得關閉呼叫端先前持有之連線)
|
|
674
|
+
let inited = false
|
|
675
|
+
|
|
645
676
|
try {
|
|
646
677
|
|
|
647
678
|
//check, 實例已關閉屬整批性錯誤, 於入口快速失敗
|
|
648
679
|
procClosed(instance)
|
|
649
680
|
|
|
681
|
+
//chkFindShape, 條件形狀不合法者(系列白名單, R11)於載入model與建立sequelize實例之前即拋錯: 不連線、不送出任何SQL, reject並發出error事件; 其後只使用檢核後之複本
|
|
682
|
+
let fd = chkFindShape(find)
|
|
683
|
+
|
|
650
684
|
//initSequelize, 內部自動初始化須在try內: 其例外(如驅動缺失)與si.err同屬整批性錯誤, 方能於reject前發出error事件, 已建構之sequelize亦由finally關閉
|
|
651
685
|
if (instance === null) {
|
|
686
|
+
inited = true
|
|
652
687
|
si = await initSequelize()
|
|
653
688
|
}
|
|
654
689
|
|
|
@@ -660,8 +695,8 @@ function WOrmReladb(opt = {}) {
|
|
|
660
695
|
//md
|
|
661
696
|
let md = si.mds[opt.cl]
|
|
662
697
|
|
|
663
|
-
//useFind, 與delAll共用cvFind,
|
|
664
|
-
let useFind = cvFind(
|
|
698
|
+
//useFind, 與delAll共用cvFind(對複本再檢核一次, 冪等), 欄名、欄位型別等翻譯層不合法者於此拋錯而reject並發出error事件
|
|
699
|
+
let useFind = cvFind(fd, getFindCtx(md))
|
|
665
700
|
|
|
666
701
|
//setting, raw令回傳純數據物件而不含資料庫內部欄位
|
|
667
702
|
let setting = {
|
|
@@ -686,7 +721,7 @@ function WOrmReladb(opt = {}) {
|
|
|
686
721
|
finally {
|
|
687
722
|
|
|
688
723
|
//closeSequelize
|
|
689
|
-
if (instance === null) { //內部自動初始化得close
|
|
724
|
+
if (instance === null && inited) { //內部自動初始化得close
|
|
690
725
|
await closeSequelize('select')
|
|
691
726
|
}
|
|
692
727
|
|
|
@@ -835,6 +870,10 @@ function WOrmReladb(opt = {}) {
|
|
|
835
870
|
* 註: 同批含重複主鍵時僅首筆計入nInserted,其餘視為已存在
|
|
836
871
|
* 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
837
872
|
* 註: 主鍵值依主鍵欄型別正規化後寫入(字串類主鍵欄之123存為'123');型別不符(整數類主鍵欄給'012'等)即reject且同批皆不寫入,不以自動產生之主鍵取代
|
|
873
|
+
* 註: DATE、DATEONLY欄之值(Date、epoch數值、日期字串)換算後年份須在1–9999(DATE依UTC,DATEONLY依存入之日期文字),範圍外者(如new Date(8.64e15)、'+010000-01-01T00:00:00Z')即reject且同批皆不寫入,
|
|
874
|
+
* 錯誤訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],不回顯值;sqlite以文字存日期,範圍外年份之文字與時間序不一致,會使以日期為條件之delAll刪錯列,
|
|
875
|
+
* 故兩方言一律於送出前拒收;無效時間(Invalid Date、NaN、無法解析之字串、空字串等,sqlite會存為字典序大於任何年份之文字Invalid date,mssql則由資料庫報錯)亦一併reject;
|
|
876
|
+
* 庫內既有之範圍外日期不遷移,須自行清理或改寫(見README)
|
|
838
877
|
* 註: option.returnList開啟時改回與輸入等長且保序之逐筆結果陣列[{n,nInserted,ok}],
|
|
839
878
|
* 聚合計數只答得出[有幾筆是新的]而答不出[是哪幾筆],而後者正是去重之產出物;
|
|
840
879
|
* 逐筆元素之n與ok恆為1,資訊由nInserted承載,不變式為
|
|
@@ -919,6 +958,9 @@ function WOrmReladb(opt = {}) {
|
|
|
919
958
|
//normPks, 主鍵值依主鍵欄型別正規化後寫回, 型別不符者整批reject且不寫入任何一筆, 令insert對既有數據之認定與selectByPk一致
|
|
920
959
|
normPks(md, data)
|
|
921
960
|
|
|
961
|
+
//chkDates, DATE、DATEONLY欄之值須為年份在1–9999之有效時間, 範圍外或無效者整批reject且不寫入任何一筆(與條件側共用範圍判定, 見R12)
|
|
962
|
+
chkDates(md, data)
|
|
963
|
+
|
|
922
964
|
//nAll, n之基準為輸入筆數
|
|
923
965
|
let nAll = size(data)
|
|
924
966
|
|
|
@@ -1012,6 +1054,8 @@ function WOrmReladb(opt = {}) {
|
|
|
1012
1054
|
* 註: 不提供逐筆結果,故不出現ok為0與err;需要逐筆處置者改用insert
|
|
1013
1055
|
* 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
1014
1056
|
* 註: 主鍵值依主鍵欄型別正規化後寫入(字串類主鍵欄之123存為'123');型別不符(整數類主鍵欄給'012'等)即reject且同批皆不寫入
|
|
1057
|
+
* 註: DATE、DATEONLY欄之值換算後年份須在1–9999,範圍外或無效者(如new Date(8.64e15)、new Date(NaN))即reject且同批皆不寫入,訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],
|
|
1058
|
+
* 不回顯值,兩方言一致於送出前拒收,規則同insert
|
|
1015
1059
|
* 註: [全有全無]為獨立於T7之額外要求——T7僅保證每筆之[檢查主鍵不存在]與[寫入]為原子,不保證整批。
|
|
1016
1060
|
* mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實測1000筆之批次於末筆撞主鍵時已有946筆落盤,
|
|
1017
1061
|
* 故一律以交易包覆並於失敗時回滾;呼叫端已給transaction時改以巢狀交易(SAVEPOINT)包覆,
|
|
@@ -1089,6 +1133,9 @@ function WOrmReladb(opt = {}) {
|
|
|
1089
1133
|
//normPks, 主鍵值依主鍵欄型別正規化後寫回, 型別不符者整批reject且不寫入任何一筆
|
|
1090
1134
|
normPks(md, data)
|
|
1091
1135
|
|
|
1136
|
+
//chkDates, DATE、DATEONLY欄之值須為年份在1–9999之有效時間, 範圍外或無效者整批reject且不寫入任何一筆(與條件側共用範圍判定, 見R12)
|
|
1137
|
+
chkDates(md, data)
|
|
1138
|
+
|
|
1092
1139
|
//nAll, n之基準為輸入筆數
|
|
1093
1140
|
let nAll = size(data)
|
|
1094
1141
|
|
|
@@ -1348,6 +1395,8 @@ function WOrmReladb(opt = {}) {
|
|
|
1348
1395
|
* 註: 本筆失敗不中斷整批,該筆以ok為0並附err回報
|
|
1349
1396
|
* 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入
|
|
1350
1397
|
* 註: 主鍵值依主鍵欄型別正規化(字串類主鍵欄之123即'123');型別不符(整數類主鍵欄給'012'等)屬呼叫端未履行契約,整批reject且同批皆不寫入
|
|
1398
|
+
* 註: DATE、DATEONLY欄之值換算後年份須在1–9999,範圍外或無效者(如new Date(8.64e15)、new Date(NaN))屬呼叫端未履行契約,整批reject且同批皆不寫入(含autoInsert為false而不會寫入者;不降為該筆ok為0),
|
|
1399
|
+
* 訊息為invalid data: date is not a valid time in years 1-9999 at [data[索引].欄名],不回顯值,兩方言一致於送出前拒收,規則同insert
|
|
1351
1400
|
*
|
|
1352
1401
|
* @memberOf WOrmReladb
|
|
1353
1402
|
* @param {Object|Array} data 輸入數據物件或陣列
|
|
@@ -1421,6 +1470,9 @@ function WOrmReladb(opt = {}) {
|
|
|
1421
1470
|
//normPks, 主鍵值依主鍵欄型別正規化後寫回, 型別不符者整批reject且不寫入任何一筆
|
|
1422
1471
|
normPks(md, data)
|
|
1423
1472
|
|
|
1473
|
+
//chkDates, DATE、DATEONLY欄之值須為年份在1–9999之有效時間, 範圍外或無效者整批reject且不寫入任何一筆(含autoInsert為false而不會寫入者; 與條件側共用範圍判定, 見R12)
|
|
1474
|
+
chkDates(md, data)
|
|
1475
|
+
|
|
1424
1476
|
//ks, model之欄位名, 供合併後比對時濾除非欄位之鍵
|
|
1425
1477
|
let ks = keys(get(md, 'rawAttributes', {}))
|
|
1426
1478
|
|
|
@@ -1647,16 +1699,29 @@ function WOrmReladb(opt = {}) {
|
|
|
1647
1699
|
|
|
1648
1700
|
|
|
1649
1701
|
/**
|
|
1650
|
-
*
|
|
1702
|
+
* 依條件刪除多筆數據(破壞性操作, 須審慎使用, 非必要不用; 刪除單筆請用del), 需與del分開,避免未傳數據導致直接刪除全表
|
|
1703
|
+
*
|
|
1704
|
+
* 使用須知:
|
|
1705
|
+
* 1. 不給條件即刪除全部數據: find未給、為undefined或為{}時, 刪除資料表內全部數據, 不另行確認。給了條件才是部分刪除。
|
|
1706
|
+
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
1707
|
+
* 一律整批reject, 不視為{}, 不刪除任何數據。
|
|
1708
|
+
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
1709
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
1710
|
+
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
1711
|
+
* sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、子查詢、函數值、Symbol鍵、undefined值、
|
|
1712
|
+
* 空的$nin/$and/$or等一律整批reject, 訊息為invalid find: 原因 at [路徑], 且不刪除任何數據。
|
|
1713
|
+
* 4. 與select共用同一檢核與同一條件, select(find)命中之數據即本函數刪除之數據; 建議先以select(find)確認命中範圍再刪除。
|
|
1714
|
+
* 欄名須完全等於model之屬性名或資料庫欄名(區分大小寫); 純量須符合欄位型別; 主鍵欄之條件值依主鍵欄型別正規化。
|
|
1715
|
+
* 5. 條件值若來自可能為undefined、null或空陣列之變數, 呼叫端須先自行判斷; undefined值會reject而非被忽略,
|
|
1716
|
+
* 空的$nin會reject, $in:[]則為恆假(刪除0筆)。
|
|
1717
|
+
* 6. 語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
1718
|
+
* 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。
|
|
1651
1719
|
*
|
|
1652
1720
|
* 註: n與nDeleted皆為實際刪除筆數,兩者恆相等,n不得取全表筆數
|
|
1653
|
-
* 註:
|
|
1654
|
-
* 註: find由cvFind轉譯且與select共用,刪除之數據即select(find)命中之數據;支援之條件與限制同select
|
|
1655
|
-
* 註: 不支援之運算子、非純量之值、與欄位型別不符之純量一律reject並發出error事件,不刪除任何數據;主鍵欄之條件值依主鍵欄型別正規化,同select
|
|
1656
|
-
* 註: find非物件(null、陣列、字串、數字)時刪除全部數據,此為現況保留,系列規格另案處理
|
|
1721
|
+
* 註: 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤
|
|
1657
1722
|
*
|
|
1658
1723
|
* @memberOf WOrmReladb
|
|
1659
|
-
* @param {Object} [find={}]
|
|
1724
|
+
* @param {Object} [find={}] 輸入刪除條件物件(系列白名單, 見使用須知),不給予find則代表刪除全部數據
|
|
1660
1725
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
1661
1726
|
* @param {Object} [option.instance=null] 輸入實例instance物件,預設為null
|
|
1662
1727
|
* @param {Object} [option.transaction=null] 輸入交易(transaction)物件,預設為null
|
|
@@ -1684,13 +1749,20 @@ function WOrmReladb(opt = {}) {
|
|
|
1684
1749
|
//si
|
|
1685
1750
|
let si = instance
|
|
1686
1751
|
|
|
1752
|
+
//inited, 本次呼叫是否已進入initSequelize(僅此時finally才關閉sequelize; 預檢失敗於其前者不得關閉呼叫端先前持有之連線)
|
|
1753
|
+
let inited = false
|
|
1754
|
+
|
|
1687
1755
|
try {
|
|
1688
1756
|
|
|
1689
1757
|
//check, 實例已關閉屬整批性錯誤, 於入口快速失敗
|
|
1690
1758
|
procClosed(instance)
|
|
1691
1759
|
|
|
1760
|
+
//chkFindShape, 條件形狀不合法者(系列白名單, R11)於載入model與建立sequelize實例之前即拋錯: 不連線、不送出任何SQL、不刪除任何數據; 其後只使用檢核後之複本
|
|
1761
|
+
let fd = chkFindShape(find)
|
|
1762
|
+
|
|
1692
1763
|
//initSequelize, 內部自動初始化須在try內: 其例外(如驅動缺失)與si.err同屬整批性錯誤, 方能於reject前發出error事件, 已建構之sequelize亦由finally關閉
|
|
1693
1764
|
if (instance === null) {
|
|
1765
|
+
inited = true
|
|
1694
1766
|
si = await initSequelize()
|
|
1695
1767
|
}
|
|
1696
1768
|
|
|
@@ -1702,8 +1774,8 @@ function WOrmReladb(opt = {}) {
|
|
|
1702
1774
|
//md
|
|
1703
1775
|
let md = si.mds[opt.cl]
|
|
1704
1776
|
|
|
1705
|
-
//useFind, 與select共用cvFind, 令刪除之數據即select命中之數據;
|
|
1706
|
-
let useFind = cvFind(
|
|
1777
|
+
//useFind, 與select共用cvFind(對複本再檢核一次, 冪等), 令刪除之數據即select命中之數據; 翻譯層不合法者於此拋錯而不刪除任何數據
|
|
1778
|
+
let useFind = cvFind(fd, getFindCtx(md))
|
|
1707
1779
|
|
|
1708
1780
|
//chkScopeForDelAll, model之預設scope會使刪除對象與select分歧者拒絕
|
|
1709
1781
|
chkScopeForDelAll(md)
|
|
@@ -1735,7 +1807,7 @@ function WOrmReladb(opt = {}) {
|
|
|
1735
1807
|
finally {
|
|
1736
1808
|
|
|
1737
1809
|
//closeSequelize
|
|
1738
|
-
if (instance === null) { //內部自動初始化得close
|
|
1810
|
+
if (instance === null && inited) { //內部自動初始化得close
|
|
1739
1811
|
await closeSequelize('delAll')
|
|
1740
1812
|
}
|
|
1741
1813
|
|
|
@@ -1920,7 +1992,7 @@ export default WOrmReladb
|
|
|
1920
1992
|
<br class="clear">
|
|
1921
1993
|
|
|
1922
1994
|
<footer>
|
|
1923
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1995
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 23:23:31 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1924
1996
|
</footer>
|
|
1925
1997
|
|
|
1926
1998
|
<script>prettyPrint();</script>
|