SQLDelightはデータベースのスキーマを把握する必要があります。データベースのスキーマを設定するには、通常2つのアプローチがあります。「Fresh Schema(フレッシュスキーマ)」アプローチは、空のデータベースから開始し、目的の状態にするために必要なすべてのステートメントを一度に適用することを前提としています。一方、「Migration Schema(マイグレーションスキーマ)」アプローチは、すでにデータベースとスキーマが設定されていること(例:既存の本番データベース)を前提とし、時間の経過とともにマイグレーションを段階的に適用してデータベースのスキーマを更新していきます。
SQLDelightでは、これらのアプローチは、「Fresh Schema」として.sqファイルにテーブル定義を記述するか、「Migration Schema」として.sqmファイルにマイグレーション文を記述するかのいずれかに対応します。いずれの場合も、SQLクエリは(こちらに示されている通り).sqファイルに記述されます。
Fresh Schema
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');
同じ`.sq`ファイル内に、[実行時](#typesafe-sql)に実行されるSQL文の記述を開始できます。
## Migration Schema
まず、スキーマを組み立てるためにマイグレーションを使用するようGradleを設定します:
::: code-group
```kotlin [Kotlin]
sqldelight {
databases {
create("Database") {
...
srcDirs("sqldelight")
deriveSchemaFromMigrations.set(true)
}
}
}sqldelight {
databases {
Database {
...
srcDirs "sqldelight"
deriveSchemaFromMigrations = true
}
}
}:::
マイグレーションファイルの拡張子は.sqmであり、ファイル名にはマイグレーションファイルが実行される順序を示す番号を含める必要があります。例えば、以下のような階層の場合:
src
`-- main
`-- sqldelight
|-- v1__backend.sqm
`-- v2__backend.sqmSQLDelightは、まずv1__backend.sqmを適用し、次にv2__backend.sqmを適用することでスキーマを作成します。これらのファイルには、通常のSQL CREATE/ALTER 文を記述してください。もし他のサービス(Flywayなど)がマイグレーションファイルを読み取る場合は、マイグレーションに関する情報と、有効なSQLを出力する方法について必ず確認してください。
Typesafe SQL
実行時にSQL文を実行できるようにするには、まずデータベースに接続するための SqlDriver を作成する必要があります。最も簡単な方法は、Hikariやその他の接続マネージャーから取得した DataSource から作成することです。
dependencies {
implementation("app.cash.sqldelight:jdbc-driver:2.1.0")
}dependencies {
implementation "app.cash.sqldelight:jdbc-driver:2.1.0"
}val driver: SqlDriver = dataSource.asJdbcDriver()スキーマを新規のテーブル作成文(Fresh Schema)として指定するか、マイグレーションを通じて指定するかにかかわらず、実行時のSQLは .sq ファイルに記述します。
型安全なクエリの定義
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)
}以上です!その他の機能については、サイドバーの他のページを確認してください。
