物件導向 API #1 (又稱 oo1)

跳至...

sqlite3.js 從同一個執行緒載入和操作時,JavaScript 用戶端可能會互動的主要 API 是高階物件導向 API(俗稱 oo1)。它提供了一個靈活、功能相當豐富的介面,並且可以在需要時與 低階 C 語言風格 API 搭配使用。

其 API 在其原始碼檔案中有詳細的說明,使用方法的示範可以在 demo-123 中找到。

sqlite3.js 從一個執行緒載入並從另一個執行緒操作時,用戶端必須透過傳遞 Worker 類型的訊息與資料庫通訊。一個這樣的 API 包裝器可以在 Worker1 API 中找到,當然,用戶端也可以根據 oo1 API 或 C 語言風格 API 建立自己的包裝器。

oo1 命名空間

sqlite3.oo1 物件作為 oo1 功能的命名空間。為了簡潔起見,以下文件省略了該部分。

例外

這些 API 僅使用例外狀況來回報錯誤,並且始終拋出 SQLite3Error 物件,除非它們傳播來自另一個 API 的錯誤(例如,Stmt.getJSON() 可能會這樣做)。任何說明「發生錯誤時拋出例外」的文件都特別指的是該類別,除非另有說明。

C 語言風格 API 的互通性

此頁面上描述的資料庫和已準備好的陳述式物件類型可以按原樣傳遞給 C 語言風格 API。例如:

const db = new sqlite3.oo1.DB(...);
const filename = sqlite3.capi.sqlite3_db_filename(db, "main");

此類 API 將從物件中提取 pointer 屬性,並將該值傳遞給底層 C API。

DB 類別

DB 類別的每個實例都對應於一個使用 sqlite3_open() 或其等效函式建立的 sqlite3*。它就像這樣簡單:

const db = new sqlite3.oo1.DB();
try {
  db.exec([
    "create table t(a);",
    "insert into t(a) ",
    "values(10),(20),(30)"
  ]);
} finally {
  db.close();
}

完整的示範可以在 demo-123.js 中找到,並在 demo-123.md 中展示。

DB 建構子

對於第二種形式,物件可以包含以下任何內容

{
   filename: db filename,
   flags: open-mode flags,
   vfs: name of the sqlite3_vfs to use,
   (SEE flag - see below (added in v3.46))
}

指定的資料庫檔案名稱必須使用為預設 sqlite3 VFS 設定的任何檔案系統層(虛擬或其他)來解析。

請注意,特殊的 sqlite3 資料庫名稱 ":memory:" 和 ""(臨時資料庫)在此具有其正常的特殊含義。

第二個參數指定資料庫的開啟/建立模式。它必須是包含一系列字母(順序任意,但區分大小寫)的字串,用於指定模式

如果未提供 "w",則資料庫隱含為唯讀,請注意 "rc" 沒有意義

目前會忽略任何其他字母。預設值為 "c"。對於特殊的 ":memory:" 和 "" 名稱,這些模式會被忽略,並且可能被特定的 VFS 忽略。

最後一個參數類似於 sqlite3_open_v2() 的最後一個參數:sqlite3 VFS 的名稱。傳遞一個假值或完全不傳遞任何值以使用預設值。如果傳遞一個值,它必須是 VFS 的字串名稱

filenamevfs 參數可以是 JS 字串或透過 WASM 分配的 C 字串。

為了將 DB 實例傳遞給 C 風格的 sqlite3 函數,DB 物件的唯讀 pointer 屬性會保存其 sqlite3* 指標值。該屬性還可以用於檢查此 DB 實例是否仍然開啟。

在主視窗執行緒中,檔案名稱 ":localStorage:"":sessionStorage:" 是特殊的:它們會導致資料庫使用 localStoragesessionStorage 來儲存資料庫,使用 kvvfs。如果使用這些名稱之一,它們將優先於參數中設定的任何 VFS 名稱。

