Skip to content

SQLDelight on Kotlin/JS 入门

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 {
    register("Database") {
      packageName.set("com.example")
    }
  }
}
groovy
plugins {
  id "app.cash.sqldelight" version "2.1.0"
}

repositories {
  google()
  mavenCentral()
}

sqldelight {
  databases {
    register("Database") { // 这将是生成的数据库类的名称。
      packageName = "com.example"
    }
  }
}

rc/main/sqldelight` 文件夹下的 `.sq` 文件中编写您的 SQL 语句。
.sq` 文件中的第一个语句会创建一个表,但您也可以创建索引或设置默认内容。

ql title="src/main/sqldelight/com/example/sqldelight/hockey/data/Player.sq"
TE TABLE hockeyPlayer (
ayer_number INTEGER PRIMARY KEY NOT NULL,
ll_name TEXT NOT NULL


TE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);

RT INTO hockeyPlayer (player_number, full_name)
ES (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)""")
  )
)

WARNING

为了让 Webpack 在打包时正确解析此 URL,您必须完全在 js() 块内构造 URL 对象,如上所示,并带有 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)
}

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