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 { // This will be the name of the generated database class.
packageName = "com.example"
}
}
}
SQLステートメントは、src/main/sqldelight
配下の.sq
ファイルに記述します。 通常、.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 は、データベースの作成やステートメントの実行に使用できる、関連する Schema
オブジェクトを持つ Database
クラスを生成します。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")
}
}
ウェブワーカードライバーを使用すると、SQLDelight は Web Worker で実行されている SQL 実装と通信できます。これにより、すべてのデータベース操作がバックグラウンドプロセスで実行されるようになります。
INFO
ウェブワーカードライバーはブラウザターゲットとのみ互換性があります。
Web Worker の設定
SQLDelight のウェブワーカードライバーは、特定のワーカー実装に縛られていません。その代わりに、ドライバーは標準化されたメッセージセットを使用してワーカーと通信します。SQLDelight は、SQL.js を使用するワーカーの実装を提供します。
プロジェクトでのセットアップの詳細については、SQL.js Worker ページを、または独自のワーカーの実装の詳細については、Custom Workers ページを参照してください。
Web Worker の使用
ウェブワーカードライバーのインスタンスを作成する際、すべての SQL 操作を処理するために使用されるウェブワーカーへの参照を渡す必要があります。Worker
コンストラクタは、ワーカー スクリプトを参照する URL
オブジェクトを受け取ります。
Webpack は、インストールされた NPM パッケージからワーカー スクリプトを参照するための特別なサポートを提供しており、URL
コンストラクタに2番目の引数として import.meta.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 を正しく解決するためには、上記の 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)
}
以上です!他の機能については、サイドバーの他のページを確認してください。