new WOrmMdb(optopt) → {Object}
- Description:
操作Access mdb資料庫
註: 主鍵欄位取自opt.pk,預設為id,支援由呼叫端指定 註: 本套件經connMDB.exe操作Windows內建之Jet 4.0引擎,僅支援.mdb(Jet4)不支援.accdb 註: Jet引擎之字串比對不分大小寫,故主鍵之[命中]認定亦不分大小寫, 且select之記憶體過濾層已一併對齊(見queryMemory.mjs),令兩者判定一致 註: sqlite之NOCASE僅折疊ASCII之A-Z,與Jet對部分非ASCII字元之折疊不同, 故僅大小寫相異之非ASCII主鍵於select與selectByPk仍可能判定不一致 註: insert與save之原子性倚賴資料表主鍵欄位具唯一約束(PRIMARY KEY),資料表建立時須含之
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
opt |
Object |
<optional> |
{}
|
輸入設定物件,預設{} Properties
|
Returns:
回傳操作資料庫物件,各事件功能詳見說明
- Type
- Object
Methods
(async, static) closeSequelize() → {Promise}
- Description:
關閉sequelize
- Source:
Returns:
回傳Promise,resolve代表關閉成功,reject回傳錯誤訊息
- Type
- Promise
(async, static) createStorage() → {Promise}
- Description:
創建mdb資料庫檔案
註: 建出者為空庫,資料表需另建
- Source:
Returns:
回傳Promise,resolve回傳創建結果,reject回傳錯誤訊息
- Type
- Promise
(async, static) del(data, optionopt) → {Promise}
- Description:
刪除數據
註: 回傳陣列恆與輸入等長,各筆之n與nDeleted皆為主鍵命中筆數,值為0或1,未命中為0且屬正常結果 註: 判斷某筆是否真的被刪除一律以nDeleted為準 註: 未帶有效主鍵者為該筆之輸入問題,回ok為0與err且不送查詢條件(以免無效值被轉為null而誤中其他數據), 不中斷其餘筆數,以此與[主鍵未命中]之ok為1區辨 註: 本函數不受opt.autoGenPk影響,於任一設定下皆不補值 註: 由DELETE語句自身之影響列數判定命中,不另行查詢以免多一次往返且與刪除間存在競態
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
data |
Object | Array | 輸入數據物件或陣列,會查找各數據的opt.pk值,有存在者就刪除 |
||||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳與輸入等長之刪除結果陣列[{n,nDeleted,ok}],reject回傳錯誤訊息
- Type
- Promise
(async, static) delAll(findopt, optionopt) → {Promise}
- Description:
依條件刪除多筆數據,需與del分開,避免未傳數據導致直接刪除全表
註: n與nDeleted皆為實際刪除筆數,兩者恆相等,n不得取全表筆數 註: find未給或為空物件時刪除全部數據;條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤 註: 帶條件時先以與select相同之記憶體過濾取得命中數據之主鍵清單,再依主鍵清單刪除, 令刪除範圍與select(find)之結果完全一致;若逕將條件送Jet,因Access不支援$in、$nin、$regex等運算子, 會出現[select查得到但delAll刪不到]或反之之不一致 註: 分批之DELETE以交易包覆,令任一批失敗時整體回滾而不留下部份刪除
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
find |
Object |
<optional> |
{}
|
輸入刪除條件物件,不給予find則代表刪除全部數據 |
||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳刪除結果{n,nDeleted,ok},reject回傳錯誤訊息
- Type
- Promise
(static) genModelsByTabs(fdopt, tabsopt, optopt)
- Description:
由資料表物件生成各資料表的models資料
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
fd |
String |
<optional> |
'./models'
|
輸入models儲存的資料夾名稱字串,預設'./models' |
||||||||||
tabs |
Object |
<optional> |
{}
|
輸入各資料表物件,預設{} |
||||||||||
opt |
Object |
<optional> |
{}
|
輸入設定物件,預設{} Properties
|
(async, static) initAdodb() → {Promise}
- Description:
初始化操作實例
註: connMDB.exe為one-shot程序,每次呼叫各自開啟與關閉連線,故實例本身不持有資料庫連線; sequelize僅用於匯入models以取得欄位定義,不承載任何數據
- Source:
Returns:
回傳Promise,resolve回傳實例物件,reject回傳錯誤訊息
- Type
- Promise
(async, static) insert(data, optionopt) → {Promise}
- Description:
插入數據,僅於主鍵不存在時寫入,已存在者跳過且不覆寫
由Jet於主鍵之唯一約束上原子完成[檢查主鍵不存在]與[寫入],併發時同一主鍵僅有一次成功
註: n為輸入筆數即本次嘗試插入之基準,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果 註: 同批含重複主鍵時僅首筆計入nInserted,其餘視為已存在 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入 註: 全部插入語句於單次呼叫exe內循序送出且不因單筆衝突而中止,故一次往返即可取得精確之nInserted 註: option.returnList為true時改回傳與輸入等長且保序之逐筆陣列[{n,nInserted,ok}], 供呼叫端得知[是哪幾筆]為新資料而非僅[有幾筆];逐筆元素之n與ok恆為1, 因insert之任何錯誤皆屬整批性錯誤而reject,故不出現ok為0與err。 回傳形式之切換為靜態,僅由本選項之取值決定,不因數據內容或執行結果而變
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
data |
Object | Array | 輸入數據物件或陣列 |
|||||||||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳插入結果{n,nInserted,ok},或於option.returnList為true時回傳[{n,nInserted,ok}],reject回傳錯誤訊息
- Type
- Promise
(async, static) insertBulk(data, optionopt) → {Promise}
- Description:
批次插入數據,全批視為一個單位:全部插入成功,或一筆都不寫入
本函數非insert之加速版,兩者衝突政策不同:insert於主鍵已存在時跳過該筆且整批ok為1, 本函數則整批reject且不寫入任何一筆,同批含重複主鍵者亦視為衝突。 確無衝突時兩者之可觀察結果完全相同,差異僅於有衝突時顯現。
註: n為輸入筆數即本次嘗試插入之基準;nInserted於成功時恆等於n,雖無額外資訊仍保留, 令呼叫端得與insert共用同一段結果處理程式碼 註: 不提供逐筆結果,故不出現ok為0與err;需要逐筆處置者改用insert 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入 註: [全有全無]以Jet之交易(OleDbTransaction)包覆全部插入語句達成,任一筆失敗即回滾, 故reject之後資料庫狀態與呼叫前相同,無須補償動作;同批含重複主鍵者亦於交易內被偵測為衝突
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
data |
Object | Array | 輸入數據物件或陣列 |
||||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳插入結果{n,nInserted,ok},reject回傳錯誤訊息
- Type
- Promise
(async, static) save(data, optionopt) → {Promise}
- Description:
儲存數據,以主鍵為準更新既有數據,未給之欄位保留;主鍵不存在且option.autoInsert為true(預設)時改為插入
採條件寫入配合衝突偵測與重試: 每次寫入本身為單一條件式原子語句——插入由主鍵之唯一約束判定、 更新由WHERE主鍵之比對判定,皆非由預讀值決定其成敗;預讀僅用於選擇發出哪一條語句, 選錯不會產生錯誤結果,只會被偵測並重試(插入撞既有主鍵、更新未命中任何列),故縱使預讀值已過期, 最終結果仍與該次操作單獨執行時相同。
註: 回傳陣列恆與輸入等長,輸入單一物件亦回傳長度1之陣列 註: n為主鍵命中筆數,值為0或1,命中(不論內容有無變更)或經插入而產生皆為1;nInserted與nModified恆同時出現 註: [內容相同]之判定基準為將待寫入物件合併進現值後與現值相同,非待寫入物件與現值全等, 故只給部份欄位且該些欄位值皆與現值相同時,合併結果等於現值,nModified為0。 合併取淺層以與Jet整欄取代之寫入行為一致,令nModified忠實反映資料庫端是否真的寫入 註: 不以UPDATE之影響列數決定nModified,因Jet之影響列數為[符合WHERE之列數]而非[內容真的有變之列數] (已實測: 將欄位設為與現值相同之值仍回報影響1列) 註: 本筆失敗不中斷整批,該筆以ok為0並附err回報 註: opt.autoGenPk為true(預設)時未帶有效主鍵者自動產生,為false時未帶有效主鍵即reject且同批皆不寫入 註: 各回合之預讀與寫入皆整批送出,故N筆數據於無衝突時僅需2次呼叫exe而非2N次
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
data |
Object | Array | 輸入數據物件或陣列 |
|||||||||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳與輸入等長之儲存結果陣列[{n,nInserted,nModified,ok}],reject回傳錯誤訊息
- Type
- Promise
(async, static) select(findopt, optionopt) → {Promise}
- Description:
查詢數據
註: 恆回傳陣列,無符合數據回傳空陣列而不回傳null 註: find未給或為空物件時回傳全部數據 註: 本函數不得有副作用,故不創建資料表
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
find |
Object |
<optional> |
{}
|
輸入查詢條件物件 |
||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳數據陣列,reject回傳錯誤訊息
- Type
- Promise
(async, static) selectByPk(pk, optionopt) → {Promise}
- Description:
由主鍵查詢單筆數據,因由Jet依主鍵取值且僅回傳單筆,不需如select提取全部數據再過濾,故數據量大時效能較佳
註: 主鍵欄位取自opt.pk,預設為id,支援由呼叫端指定 註: 主鍵未命中或主鍵值無效皆回傳null而不reject,[命中]之判定基準與insert、save、del內對既有數據之認定一致 註: Jet之字串比對不分大小寫,故主鍵之命中判定亦不分大小寫 註: 本函數不得有副作用,故不創建資料表
- Source:
Parameters:
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
pk |
String | Number | 輸入主鍵值,即數據內opt.pk欄位之值 |
||||||||||||
option |
Object |
<optional> |
{}
|
輸入設定物件,預設為{} Properties
|
Returns:
回傳Promise,resolve回傳數據物件,若無此主鍵或主鍵值無效則回傳null,reject回傳錯誤訊息
- Type
- Promise