建構函數在發生錯誤時會丟擲 SQLite3Error

參見加密

對於選項物件呼叫形式,從版本 3.46 開始,該物件可以包含使用商業 SQLite 加密擴展 (SEE) 編碼的資料庫的加密金鑰。

除非與 支援 SEE 的 JS/WASM 組建 一起使用,否則此選項無效。

要開啟或建立加密的資料庫,請在選項物件中提供以下屬性*之一*:keyhexkeytextkey。每一個都可以是字串、ArrayBuffer 或 Uint8Array,並在開啟資料庫時作為資料庫金鑰應用,如 SEE 文件中針對具有相同名稱的語法所述。如果提供了多個 keyhexkeytextkey,或者選項的類型不受支援,則會丟擲例外狀況。

DB 類別屬性和方法

checkRc(db,resultCode)

預計會給定一個 DB 實例或一個 sqlite3* 指標(可以是 null)和一個 sqlite3 API 結果代碼。如果結果代碼不是假值,則此函數會使用給定的資料庫控制代碼從 sqlite3_errmsg() 丟擲一個帶有錯誤訊息的 SQLite3Error,如果資料庫控制代碼是假值或是一個已 close() 的 DB 實例,則使用 sqlite3_errstr()

請注意,如果傳遞的是非錯誤代碼,例如 SQLITE_ROWSQLITE_DONE,它仍然會丟擲,但錯誤字串可能是「不是錯誤」。需要在預期它們的用戶端代碼中檢查各種非 0 非錯誤代碼。

如果它沒有丟擲,它會返回其 db 參數(如果作為成員函數呼叫,則為 this)。

DB 非方法屬性

資料庫方法

此類別的實體方法將在下方依字母順序說明。

affirmOpen()

如果指定的資料庫已關閉,則擲出例外,否則返回 this

changes()

int changes(total=false,sixtyFour=false)

根據 sqlite3_changes()(如果第一個參數為 false)或 sqlite3_total_changes()(如果為 true)返回變更的數量。如果第二個參數為 true,則使用 sqlite3_changes64()sqlite3_total_changes64(),如果此建置沒有啟用 BigInt 支援,則會觸發例外。

checkRc()

mixed checkRc(resultCode)

db.checkRc(resultCode) 等同於 DB.checkRc(db,resultCode)

close()

完成所有由這個物件開啟且仍在開啟中的陳述式,並關閉這個資料庫連線。如果資料庫已經關閉,則此操作無效。呼叫 close() 之後,this.pointer 將會解析為 undefined,因此可以用來檢查資料庫實體是否仍然開啟。

如果 this.onclose.before 是一個函式,則它會在任何與關閉相關的清除操作之前被呼叫。

如果 this.onclose.after 是一個函式,則它會在資料庫關閉之後,但在清除輔助狀態(如 this.filename)之前被呼叫。

兩個 onclose 處理函式都會將此物件作為它們唯一的參數。如果此資料庫未開啟,則不會呼叫任何一個處理函式。處理函式擲出的任何例外都會被忽略,因為「解構函式不得擲出例外」。

請注意,資料庫控制代碼的垃圾回收(如果有的話)永遠不會觸發 close(),因此 onclose 處理函式並不是實作資料庫關閉時清除或維護的可靠方法。

createFunction()

建立一個新的純量、聚合或視窗 UDF(使用者定義函式),可透過 SQL 程式碼存取。此函式可以以下列任何形式呼叫:

在最後兩種情況下,函式必須在選項物件中定義,如下所述。在最後一種情況下,函式的名稱必須是 name 屬性。

前兩種呼叫形式只能用於建立純量函式。建立聚合或視窗函式需要使用選項物件形式,如下所述。

目前無法在新增 UDF 後將其從資料庫控制代碼中移除。更準確地說,它們可以按照 sqlite3_create_function_v2() 的說明移除,但這樣做會「洩漏」這些函式的 JS 建立的 WASM 繫結。

