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)""")
)
)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)
}以上です!他の機能については、サイドバーの他のページを確認してください。
