JVMでのPostgreSQL入門
まずプロジェクトに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"
}
}
}
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
ファイルに、実行時に実行されるSQLステートメントを配置し始めることができます。
Migration Schema
まず、Gradleがマイグレーションを使用してスキーマをアセンブルするように設定します。
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.sqm
SQLDelightは、v1__backend.sqm
を適用し、次にv2__backend.sqm
を適用することでスキーマを作成します。これらのファイルには、通常のSQL CREATE
/ALTER
ステートメントを配置します。他のサービス(Flywayなど)がマイグレーションファイルを読み取る場合は、マイグレーションに関する情報と有効なSQLを出力する方法について確認してください。
型安全な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()
スキーマを新規テーブル作成ステートメントとして指定するか、マイグレーションを介して指定するかに関わらず、実行時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)
}
以上です!他の機能については、サイドバーの他のページを確認してください。