在這個 API 的層級上,這種洩漏可能無法避免,因為執行 JS 到 WASM 函式轉換有多種途徑,並非所有途徑都在 sqlite3 API 的控制之下,而且沒有中央機構來追蹤這些轉換。由於函式轉換的記憶體是在 WASM 的基礎架構中管理的,sqlite3 無法看到,因此即使在關閉建立 UDF 的資料庫後,洩漏仍然存在。然而,在實務上,解除安裝 UDF 的情況很少見,而且這種洩漏只會影響安裝和解除安裝 UDF 的用戶端。可以透過用戶端層級的程式碼,藉由根據需要手動執行和管理 JS 到 WASM 函式轉換來避免這種洩漏。

成功時,返回此物件。發生錯誤時擲出例外。

從 SQL 呼叫時,UDF 的參數及其結果將在 JS 和 SQL 之間進行盡可能精確的轉換,如果無法確定類型轉換,則會觸發例外。由於 JS 和 C 世界之間的摩擦,數值轉換有一定的自由度:大於 32 位元的整數將被視為雙精度浮點數或 BigInt 值。

options 物件所需的數值會根據函數類型而有所不同

options 物件可以選擇性地包含一個 xDestroy 函數類型屬性,如同 sqlite3_create_function_v2() 所述。它的參數將是 pApp 屬性的 WASM 指標類型值,如果定義了 pApp 但它不是 null、undefined 或數值(WASM 指標)值,則此函數會拋出錯誤。也就是說,如果設定了 pApp,它必須是適合用作 WASM 指標參數的值,注意 nullundefined 在此用途下會轉換為 0。

options 物件可以包含用於修改函數定義方式的旗標

以下 options 物件屬性對應於以下網址所記錄的旗標

www:/c3ref/create_function.html

dbFilename()

string dbFilename(dbName='main')

這只是 sqlite3_db_filename() 的代理,返回與給定資料庫名稱關聯的檔案名稱,預設為 "main"。參數可以是 JS 字串或指向 WASM 配置的 C 字串的指標。如果此資料庫已關閉,則會拋出錯誤。

dbName()

string dbName(dbIndex=0)

返回給定以 0 為基底的資料庫編號的名稱,如 sqlite3_db_name() 的文件中所述。如果此資料庫已關閉,則會拋出錯誤。

dbVfsName()

string dbVfsName(dbName=0)

返回給定資料庫的 sqlite_vfs 名稱,預設為 "main"。資料庫名稱可以是 JS 或 WASM C 字串。如果此資料庫已關閉,則會拋出錯誤。

exec()

執行 SQL 陳述式,並可選擇性地收集查詢結果和/或為每個結果列呼叫回呼函數。呼叫形式

在後一種情況下,optionsObject.sql 必須包含要執行的 SQL。預設情況下,它返回此物件,但可以透過下方描述的 returnValue 選項進行更改。發生錯誤時會拋出錯誤。

如果未提供 SQL 或提供非字串,則會觸發例外狀況。另一方面,空的 SQL 僅僅是一個無操作。

可選的 options 物件可以包含以下任何屬性

以下選項*僅*適用於結果欄位計數非零的*第一個*語句,無論該語句是否實際產生任何結果列。

傳遞給回呼的第一個參數預設為來自目前結果列的值陣列,但可以使用... 進行更改

任何其他 rowMode 值都會觸發例外。

isOpen()

如果此資料庫控制代碼已開啟,則返回 true,否則返回 false。

openStatementCount()

返回此資料庫控制代碼目前已開啟的 Stmt 控制代碼的數量,如果此物件已 close(),則返回 0。請注意,只會計算透過 this.prepare() 準備的控制代碼,而不計算使用 capi.sqlite3_prepare_v3()(或等效函數)準備的控制代碼。

prepare()

編譯給定的 SQL 並返回已準備好的 Stmt。這是建立新的 Stmt 物件的唯一方法。發生錯誤時會拋出例外。

