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 { // 这将是生成的数据库类的名称。
      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 驱动不绑定于特定的工作线程实现。相反,该驱动使用一组标准化的消息与工作线程通信。SQLDelight 提供了一个使用 SQL.js 的工作线程实现。

请参阅 SQL.js Worker 页面了解如何为您的项目设置它,或参阅 Custom Workers 页面了解如何实现您自己的工作线程。

使用 Web Worker

创建 Web Worker 驱动实例时,您必须传递一个对将用于处理所有 SQL 操作的 Web Worker 的引用。Worker 构造函数接受一个引用工作线程脚本的 URL 对象。

Webpack 对从已安装的 NPM 包中引用工作线程脚本有特殊支持,通过将 import.meta.url 作为第二个参数传递给 URL 构造函数。Webpack 将在构建时自动捆绑引用 NPM 包中的工作线程脚本。以下示例展示了从 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)
}

就是这样!请查看侧边栏中的其他页面,了解其他功能。