w-orm-reladb 1.1.8 → 1.1.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 +61 -28
- package/dist/w-orm-reladb.umd.js +2 -2
- package/dist/w-orm-reladb.umd.js.map +1 -1
- package/docs/WOrmReladb.html +52 -30
- package/docs/WOrmReladb.mjs.html +84 -30
- package/docs/cvFind.mjs.html +349 -382
- package/docs/global.html +49 -12
- package/docs/importModels.mjs.html +1 -1
- package/docs/index.html +1 -1
- 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/tfind.js +50 -0
- package/package.json +2 -2
- package/src/WOrmReladb.mjs +83 -29
- package/src/cvFind.mjs +348 -381
- package/test/api-find-whitelist.mjs +390 -0
- package/test/api-models.test.mjs +23 -0
- package/test/api-mssql.test.mjs +2 -0
- package/test/api-sqlite.test.mjs +2 -0
- package/test/api-suite.mjs +560 -76
- package/test/unit-cvfind.test.mjs +928 -104
package/docs/WOrmReladb.html
CHANGED
|
@@ -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#line522">line 522</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#line1747">line 1747</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#line1440">line 1440</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#line1642">line 1642</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#line1789">line 1789</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#line1837">line 1837</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#line538">line 538</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#line455">line 455</a>
|
|
2579
2593
|
</li></ul></dd>
|
|
2580
2594
|
|
|
2581
2595
|
|
|
@@ -2762,7 +2776,7 @@
|
|
|
2762
2776
|
|
|
2763
2777
|
<dt class="tag-source">Source:</dt>
|
|
2764
2778
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
2765
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
2779
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line815">line 815</a>
|
|
2766
2780
|
</li></ul></dd>
|
|
2767
2781
|
|
|
2768
2782
|
|
|
@@ -3141,7 +3155,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3141
3155
|
|
|
3142
3156
|
<dt class="tag-source">Source:</dt>
|
|
3143
3157
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3144
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3158
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line991">line 991</a>
|
|
3145
3159
|
</li></ul></dd>
|
|
3146
3160
|
|
|
3147
3161
|
|
|
@@ -3475,7 +3489,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3475
3489
|
|
|
3476
3490
|
<dt class="tag-source">Source:</dt>
|
|
3477
3491
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3478
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3492
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line1324">line 1324</a>
|
|
3479
3493
|
</li></ul></dd>
|
|
3480
3494
|
|
|
3481
3495
|
|
|
@@ -3837,21 +3851,29 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3837
3851
|
|
|
3838
3852
|
<dt class="tag-description">Description:</dt>
|
|
3839
3853
|
<dd class="tag-description"><ul class="dummy"><li><p>查詢數據</p>
|
|
3840
|
-
<p
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3854
|
+
<p>使用須知(條件find為系列白名單, 規則同delAll, 見CLAUDE_rulebook.md之R11):</p>
|
|
3855
|
+
<ol>
|
|
3856
|
+
<li>不給條件即查詢全部數據: find未給、為undefined或為{}時回傳全部數據; 給了條件才是部分查詢。</li>
|
|
3857
|
+
<li>傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
3858
|
+
一律整批reject, 不視為{}。</li>
|
|
3859
|
+
<li>條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
3860
|
+
$in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
3861
|
+
null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
3862
|
+
sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等
|
|
3863
|
+
一律整批reject, 訊息為invalid find: 原因 at [路徑], 且於載入model與連線前即檢核。</li>
|
|
3864
|
+
<li>欄名須完全等於model之屬性名或資料庫欄名(區分大小寫), 且為字母或底線開頭之字母/數字/底線(最多128字元);
|
|
3865
|
+
純量須符合欄位型別(如數值欄給'abc'會reject); 主鍵欄之條件值依主鍵欄型別正規化(字串類主鍵欄之{id:123}即{id:'123'})。</li>
|
|
3866
|
+
<li>與delAll共用同一檢核與同一條件, select(find)命中之數據即delAll(find)刪除之數據。</li>
|
|
3867
|
+
<li>語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
3868
|
+
排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。</li>
|
|
3869
|
+
</ol>
|
|
3870
|
+
<p>註: 恆回傳陣列, 無符合數據回傳空陣列</p></li></ul></dd>
|
|
3849
3871
|
|
|
3850
3872
|
|
|
3851
3873
|
|
|
3852
3874
|
<dt class="tag-source">Source:</dt>
|
|
3853
3875
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
3854
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
3876
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line580">line 580</a>
|
|
3855
3877
|
</li></ul></dd>
|
|
3856
3878
|
|
|
3857
3879
|
|
|
@@ -3960,7 +3982,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
3960
3982
|
</td>
|
|
3961
3983
|
|
|
3962
3984
|
|
|
3963
|
-
<td class="description last"><p
|
|
3985
|
+
<td class="description last"><p>輸入查詢條件物件(系列白名單, 規則同delAll之使用須知第1-4點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject</p></td>
|
|
3964
3986
|
</tr>
|
|
3965
3987
|
|
|
3966
3988
|
|
|
@@ -4184,7 +4206,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
4184
4206
|
|
|
4185
4207
|
<dt class="tag-source">Source:</dt>
|
|
4186
4208
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
4187
|
-
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#
|
|
4209
|
+
<a href="WOrmReladb.mjs.html">WOrmReladb.mjs</a>, <a href="WOrmReladb.mjs.html#line685">line 685</a>
|
|
4188
4210
|
</li></ul></dd>
|
|
4189
4211
|
|
|
4190
4212
|
|
|
@@ -4510,7 +4532,7 @@ mssql因綁定參數數量上限會由驅動層自動拆為多語句送出,實
|
|
|
4510
4532
|
<br class="clear">
|
|
4511
4533
|
|
|
4512
4534
|
<footer>
|
|
4513
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
4535
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 18:54:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
4514
4536
|
</footer>
|
|
4515
4537
|
|
|
4516
4538
|
<script>prettyPrint();</script>
|
package/docs/WOrmReladb.mjs.html
CHANGED
|
@@ -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 } 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
|
}
|
|
@@ -375,6 +372,10 @@ function WOrmReladb(opt = {}) {
|
|
|
375
372
|
* 檢查model之預設scope是否會使select與delAll之對象分歧
|
|
376
373
|
* 註: defaultScope帶limit或offset時, select依其order取前幾筆, 而sequelize之限量刪除不採order(sqlite為rowid IN子查詢),
|
|
377
374
|
* 兩者命中之數據不同而會刪錯列, 故delAll遇此類model即拒絕
|
|
375
|
+
* 註: defaultScope帶group或having時, findAll套用而destroy不套用(having過濾後只回部分列, 卻刪除全部符合where者);
|
|
376
|
+
* 帶非空之include時, findAll以INNER JOIN篩列(required)而destroy不JOIN; 兩者亦拒絕
|
|
377
|
+
* 註: defaultScope.where含Op.and時, sequelize以Object.assign合併scope與cvFind輸出之where, 後者頂層恆為Op.and而覆寫scope之條件(select與delAll皆然),
|
|
378
|
+
* delAll會刪到scope範圍外之列, 故拒絕; 其他鍵(含Op.or)與cvFind輸出之Op.and並存而以AND結合, 不受影響
|
|
378
379
|
*
|
|
379
380
|
* @ignore
|
|
380
381
|
* @param {Object} md 輸入資料表model物件
|
|
@@ -382,8 +383,27 @@ function WOrmReladb(opt = {}) {
|
|
|
382
383
|
*/
|
|
383
384
|
function chkScopeForDelAll(md) {
|
|
384
385
|
let sc = get(md, '_scope', {})
|
|
385
|
-
|
|
386
|
-
|
|
386
|
+
let bads = []
|
|
387
|
+
for (let k of ['limit', 'offset']) {
|
|
388
|
+
if (get(sc, k) !== undefined) {
|
|
389
|
+
bads.push(k)
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
for (let k of ['group', 'having']) {
|
|
393
|
+
let v = get(sc, k)
|
|
394
|
+
if (v !== undefined && v !== null && !(Array.isArray(v) && v.length === 0)) {
|
|
395
|
+
bads.push(k)
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (isearr(get(sc, 'include'))) {
|
|
399
|
+
bads.push('include')
|
|
400
|
+
}
|
|
401
|
+
let w = get(sc, 'where')
|
|
402
|
+
if (w !== null && typeof w === 'object' && Object.prototype.hasOwnProperty.call(w, Sequelize.Op.and)) {
|
|
403
|
+
bads.push('where[Op.and]')
|
|
404
|
+
}
|
|
405
|
+
if (bads.length > 0) {
|
|
406
|
+
throw new Error(`model [${opt.cl}] has defaultScope with ${bads.join(', ')}, delAll can not delete the same rows as select`)
|
|
387
407
|
}
|
|
388
408
|
}
|
|
389
409
|
|
|
@@ -580,18 +600,25 @@ function WOrmReladb(opt = {}) {
|
|
|
580
600
|
/**
|
|
581
601
|
* 查詢數據
|
|
582
602
|
*
|
|
583
|
-
*
|
|
584
|
-
*
|
|
585
|
-
*
|
|
586
|
-
*
|
|
587
|
-
*
|
|
588
|
-
*
|
|
589
|
-
*
|
|
590
|
-
*
|
|
603
|
+
* 使用須知(條件find為系列白名單, 規則同delAll, 見CLAUDE_rulebook.md之R11):
|
|
604
|
+
* 1. 不給條件即查詢全部數據: find未給、為undefined或為{}時回傳全部數據; 給了條件才是部分查詢。
|
|
605
|
+
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
606
|
+
* 一律整批reject, 不視為{}。
|
|
607
|
+
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
608
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
609
|
+
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
610
|
+
* sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、函數值、Symbol鍵、undefined值、空的$nin/$and/$or等
|
|
611
|
+
* 一律整批reject, 訊息為invalid find: 原因 at [路徑], 且於載入model與連線前即檢核。
|
|
612
|
+
* 4. 欄名須完全等於model之屬性名或資料庫欄名(區分大小寫), 且為字母或底線開頭之字母/數字/底線(最多128字元);
|
|
613
|
+
* 純量須符合欄位型別(如數值欄給'abc'會reject); 主鍵欄之條件值依主鍵欄型別正規化(字串類主鍵欄之{id:123}即{id:'123'})。
|
|
614
|
+
* 5. 與delAll共用同一檢核與同一條件, select(find)命中之數據即delAll(find)刪除之數據。
|
|
615
|
+
* 6. 語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
616
|
+
* 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。
|
|
617
|
+
*
|
|
591
618
|
* 註: 恆回傳陣列, 無符合數據回傳空陣列
|
|
592
619
|
*
|
|
593
620
|
* @memberOf WOrmReladb
|
|
594
|
-
* @param {Object} [find={}] 輸入查詢條件物件
|
|
621
|
+
* @param {Object} [find={}] 輸入查詢條件物件(系列白名單, 規則同delAll之使用須知第1-4點); 未給、undefined或{}回傳全部數據; 非條件物件或白名單外運算子整批reject
|
|
595
622
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
596
623
|
* @param {Object} [option.instance=null] 輸入實例instance物件,預設為null
|
|
597
624
|
* @param {Object} [option.transaction=null] 輸入交易(transaction)物件,預設為null
|
|
@@ -619,13 +646,20 @@ function WOrmReladb(opt = {}) {
|
|
|
619
646
|
//si
|
|
620
647
|
let si = instance
|
|
621
648
|
|
|
649
|
+
//inited, 本次呼叫是否已進入initSequelize(僅此時finally才關閉sequelize; 預檢失敗於其前者不得關閉呼叫端先前持有之連線)
|
|
650
|
+
let inited = false
|
|
651
|
+
|
|
622
652
|
try {
|
|
623
653
|
|
|
624
654
|
//check, 實例已關閉屬整批性錯誤, 於入口快速失敗
|
|
625
655
|
procClosed(instance)
|
|
626
656
|
|
|
657
|
+
//chkFindShape, 條件形狀不合法者(系列白名單, R11)於載入model與建立sequelize實例之前即拋錯: 不連線、不送出任何SQL, reject並發出error事件; 其後只使用檢核後之複本
|
|
658
|
+
let fd = chkFindShape(find)
|
|
659
|
+
|
|
627
660
|
//initSequelize, 內部自動初始化須在try內: 其例外(如驅動缺失)與si.err同屬整批性錯誤, 方能於reject前發出error事件, 已建構之sequelize亦由finally關閉
|
|
628
661
|
if (instance === null) {
|
|
662
|
+
inited = true
|
|
629
663
|
si = await initSequelize()
|
|
630
664
|
}
|
|
631
665
|
|
|
@@ -637,8 +671,8 @@ function WOrmReladb(opt = {}) {
|
|
|
637
671
|
//md
|
|
638
672
|
let md = si.mds[opt.cl]
|
|
639
673
|
|
|
640
|
-
//useFind, 與delAll共用cvFind,
|
|
641
|
-
let useFind = cvFind(
|
|
674
|
+
//useFind, 與delAll共用cvFind(對複本再檢核一次, 冪等), 欄名、欄位型別等翻譯層不合法者於此拋錯而reject並發出error事件
|
|
675
|
+
let useFind = cvFind(fd, getFindCtx(md))
|
|
642
676
|
|
|
643
677
|
//setting, raw令回傳純數據物件而不含資料庫內部欄位
|
|
644
678
|
let setting = {
|
|
@@ -663,7 +697,7 @@ function WOrmReladb(opt = {}) {
|
|
|
663
697
|
finally {
|
|
664
698
|
|
|
665
699
|
//closeSequelize
|
|
666
|
-
if (instance === null) { //內部自動初始化得close
|
|
700
|
+
if (instance === null && inited) { //內部自動初始化得close
|
|
667
701
|
await closeSequelize('select')
|
|
668
702
|
}
|
|
669
703
|
|
|
@@ -1624,16 +1658,29 @@ function WOrmReladb(opt = {}) {
|
|
|
1624
1658
|
|
|
1625
1659
|
|
|
1626
1660
|
/**
|
|
1627
|
-
*
|
|
1661
|
+
* 依條件刪除多筆數據(破壞性操作, 須審慎使用, 非必要不用; 刪除單筆請用del), 需與del分開,避免未傳數據導致直接刪除全表
|
|
1662
|
+
*
|
|
1663
|
+
* 使用須知:
|
|
1664
|
+
* 1. 不給條件即刪除全部數據: find未給、為undefined或為{}時, 刪除資料表內全部數據, 不另行確認。給了條件才是部分刪除。
|
|
1665
|
+
* 2. 傳了值卻不是條件物件(null、陣列含[]與[{...}]、字串、數值、布林、函數、Date、RegExp、Map、Set、類別實例等)
|
|
1666
|
+
* 一律整批reject, 不視為{}, 不刪除任何數據。
|
|
1667
|
+
* 3. 條件僅支援系列白名單: 欄位等值{欄:純量}(多欄為AND)、欄位運算子$eq $ne $gt $gte $lt $lte(值為純量)與
|
|
1668
|
+
* $in $nin(值為純量陣列)、文件層$and $or(值為條件物件之非空陣列, 最多999項)。純量為字串、有限數字、布林、有效Date;
|
|
1669
|
+
* null僅可用於欄位等值、$eq、$ne。白名單外之運算子($not $nor $regex $options $exists $where $expr $like $ilike等)、
|
|
1670
|
+
* sequelize之Op Symbol、RegExp值、陣列值(請改用$in)、欄位層$and/$or、子查詢、函數值、Symbol鍵、undefined值、
|
|
1671
|
+
* 空的$nin/$and/$or等一律整批reject, 訊息為invalid find: 原因 at [路徑], 且不刪除任何數據。
|
|
1672
|
+
* 4. 與select共用同一檢核與同一條件, select(find)命中之數據即本函數刪除之數據; 建議先以select(find)確認命中範圍再刪除。
|
|
1673
|
+
* 欄名須完全等於model之屬性名或資料庫欄名(區分大小寫); 純量須符合欄位型別; 主鍵欄之條件值依主鍵欄型別正規化。
|
|
1674
|
+
* 5. 條件值若來自可能為undefined、null或空陣列之變數, 呼叫端須先自行判斷; undefined值會reject而非被忽略,
|
|
1675
|
+
* 空的$nin會reject, $in:[]則為恆假(刪除0筆)。
|
|
1676
|
+
* 6. 語意差異(SQL式): $ne/$nin不命中欄位為NULL之數據(三值邏輯)。需明確表達時可用可攜寫法:
|
|
1677
|
+
* 排除NULL為{$and:[{f:{$ne:null}},{f:{$ne:x}}]}, 含NULL為{$or:[{f:null},{f:{$ne:x}}]}; 字串比對之大小寫依資料庫定序。
|
|
1628
1678
|
*
|
|
1629
1679
|
* 註: n與nDeleted皆為實際刪除筆數,兩者恆相等,n不得取全表筆數
|
|
1630
|
-
* 註:
|
|
1631
|
-
* 註: find由cvFind轉譯且與select共用,刪除之數據即select(find)命中之數據;支援之條件與限制同select
|
|
1632
|
-
* 註: 不支援之運算子、非純量之值、與欄位型別不符之純量一律reject並發出error事件,不刪除任何數據;主鍵欄之條件值依主鍵欄型別正規化,同select
|
|
1633
|
-
* 註: find非物件(null、陣列、字串、數字)時刪除全部數據,此為現況保留,系列規格另案處理
|
|
1680
|
+
* 註: 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤
|
|
1634
1681
|
*
|
|
1635
1682
|
* @memberOf WOrmReladb
|
|
1636
|
-
* @param {Object} [find={}]
|
|
1683
|
+
* @param {Object} [find={}] 輸入刪除條件物件(系列白名單, 見使用須知),不給予find則代表刪除全部數據
|
|
1637
1684
|
* @param {Object} [option={}] 輸入設定物件,預設為{}
|
|
1638
1685
|
* @param {Object} [option.instance=null] 輸入實例instance物件,預設為null
|
|
1639
1686
|
* @param {Object} [option.transaction=null] 輸入交易(transaction)物件,預設為null
|
|
@@ -1661,13 +1708,20 @@ function WOrmReladb(opt = {}) {
|
|
|
1661
1708
|
//si
|
|
1662
1709
|
let si = instance
|
|
1663
1710
|
|
|
1711
|
+
//inited, 本次呼叫是否已進入initSequelize(僅此時finally才關閉sequelize; 預檢失敗於其前者不得關閉呼叫端先前持有之連線)
|
|
1712
|
+
let inited = false
|
|
1713
|
+
|
|
1664
1714
|
try {
|
|
1665
1715
|
|
|
1666
1716
|
//check, 實例已關閉屬整批性錯誤, 於入口快速失敗
|
|
1667
1717
|
procClosed(instance)
|
|
1668
1718
|
|
|
1719
|
+
//chkFindShape, 條件形狀不合法者(系列白名單, R11)於載入model與建立sequelize實例之前即拋錯: 不連線、不送出任何SQL、不刪除任何數據; 其後只使用檢核後之複本
|
|
1720
|
+
let fd = chkFindShape(find)
|
|
1721
|
+
|
|
1669
1722
|
//initSequelize, 內部自動初始化須在try內: 其例外(如驅動缺失)與si.err同屬整批性錯誤, 方能於reject前發出error事件, 已建構之sequelize亦由finally關閉
|
|
1670
1723
|
if (instance === null) {
|
|
1724
|
+
inited = true
|
|
1671
1725
|
si = await initSequelize()
|
|
1672
1726
|
}
|
|
1673
1727
|
|
|
@@ -1679,8 +1733,8 @@ function WOrmReladb(opt = {}) {
|
|
|
1679
1733
|
//md
|
|
1680
1734
|
let md = si.mds[opt.cl]
|
|
1681
1735
|
|
|
1682
|
-
//useFind, 與select共用cvFind, 令刪除之數據即select命中之數據;
|
|
1683
|
-
let useFind = cvFind(
|
|
1736
|
+
//useFind, 與select共用cvFind(對複本再檢核一次, 冪等), 令刪除之數據即select命中之數據; 翻譯層不合法者於此拋錯而不刪除任何數據
|
|
1737
|
+
let useFind = cvFind(fd, getFindCtx(md))
|
|
1684
1738
|
|
|
1685
1739
|
//chkScopeForDelAll, model之預設scope會使刪除對象與select分歧者拒絕
|
|
1686
1740
|
chkScopeForDelAll(md)
|
|
@@ -1712,7 +1766,7 @@ function WOrmReladb(opt = {}) {
|
|
|
1712
1766
|
finally {
|
|
1713
1767
|
|
|
1714
1768
|
//closeSequelize
|
|
1715
|
-
if (instance === null) { //內部自動初始化得close
|
|
1769
|
+
if (instance === null && inited) { //內部自動初始化得close
|
|
1716
1770
|
await closeSequelize('delAll')
|
|
1717
1771
|
}
|
|
1718
1772
|
|
|
@@ -1897,7 +1951,7 @@ export default WOrmReladb
|
|
|
1897
1951
|
<br class="clear">
|
|
1898
1952
|
|
|
1899
1953
|
<footer>
|
|
1900
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1954
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Oct 19 2026 18:54:43 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1901
1955
|
</footer>
|
|
1902
1956
|
|
|
1903
1957
|
<script>prettyPrint();</script>
|