SQL 參數可以是 彈性字串 轉換所描述的任何類型。如果 SQL 不包含任何敘述,則會拋出 SQLite3Error

C API 允許空的 SQL,將其回報為 0 的結果代碼和 NULL 的 stmt 指標。在此支援該情況會導致所有客戶端產生額外的工作:在此類敘述上使用 Stmt API 必然會拋出例外,因此客戶端需要在呼叫 prepare() 後檢查 stmt.pointer,以確定 Stmt 實例是否為空。長期使用其他 sqlite3 腳本繫結的經驗表明,空準備的情況非常少見,以至於在此支援它只會損害整體可用性。

savepoint()

any savepoint(callback)

這與 transaction() 的運作方式類似,但使用 sqlite3 的 SAVEPOINT 功能。此函數會啟動一個儲存點(名稱未指定),並呼叫給定的回呼函數,將此資料庫物件傳遞給它。如果回呼函數返回,則會釋放(提交)儲存點。如果回呼函數拋出例外,則會回復儲存點。如果它沒有拋出例外,則會返回回呼函數的結果。

selectArray()

mixed selectArray(SQL [,bind])

準備 給定的 SQL,對其執行一次 step(),並返回一個包含第一個結果列值的陣列。如果沒有結果,則返回 undefined

如果傳遞的第二個參數不是 undefined,則會將其視為 Stmt.bind() 的參數,因此可以是該函數支援的任何類型。

發生錯誤時會拋出例外。

selectArrays()

mixed selectArrays(SQL [,bind])

執行指定的 SQL 並返回一個包含所有結果的陣列,其中每一列都表示為一個陣列,如同傳遞 `'array'` 給 exec()rowMode 選項一樣。空的結果集會解析為一個空陣列。第二個參數,如果有的話,會被視為傳遞給 exec()bind 選項。

發生錯誤時會拋出例外。

selectObject()

mixed selectObject(SQL [,bind])

準備指定的 SQL,執行一次 step(),並返回一個包含第一個結果列的鍵值對的物件。如果沒有結果,則返回 undefined

請注意,返回物件的鍵的順序不保證與查詢字串中欄位的順序相同。

如果傳遞的第二個參數不是 undefined,則會將其視為 Stmt.bind() 的參數,因此可以是該函數支援的任何類型。

發生錯誤時會拋出例外。

selectObjects()

mixed selectObjects(SQL [,bind])

selectArrays() 的工作方式相同,不同之處在於返回陣列中的每個值都是一個物件,如同傳遞 `"object"` 給 exec()rowMode 選項一樣。

selectValue()

any selectValue(SQL [,bind [,asType]])

準備指定的 SQL,對產生的 Stmt 執行一次 step(),並返回第一個結果欄位的值。如果沒有結果,則返回 undefined

如果傳遞了第二個參數,它會被視為 Stmt.bind() 的參數,因此可以是該函數支援的任何類型。傳遞 undefined 值與不傳遞值相同,這在… 的時候很有用。

如果傳遞了第三個參數,它應該是 SQLITE_{typename} 常數之一。傳遞 undefined 值與不傳遞值相同。

發生錯誤時拋出異常(例如 SQL 格式錯誤)。

selectValues()

array selectValues(SQL [,bind [,asType]])

執行指定的查詢,並返回一個陣列,其中包含結果集中每一列的第一個結果欄位的值。第二個參數是一個可選值,用於單參數呼叫 Stmt.bind()。第三個參數可以是任何適合用作 Stmt.get() 的第二個參數的值。如果需要第三個參數但不需要繫結資料,則將第二個參數傳遞為 undefined

如果沒有結果列,則返回一個空陣列。

transaction()

any transaction([beginQualifier,] callback)

開始一個事務,呼叫指定的回呼函數,然後根據回呼函數是否拋出異常來決定是回滾還是提交事務。回呼函數會將此物件作為其唯一參數。成功時,返回回呼函數的結果。發生錯誤時拋出異常。

