在 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 { // 这将是生成的数据库类的名称。
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 驱动不绑定于特定的工作线程实现。相反,该驱动使用一组标准化的消息与工作线程通信。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。
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)
}
就是这样!请查看侧边栏中的其他页面,了解其他功能。