在 Kotlin/JS 上開始使用 SQLDelight
INFO
同步的 sqljs-driver
(2.0 之前) 已被非同步的 web-worker-driver
取代。 這要求您在 Gradle 配置中設定 generateAsync
選項。
首先在您的專案中應用 Gradle 外掛。
plugins {
id("app.cash.sqldelight") version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
create("Database") {
packageName.set("com.example")
}
}
}
plugins {
id "app.cash.sqldelight" version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
Database { // This will be the name of the generated database class.
packageName = "com.example"
}
}
}
您可以在 src/main/sqldelight
目錄下的 .sq
檔案中撰寫您的 SQL 語句。通常 .sq
檔案中的第一個語句會建立一個資料表,但您也可以建立索引或設定預設內容。
CREATE TABLE hockeyPlayer (
player_number INTEGER PRIMARY KEY NOT NULL,
full_name TEXT NOT NULL
);
CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);
INSERT INTO hockeyPlayer (player_number, full_name)
VALUES (15, 'Ryan Getzlaf');
從這些語句中,SQLDelight 將會生成一個 Database
類別,附帶一個相關的 Schema
物件,可用於建立您的資料庫並在其上執行語句。這個 Database
類別是由 generateSqlDelightInterface
Gradle 任務生成的,該任務會在您編輯 .sq
檔案時由 SQLDelight IDE 外掛程式自動執行,並且也是正常 Gradle 建構過程的一部分。
kotlin {
sourceSets.jsMain.dependencies {
implementation("app.cash.sqldelight:web-worker-driver:2.1.0")
implementation(devNpm("copy-webpack-plugin", "9.1.0"))
}
}
kotlin {
sourceSets.jsMain.dependencies {
implementation "app.cash.sqldelight:web-worker-driver:2.1.0"
implementation devNpm("copy-webpack-plugin", "9.1.0")
}
}
Web Worker 驅動程式允許 SQLDelight 與在 Web Worker 中執行的 SQL 實作進行通訊。這使得所有資料庫操作都能在背景程序中執行。
INFO
Web Worker 驅動程式僅與瀏覽器目標相容。
配置 Web Worker
SQLDelight 的 Web Worker 驅動程式並未綁定到某個特定的 Worker 實作。相反地,該驅動程式使用一套標準化的訊息與 Worker 進行通訊。SQLDelight 提供了一個使用 SQL.js 的 Worker 實作。
有關如何在您的專案中設定它的詳細資訊,請參閱 SQL.js Worker 頁面;有關如何實作您自己的 Worker,則請參閱 Custom Workers 頁面。
使用 Web Worker
建立 Web Worker 驅動程式實例時,您必須傳遞一個對 Web Worker 的參考,該 Worker 將用於處理所有 SQL 操作。Worker
建構式接受一個參考 Worker 腳本的 URL
物件。
Webpack 透過將 import.meta.url
作為第二個參數傳遞給 URL
建構式,對從已安裝的 NPM 套件中引用 Worker 腳本有特殊支援。Webpack 將在建置時自動捆綁來自所引用 NPM 套件的 Worker 腳本。下面的範例展示了從 SQLDelight 的 SQL.js Worker 建立一個 Worker。
val driver = WebWorkerDriver(
Worker(
js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)""")
)
)
DANGER
為了讓 Webpack 在捆綁時正確解析此 URL,您必須如上所示,將 URL
物件完全在 js()
區塊內建構,並帶有 import.meta.url
參數。
從這裡開始,您就可以像使用任何其他 SQLDelight 驅動程式一樣使用它。
使用查詢
定義型別安全的查詢
SQLDelight 將為 .sq
檔案中任何標記的 SQL 陳述式生成型別安全的函式。
selectAll:
SELECT *
FROM hockeyPlayer;
insert:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES (?, ?);
insertFullPlayerObject:
INSERT INTO hockeyPlayer(player_number, full_name)
VALUES ?;
每個包含標記陳述式的 .sq
檔案都將生成一個 Queries
物件。例如,上述 Player.sq
檔案將生成一個 PlayerQueries
物件。此物件可用於呼叫生成的型別安全函式,這些函式將執行實際的 SQL 陳述式。
fun doDatabaseThings(driver: SqlDriver) {
val database = Database(driver)
val playerQueries: PlayerQueries = database.playerQueries
println(playerQueries.selectAll().AsList())
// [HockeyPlayer(15, "Ryan Getzlaf")]
playerQueries.insert(player_number = 10, full_name = "Corey Perry")
println(playerQueries.selectAll().AsList())
// [HockeyPlayer(15, "Ryan Getzlaf"), HockeyPlayer(10, "Corey Perry")]
val player = HockeyPlayer(10, "Ronald McDonald")
playerQueries.insertFullPlayerObject(player)
}
就這樣!請查看側邊欄中的其他頁面以了解其他功能。