請注意,事務不能巢狀,因此如果遞迴呼叫,則會拋出異常。對於巢狀事務,請使用 savepoint() 方法或使用 exec() 手動管理 SAVEPOINT。

如果使用兩個參數呼叫,則第一個參數必須是在 BEGIN 陳述式之後允許使用的關鍵字,例如 "DEFERRED"、"IMMEDIATE" 或 "EXCLUSIVE"。雖然這裡沒有硬編碼支援的關鍵字的確切清單,但為了與未來相容,如果參數看起來不像單個關鍵字,則會觸發異常並說明問題。

Stmt 類別

準備好的陳述式只能透過 DB.prepare() 方法 建立。直接呼叫建構函數會觸發異常。

及時完成陳述式非常重要,否則客戶端可能會在其應用程式稍後階段引入鎖定錯誤。

總體而言,客戶端可以透過使用 DB.exec() 方法 來避免陳述式生命週期問題。但是,對於需要更多控制或彈性的情況,客戶端需要 prepare() 陳述式,然後確保正確管理其生命週期。最簡單的方法是使用 try/finally 區塊,如下例所示

const stmt = myDb.prepare("...");
try {
  ... use the stmt object ...
} finally {
  stmt.finalize();
}

Stmt 非方法屬性

Stmt 方法

此類別的實體方法將在下方依字母順序說明。

bind()

Stmt bind([ndx=1,] value)

將一個或多個值繫結到其可繫結參數。它接受 1 或 2 個參數。

如果傳遞單一參數,它必須是一個陣列、一個物件或一個可繫結類型的值(見下文)。其繫結索引假設為 1。

如果傳遞 2 個參數,第一個是從 1 開始的繫結索引或可繫結參數名稱,第二個必須是可繫結類型的值。

可繫結值的類型

如果傳遞一個陣列,陣列的每個元素都會繫結到等於陣列索引加 1 的參數索引(因為陣列是從 0 開始,但繫結是從 1 開始)。

如果傳遞一個物件,每個物件鍵都會被視為一個可繫結參數名稱。物件鍵*必須*與任何可繫結參數名稱相符,包括任何 $@: 前綴。因為 $ 在 JavaScript 中是合法的識別字元,所以建議將其作為可繫結參數的前綴:stmt.bind({$a: 1, $b: 2})

成功時返回此物件,錯誤時拋出錯誤。錯誤包括:

bindAsBlob()

Stmt bind([ndx=1,] value)

bind() 的特殊情況,它使用 BLOB 繫結機制繫結指定的值,而不是使用為該值選擇的預設機制。索引可以是編號或命名的繫結索引。值必須是字串類型、null/undefined(兩者都被視為 null)或bind()支援的 TypedArray 類型。

如果只傳入一個參數,則假定繫結索引為 1,且第一個參數為值。

clearBindings()

Stmt clearBindings()

清除所有繫結的值。返回此物件。如果此語句已完成,則拋出異常。

finalize()

void finalize()

「完成」此語句。如果語句已經完成,則此操作無效。返回底層 `sqlite3_finalize()` 呼叫的值(成功時為 0,錯誤時為非 0),如果語句已經完成,則返回 `undefined`。如果 `sqlite3_finalize()` 返回非 0 值,它不會拋出異常,因為此函數實際上是一個解構函數,而「解構函數不拋出異常」。如果在透過 DB.exec() 回呼函數主動使用語句時呼叫此函數,則*會*拋出異常。

如果在此之後呼叫此類別中的大多數方法,則會拋出異常。

get()

any get(ndx [, asType])

從目前資料列的指定 0 基底的欄位索引擷取值,如果索引超出範圍,則拋出異常。

需要 `step()` 剛返回一個真值,否則會拋出異常。

