跳至...
- DB 類別是核心資料庫類別。
- Stmt 類別表示已準備好的陳述式 (prepared statements)。
- JsStorageDb 類別簡化了 kvvfs 的使用,kvvfs 可讓資料庫儲存在
localStorage
和sessionStorage
中。 - OpfsDb 類別是一個方便使用的子類別,用於 opfs VFS。
當 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 建構子
new DB([filename=':memory:' [, flags='c' [, vfs]]])
建立與指定檔案的連線,如果需要,可以選擇建立檔案。new DB(object)
一種更具彈性的形式,可以「面向未來」,以便添加更多標誌。
對於第二種形式,物件可以包含以下任何內容
{
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:" 和 ""(臨時資料庫)在此具有其正常的特殊含義。
第二個參數指定資料庫的開啟/建立模式。它必須是包含一系列字母(順序任意,但區分大小寫)的字串,用於指定模式
"c"
:如果不存在則建立,如果不存在則失敗。隱含"w"
標誌。"w"
:寫入。隱含"r"
:資料庫不能是唯寫的。"r"
:如果未提供"w"
或"c"
,則為唯讀,否則將被忽略。"t"
:啟用在此資料庫控制代碼上執行的 SQL 追蹤,將其發送到console.log()
。要稍後停用它,請呼叫sqlite3.capi.sqlite3_trace_v2(thisDb.pointer, 0, 0, 0)
。
如果未提供 "w",則資料庫隱含為唯讀,請注意 "rc" 沒有意義
目前會忽略任何其他字母。預設值為 "c"。對於特殊的 ":memory:" 和 "" 名稱,這些模式會被忽略,並且可能被特定的 VFS 忽略。
最後一個參數類似於 sqlite3_open_v2()
的最後一個參數:sqlite3 VFS 的名稱。傳遞一個假值或完全不傳遞任何值以使用預設值。如果傳遞一個值,它必須是 VFS 的字串名稱
filename
和 vfs
參數可以是 JS 字串或透過 WASM 分配的 C 字串。
為了將 DB 實例傳遞給 C 風格的 sqlite3 函數,DB 物件的唯讀 pointer
屬性會保存其 sqlite3*
指標值。該屬性還可以用於檢查此 DB 實例是否仍然開啟。
在主視窗執行緒中,檔案名稱 ":localStorage:"
和 ":sessionStorage:"
是特殊的:它們會導致資料庫使用 localStorage
或 sessionStorage
來儲存資料庫,使用 kvvfs。如果使用這些名稱之一,它們將優先於參數中設定的任何 VFS 名稱。
建構函數在發生錯誤時會丟擲 SQLite3Error。
參見加密
對於選項物件呼叫形式,從版本 3.46 開始,該物件可以包含使用商業 SQLite 加密擴展 (SEE) 編碼的資料庫的加密金鑰。
除非與 支援 SEE 的 JS/WASM 組建 一起使用,否則此選項無效。
要開啟或建立加密的資料庫,請在選項物件中提供以下屬性*之一*:key
、hexkey
或 textkey
。每一個都可以是字串、ArrayBuffer 或 Uint8Array,並在開啟資料庫時作為資料庫金鑰應用,如 SEE 文件中針對具有相同名稱的語法所述。如果提供了多個 key
、hexkey
或 textkey
,或者選項的類型不受支援,則會丟擲例外狀況。
DB 類別屬性和方法
checkRc(db,resultCode)
預計會給定一個 DB 實例或一個 sqlite3*
指標(可以是 null)和一個 sqlite3 API 結果代碼。如果結果代碼不是假值,則此函數會使用給定的資料庫控制代碼從 sqlite3_errmsg()
丟擲一個帶有錯誤訊息的 SQLite3Error,如果資料庫控制代碼是假值或是一個已 close()
的 DB 實例,則使用 sqlite3_errstr()
。
請注意,如果傳遞的是非錯誤代碼,例如 SQLITE_ROW
或 SQLITE_DONE
,它仍然會丟擲,但錯誤字串可能是「不是錯誤」。需要在預期它們的用戶端代碼中檢查各種非 0 非錯誤代碼。
如果它沒有丟擲,它會返回其 db 參數(如果作為成員函數呼叫,則為 this
)。
DB 非方法屬性
filename
會解析為傳遞給建構函式的檔案名稱。pointer
會解析為此物件所包裝的sqlite3*
。這個值可以傳遞給任何接受sqlite3*
參數的 WASM 綁定函式。在此物件被close()
後,它會解析為undefined
。
資料庫方法
此類別的實體方法將在下方依字母順序說明。
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, function)
(name, function, optionsObject)
(name, optionsObject)
(optionsObject)
在最後兩種情況下,函式必須在選項物件中定義,如下所述。在最後一種情況下,函式的名稱必須是 name
屬性。
前兩種呼叫形式只能用於建立純量函式。建立聚合或視窗函式需要使用選項物件形式,如下所述。
目前無法在新增 UDF 後將其從資料庫控制代碼中移除。更準確地說,它們可以按照 sqlite3_create_function_v2() 的說明移除,但這樣做會「洩漏」這些函式的 JS 建立的 WASM 繫結。
成功時,返回此物件。發生錯誤時擲出例外。
從 SQL 呼叫時,UDF 的參數及其結果將在 JS 和 SQL 之間進行盡可能精確的轉換,如果無法確定類型轉換,則會觸發例外。由於 JS 和 C 世界之間的摩擦,數值轉換有一定的自由度:大於 32 位元的整數將被視為雙精度浮點數或 BigInt 值。
options 物件所需的數值會根據函數類型而有所不同
純量函數 (Scalar):將
xFunc
函數類型屬性設定為 UDF 函數。聚合函數 (Aggregate):將
xStep
和xFinal
函數類型屬性設定為聚合函數的「step」和「final」回呼函數。不要設定xFunc
屬性。視窗函數 (Window):設定
xStep
、xFinal
、xValue
和xInverse
函數類型屬性。不要設定xFunc
屬性。
options 物件可以選擇性地包含一個 xDestroy
函數類型屬性,如同 sqlite3_create_function_v2()
所述。它的參數將是 pApp
屬性的 WASM 指標類型值,如果定義了 pApp
但它不是 null、undefined 或數值(WASM 指標)值,則此函數會拋出錯誤。也就是說,如果設定了 pApp
,它必須是適合用作 WASM 指標參數的值,注意 null
或 undefined
在此用途下會轉換為 0。
options 物件可以包含用於修改函數定義方式的旗標
arity
:SQL 呼叫此函數時預期或需要的參數數量。預設值為X.length
減 1(請參閱下方說明原因)1,其中X
是xFunc
或xStep
,取決於正在建立的函數類型。特殊情況是,如果X.length
為 0,則其 arity 也為 0 而不是 -1。負的 arity 值表示該函數是可變參數的,可以接受任何數量的參數,最多到 sqlite3 的編譯時限制。如果 arity 值為零或更大,sqlite3 將會強制執行參數計數。
回呼函數總是接收指向sqlite3_context
物件的指標作為其第一個參數。之後的任何參數都來自 SQL 程式碼。開頭的 context 參數*不*計入函數的 arity。有關為何介面中需要該參數,請參閱sqlite3_create_function()
的文件。
以下 options 物件屬性對應於以下網址所記錄的旗標
www:/c3ref/create_function.html
deterministic
=sqlite3.capi.SQLITE_DETERMINISTIC
directOnly
=sqlite3.capi.SQLITE_DIRECTONLY
innocuous
=sqlite3.capi.SQLITE_INNOCUOUS
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 陳述式,並可選擇性地收集查詢結果和/或為每個結果列呼叫回呼函數。呼叫形式
exec(sql, optionsObject)
exec(optionsObject)
在後一種情況下,optionsObject.sql
必須包含要執行的 SQL。預設情況下,它返回此物件,但可以透過下方描述的 returnValue
選項進行更改。發生錯誤時會拋出錯誤。
如果未提供 SQL 或提供非字串,則會觸發例外狀況。另一方面,空的 SQL 僅僅是一個無操作。
可選的 options 物件可以包含以下任何屬性
sql
:要執行的 SQL 語法(除非它作為第一個參數提供)。SQL 可以包含任意數量的語句。bind
:一個有效值,作為 Stmt.bind() 的參數。這*僅*應用於 SQL 中第一個具有可綁定參數的非空語句。(空語句將被完全跳過。)saveSql
:一個可選的陣列。如果設定,每個已執行語句的 SQL 將在語句執行之前(但在準備之後 - 在那之後我們才能知道個別語句的範圍)附加到此陣列。空的 SQL 語句將被省略。每個字串的內容與輸入相同(例如,不執行綁定參數展開),唯一的變化是輸入被分成個別的語句。returnValue
:是一個指定此函數應返回什麼的字串- 預設值(通常)是
"this"
,表示應返回 DB 物件本身。例外情況是,如果呼叫者既未傳遞callback
也未傳遞returnValue
,但確實傳遞了明確的rowMode
,則預設的returnValue
為"resultRows"
,如下所述。 "resultRows"
表示返回resultRows
選項的值。如果未設定resultRows
,則此函數的行為如同將其設定為空陣列。"saveSql"
表示返回saveSql
選項的值。如果未設定saveSql
,則此函數的行為如同將其設定為空陣列。
- 預設值(通常)是
以下選項*僅*適用於結果欄位計數非零的*第一個*語句,無論該語句是否實際產生任何結果列。
callback
:一個函數,會針對結果集的每一列呼叫(請參閱下方的rowMode
),但前提是該語句具有結果*列*。回呼的this
是選項物件,請注意,如果呼叫者未提供選項物件,則此函數將合成一個。傳遞給回呼的第二個參數始終是目前的 Stmt 物件,因為如果呼叫者想要獲取欄位名稱或其他類似內容,則需要它(請注意,如果客戶端提供columnNames
選項,它們也可以透過this.columnNames
獲取)。如果回呼返回字面值false
(而不是任何其他假值,例如隱式undefined
返回),則任何正在進行的語句step()
迭代都會停止,且不會出現錯誤。否則,回呼的返回值將被忽略。
注意:回呼*不得*修改 Stmt 物件。呼叫任何Stmt.get()
變體、Stmt.getColumnName()
或類似方法是合法的,但呼叫step()
或finalize()
則不合法。在此上下文中非法的成員方法將觸發例外,但客戶端也必須避免使用任何可能修改語句的低階(C 樣式)API。columnNames
:如果這是一個陣列,則結果集的欄位名稱會儲存在此陣列中,然後再觸發回呼(如果有的話)(無論查詢是否產生任何結果列)。如果沒有語句具有結果欄位,則此值保持不變。注意:SQL 結果可能有多個名稱相同的欄位。resultRows
:如果這是一個陣列,它的功能類似於callback
選項:結果集的每一列(如果有的話),但rowMode
的 'stmt' 值不合法。同時使用resultRows
和callback
是合法的,但對於小型資料集,resultRows
可能更容易使用,並且可以透過 WebWorker 樣式的訊息介面使用。如果設定了resultRows
且rowMode
為 'stmt',則exec()
會拋出例外。
傳遞給回呼的第一個參數預設為來自目前結果列的值陣列,但可以使用... 進行更改
rowMode
:指定回呼函數的第一個參數的類型。它可以是以下任何一種…- 一個字串,描述應該將何種類型的參數作為第一個參數傳遞給回呼函數。
'array'
(預設值)會將stmt.get([])
的結果傳遞給callback
並/或附加到resultRows
。'object'
會將stmt.get(Object.create(null))
的結果傳遞給callback
並/或附加到resultRows
。注意:SQL 結果可能有多個同名的欄位。在這種情況下,最右邊的欄位將會是被設定在此物件中的欄位!'stmt'
會將目前的 Stmt 傳遞給回呼函數,但如果resultRows
是一個陣列,此模式將會觸發例外,因為將敘述附加到陣列將完全沒有幫助。
- 一個整數,表示結果列中以零為基底的欄位索引。只會傳遞該單一值。
- 一個最小長度為 2 且首字元為
$
的字串將會以物件形式擷取該列,提取該欄位,並將該欄位的值傳遞給回呼函數。請注意,這些鍵值區分大小寫,因此必須與 SQL 中使用的大小寫相符。例如,使用rowMode
為'$A'
的"select a A from t"
可以運作,但'$a'
則不行。參考結果集中不存在的欄位將會在第一列觸發例外(因為直到擷取列時才會執行檢查)。
- 一個字串,描述應該將何種類型的參數作為第一個參數傳遞給回呼函數。
任何其他 rowMode
值都會觸發例外。
isOpen()
如果此資料庫控制代碼已開啟,則返回 true,否則返回 false。
openStatementCount()
返回此資料庫控制代碼目前已開啟的 Stmt 控制代碼的數量,如果此物件已 close()
,則返回 0。請注意,只會計算透過 this.prepare()
準備的控制代碼,而不計算使用 capi.sqlite3_prepare_v3()
(或等效函數)準備的控制代碼。
prepare()
編譯給定的 SQL 並返回已準備好的 Stmt。這是建立新的 Stmt 物件的唯一方法。發生錯誤時會拋出例外。
SQL 參數可以是 彈性字串 轉換所描述的任何類型。如果 SQL 不包含任何敘述,則會拋出 SQLite3Error。
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 非方法屬性
columnCount
這個語句的結果欄位數量,如果語句沒有結果欄位則為 0。小提醒:對於所有版本 > 3.42.0,這是一個會呼叫
sqlite3_column_count()
的屬性攔截器,因此應避免在迴圈中使用它,因為會產生呼叫的額外負擔。在版本 <= 3.42.0 中,這個值會在語句建立時收集並快取,但如果在語句作用期間修改資料庫結構描述,可能會導致錯誤行為。parameterCount
這個語句的可繫結參數數量。pointer
解析為這個物件所包裝的sqlite3_stmt*
。這個值可以傳遞給任何接受sqlite3_stmt*
參數的 WASM 繫結函式。在這個語句被finalized()
之後,它會解析為undefined
。
Stmt 方法
此類別的實體方法將在下方依字母順序說明。
bind()
Stmt bind([ndx=1,] value)
將一個或多個值繫結到其可繫結參數。它接受 1 或 2 個參數。
如果傳遞單一參數,它必須是一個陣列、一個物件或一個可繫結類型的值(見下文)。其繫結索引假設為 1。
如果傳遞 2 個參數,第一個是從 1 開始的繫結索引或可繫結參數名稱,第二個必須是可繫結類型的值。
可繫結值的類型
null
會被繫結為 NULL。單獨的
undefined
值是一個無操作:將undefined
作為值傳遞給這個函式實際上不會繫結任何東西,而且這個函式會跳過確認繫結是否合法的步驟。(這些語義簡化了某些客戶端的使用。)相反地,當繫結陣列/物件時(見下文),陣列或物件屬性中的undefined
值會被視為與null
相同。數字會被繫結為雙精度浮點數或整數:如果它們大於 32 位元,則為雙精度浮點數,否則為雙精度浮點數或 int32,取決於它們是否有小數部分。布林值會被繫結為整數 0 或 1。由於 sqlite3 的資料類型模型,預期將沒有小數部分的雙精度浮點數繫結為整數的區別對於大多數客戶端來說並不重要。如果啟用了BigInt支援,則此例程會將 BigInt 值繫結為 64 位元整數(如果它們符合 64 位元)。如果該支援被禁用,它會將 BigInt 儲存為 int32 或雙精度浮點數(如果可以這樣做而不損失精度)。無論哪種情況,如果 BigInt *太大*,則會拋出錯誤。
字串會被繫結為字串(使用
bindAsBlob()
強制 blob 繫結)。Uint8Array、Int8Array 和 ArrayBuffer 實例會被繫結為 blob。
如果傳遞一個陣列,陣列的每個元素都會繫結到等於陣列索引加 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 類別支援的整數範圍定義為
Number.MIN_SAFE_INTEGER
= -9007199254740991Number.MAX_SAFE_INTEGER
= 9007199254740991
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() 完全相同,除了...
- 成功時,它會呼叫
this.reset()
並返回此物件。 - 發生錯誤時,它會拋出例外且不會呼叫
reset()
。
這旨在簡化以下結構:
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
物件包含以下類別層級方法:
JsStorageDb.clearStorage()
JsStorageDb.storageSize()
它們只是 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);
注意事項
它必然是非同步的。
如果在呼叫此函式時指定的資料庫檔案已開啟,則結果未定義。
第二個參數可以是位元組陣列(例如 Uint8Array)或 ArrayBuffer。(或者從 3.44 版開始,可以是一個函式 - 如下所述。)
它僅適用於 SQLite3 資料庫檔案。它會檢查輸入的大小和標頭以確保它是資料庫,並且會針對非資料庫檔案拋出錯誤。(這是為了防止這個範圍非常狹窄的函式成為將檔案饋送到 OPFS 的通用後門。)
名稱的任何目錄部分都會自動建立。
成功時,它的解析值是寫入的位元組數。
如果匯入的資料庫處於 WAL 模式,則會強制其退出 WAL 模式,因為此版本不支援 WAL。
發生錯誤時會拋出錯誤,導致 promise 被拒絕。在這種情況下,它可能會在檔案系統中留下部分寫入的檔案。
從 3.44 版開始,如果為其第二個參數傳入一個函式,則其行為會更改為以區塊形式匯入資料,這些區塊由給定的回呼函式提供。它會重複呼叫回呼(可以是非同步的),並預期傳回值是 Uint8Array 或 ArrayBuffer(表示新的輸入)或 undefined
(表示 EOF)。只要回呼繼續傳回非 undefined
值,它就會將傳入的資料附加到給定的 VFS 裝載的資料庫檔案。
- ^ 回想一下,函式的
length
是它已宣告的參數數量。