在 JVM 上開始使用 PostgreSQL
首先在您的專案中套用 gradle 外掛程式。
kotlin
plugins {
id("app.cash.sqldelight") version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
register("Database") {
packageName.set("com.example")
}
}
}groovy
plugins {
id "app.cash.sqldelight" version "2.1.0"
}
repositories {
google()
mavenCentral()
}
sqldelight {
databases {
register("Database") { // 這將是產生的資料庫類別名稱。
packageName = "com.example"
}
}
}
elight 需要知道資料庫的架構 (schema)。設定資料庫架構通常有兩種方法。「全新架構 (Fresh Schema)」方法假設您是從一個空的資料庫開始,並且會一次套用所有將資料庫帶入所需狀態的必要陳述式。另一方面,「遷移架構 (Migration Schema)」方法則假設您已經設定好資料庫與架構(例如:現有的生產環境資料庫),並且會隨著時間逐步套用遷移 (migrations) 來更新資料庫架構。
LDelight 中,這些方法對應到:在 `.sq` 檔案中撰寫資料表定義以建立「[全新架構 (Fresh Schema)](#fresh-schema)」,或是在 `.sqm` 檔案中撰寫遷移陳述式以建立「[遷移架構 (Migration Schema)](#migration-schema)」。
情況下,您的 SQL 查詢 (queries) 都將撰寫在 `.sq` 檔案中([如這裡所示](#typesafe-sql))。
新架構 (Fresh Schema)
SQL 陳述式撰寫在 `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');
`.sq` 檔案中,您可以開始放置要在[執行時 (runtime)](#typesafe-sql)執行的 SQL 陳述式。
移架構 (Migration Schema)
定 Gradle 使用遷移來組合架構:
"Kotlin"sqldelight {
databases {
create("Database") {
...
srcDirs("sqldelight")
deriveSchemaFromMigrations.set(true)
}
}
}
```
groovy
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)會讀取您的遷移檔案,請務必閱讀關於 遷移 (migrations) 的資訊,以及如何輸出有效的 SQL。
Typesafe SQL
在您能夠於執行時執行 SQL 陳述式之前,您需要建立一個 SqlDriver 來連線到資料庫。最簡單的方法是從 Hikari 或其他連線管理員取得的 DataSource 來建立。
kotlin
dependencies {
implementation("app.cash.sqldelight:jdbc-driver:2.1.0")
}groovy
dependencies {
implementation "app.cash.sqldelight:jdbc-driver:2.1.0"
}kotlin
val driver: SqlDriver = dataSource.asJdbcDriver()無論您是透過全新的資料表建立陳述式還是透過遷移來指定架構,執行時的 SQL 都會放在 .sq 檔案中。
定義型別安全查詢
SQLDelight 會為 .sq 檔案中任何帶有標籤的 SQL 陳述式產生型別安全函式。
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 陳述式。
kotlin
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)
}就是這樣!請查看側邊欄中的其他頁面以了解其他功能。