預設情況下,它會自動判斷結果的資料類型。如果傳入第二個參數,它必須是 sqlite3 類型的列舉值之一,這些值定義為 sqlite3 命名空間的成員:`SQLITE_INTEGER`、`SQLITE_FLOAT`、`SQLITE_TEXT`、`SQLITE_BLOB`。除 `undefined` 外的任何其他值都會觸發異常。傳入 `undefined` 與不傳入值相同。例如,以字串形式擷取整數值是合法的,在這種情況下,sqlite3 會將該值轉換為字串。

如果索引是一個陣列,則此函數的行為不同:它會將陣列的索引(從 0 到結果欄位的數量)指派給對應結果欄位的值,並返回該陣列。

const values = stmt.get([]);

將返回一個陣列,其中包含語句目前列的每個結果欄位的一個項目。

如果索引是一個普通物件,則此函數的行為更加不同:它會將物件的屬性指派給對應結果欄位的值。

const values = stmt.get({});

返回一個物件,其屬性以結果集的欄位命名。請注意,屬性的順序未定義。如果它們的順序很重要,請改用陣列形式。

Blob 以 Uint8Array 實例返回。

*64 位元整數的特殊情況處理:* Number 類型用於浮點數和足夠小以至於可以放入其中而不會損失精度的整數。如果擷取較大的整數,則在啟用該支援的情況下,它將作為 BigInt 返回,否則將拋出異常。Number 類別支援的整數範圍定義為

getBlob()

Uint8Array|null get(ndx)

等效於 `get(ndx)`,但會將結果強制轉換為 Uint8Array。

getColumnName()

string getColumnName(ndx)

返回指定索引的結果欄位名稱,如果索引超出界限或此語句已完成,則拋出異常。這可以在未先執行 `step()` 的情況下使用。

getColumnNames()

array getColumnNames(target=[])

如果此語句可能具有結果欄位,則此函數返回所有此類名稱的陣列。如果傳入一個陣列,則將其用作目標,並將所有名稱附加到其中。返回目標陣列。如果此語句不能具有結果欄位,則拋出異常。在準備語句時設定的 `this.columnCount` 保存欄位的數量。

getFloat()

number|null get(ndx)

等效於 `get(ndx)`,但會將結果強制轉換為數字。

getInt()

number|null get(ndx)

等效於 `get(ndx)`,但會將結果強制轉換為數字。

getJSON()

any get(ndx)

等同於 getString(ndx),但會將擷取到的字串傳遞給 JSON.parse() 進行解析並返回結果。若 JSON 解析發生錯誤,則會拋出該例外。

getParamIndex()

int getParamIndex(name)

如果此敘述具有已命名的可繫結參數,且給定的名稱與其中一個參數相符,則會返回其從 1 開始的繫結索引。如果找不到相符的名稱,則會返回 0。如果它沒有可繫結的參數,則會返回 undefined 值。

getParamName()

string getParamName(ndx)

3.47 版新增。

行為類似 sqlite3_bind_parameter_name()。如果 ndx 超出範圍,則返回 null;如果此物件沒有繫結的參數,則返回 undefined

getString()

string|null get(ndx)

等同於 get(ndx),但會將結果強制轉換為字串。

isBusy()

bool isBusy()

3.47 版新增。

行為類似 sqlite3_stmt_busy(),但會將其結果以布林值而非整數返回。

isBusy()

bool isReadOnly()

3.47 版新增。

行為類似 sqlite3_stmt_readonly(),但會將其結果以布林值而非整數返回。

reset()

Stmt reset(alsoClearBinds=false)

重設定述,以便可以從頭開始再次執行 step()。返回 this。如果此敘述已完成、由於目前正在從 DB.exec() 回呼中使用而無法合法重設,或者(從 3.42.1 和 3.43 版開始)如果底層呼叫 sqlite3_reset() 返回非 0 值,則會拋出例外。

如果傳遞了真值參數,則也會呼叫 this.clearBindings(),否則會保留任何現有的繫結以及為它們配置的任何記憶體。

