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 {
register("Database") {
packageName.set("com.example")
}
}
}plugins {
id "app.cash.sqldelight" version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
register("Database") { // これは生成されるデータベースクラスの名前になります。
packageName = "com.example"
}
}
}
テートメントは、`src/main/sqldelight` 配下の `.sq` ファイルに記述します。
.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はデータベースの作成やステートメントの実行に使用できる、`Schema`オブジェクトが関連付けられた`Database`クラスを生成します。`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"))
}
}
```
kotlin {
sourceSets.jsMain.dependencies {
implementation "app.cash.sqldelight:web-worker-driver:2.1.0"
implementation devNpm("copy-webpack-plugin", "9.1.0")
}
}web worker driver を使用すると、SQLDelight は Web Worker 内で実行されている SQL 実装と通信できるようになります。これにより、すべてのデータベース操作をバックグラウンドプロセスで実行できます。
INFO
web worker driver はブラウザターゲットとのみ互換性があります。
Web Worker の構成
SQLDelight の web worker driver は、特定のワーカー実装に固定されているわけではありません。その代わりに、ドライバーは標準化されたメッセージセットを使用してワーカーと通信します。SQLDelight は SQL.js を使用するワーカーの実装を提供しています。
プロジェクトでのセットアップの詳細については SQL.js Worker ページを、独自のワーカーを実装する方法の詳細については Custom Workers ページを参照してください。
Web Worker の使用
web worker driver のインスタンスを作成する際、すべての SQL 操作を処理するために使用される Web Worker への参照を渡す必要があります。Worker コンストラクタは、ワーカースクリプトを参照する URL オブジェクトを受け取ります。
Webpack は、URL コンストラクタの第 2 引数として import.meta.url を渡すことで、インストールされた NPM パッケージからワーカースクリプトを参照するための特別なサポートを備えています。Webpack は、ビルド時に参照された NPM パッケージからワーカースクリプトを自動的にバンドルします。以下の例は、SQLDelight の SQL.js Worker から Worker を作成する方法を示しています。
val driver = WebWorkerDriver(
Worker(
js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)""")
)
)WARNING
Webpack がバンドル中にこの URL を正しく解決できるようにするには、上記の import.meta.url 引数を使用した例のように、URL オブジェクトを完全に js() ブロック内で構築する必要があります。
ここからは、他の 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)
}以上です!その他の機能については、サイドバーの他のページを確認してください。
