Skip to content

在 Kotlin/JS 上開始使用 SQLDelight

INFO

同步的 sqljs-driver (2.0 之前) 已被非同步的 web-worker-driver 取代。 這要求您在 Gradle 配置中設定 generateAsync 選項。

首先在您的專案中應用 Gradle 外掛。

kotlin
plugins {
  id("app.cash.sqldelight") version "2.1.0"
}

repositories {
  google()
  mavenCentral()
}

sqldelight {
  databases {
    create("Database") {
      packageName.set("com.example")
    }
  }
}
groovy
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 檔案中的第一個語句會建立一個資料表,但您也可以建立索引或設定預設內容。

sql
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
kotlin {
  sourceSets.jsMain.dependencies {
    implementation("app.cash.sqldelight:web-worker-driver:2.1.0")
    implementation(devNpm("copy-webpack-plugin", "9.1.0"))
  }
}
groovy
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。

kotlin
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 陳述式生成型別安全的函式。

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 陳述式。

kotlin
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)
}

就這樣!請查看側邊欄中的其他頁面以了解其他功能。