在 3.42.0 和更早版本中,如果 sqlite3_reset() 返回非 0 值,此函數不會拋出例外,但我們發現拋出例外(或大量的額外客戶端程式碼)對於避免某些靜默失敗的情況是必要的,如 SQLite 論壇中的討論 所述。

step()

bool step()

執行敘述一次。如果結果表示有一列數據可用,則返回真值。如果沒有數據列可用,則返回假值。發生錯誤時拋出例外。

stepFinalize()

bool stepFinalize()

功能類似於 step(),除了它會在執行步驟後立即呼叫此敘述的 finalize(),除非 step() 拋出例外。

成功時,如果步驟指示有一列數據可用,則返回 true,否則返回 false。

這旨在簡化以下用例:

db.prepare("INSERT INTO foo(a) VALUES(?)").bind(123).stepFinalize();

stepReset()

Stmt stepReset()

功能與 step() 完全相同,除了...

這旨在簡化以下結構:

for(...) {
  stmt.bind(...).stepReset();
}

請注意,呼叫 reset() 會導致在執行步驟後呼叫 this.get() 變成非法操作。

JsStorageDb

當 sqlite3 API 安裝在主執行緒中時,會新增 JsStorageDb 類別,它是 DB 類別的子類別,簡化了kvvfs 的使用。

const db = new sqlite3.oo1.JsStorageDb('local' /* or 'session' */);
... use like any other db ...
if( db.storageSize() ) {
  db.clearStorage(); // empty it!
}
db.close();

JsStorageDb 物件包含以下類別層級方法:

它們只是 sqlite3_js_kvvfs_clear()sqlite3_js_kvvfs_size() 的代理。具有相同名稱的成員函數僅在其自己的儲存物件上運作。

const db = new sqlite3.oo1.JsStorageDb('local');
console.log('db size =',db.storageSize()); // only localStorage size
db.clearStorage(); // clears only the localStorage db

從 3.46 版開始,建構函數可以選擇性地接受與 DB 類別建構函數相同形式的選項物件,而不僅僅是檔案名稱。這可以啟用例如在這些物件上啟用 SQL 追蹤。

OpfsDb 類別

OpfsDb 是 DB 類別的子類別,僅在OPFS VFS 支援啟用時才會安裝。它的使用方法如下:

const db = new sqlite3.oo1.OpfsDb('/path/to/my/db','c');
// Or: new sqlite3.oo1.OpfsDb({filename: ..., flags: 'c'});

這些參數的意義與 DB 建構式相同,但如果開啟旗標包含 'c'(建立),則檔案之前的目錄部分*將會被建立*。如果資料庫無法開啟,它會拋出錯誤。有關檔案鎖定的資訊,請參閱 OPFS VFS 文件,並注意任何給定的資料庫都可供目前正在造訪相同 HTTP 源的所有瀏覽器分頁存取。

這個子類別在 API 中新增了一個*靜態*方法

OpfsDb.importDb()

(新增於 3.43 版。)

類別層級(靜態)的 importDb() 方法可以(非同步地)將資料庫匯入 OPFS 儲存空間。它僅適用於資料庫檔案,如果傳入不同檔案類型,則會拋出錯誤。用法

sqlite3.oo1.OpfsDb.importDb('filename', byteArray);

注意事項

發生錯誤時會拋出錯誤,導致 promise 被拒絕。在這種情況下,它可能會在檔案系統中留下部分寫入的檔案。

從 3.44 版開始,如果為其第二個參數傳入一個函式,則其行為會更改為以區塊形式匯入資料,這些區塊由給定的回呼函式提供。它會重複呼叫回呼(可以是非同步的),並預期傳回值是 Uint8Array 或 ArrayBuffer(表示新的輸入)或 undefined(表示 EOF)。只要回呼繼續傳回非 undefined 值,它就會將傳入的資料附加到給定的 VFS 裝載的資料庫檔案。


  1. ^ 回想一下,函式的 length 是它已宣告的參數數量。