在 JVM 上開始使用 HSQL
實驗性
HSQL 支援正在孵化中 (incubating),且此變體 (dialect) 的部分功能仍缺失。如果您遇到此變體中不受支援的部分,請回報至 sql-psi。
首先在您的專案中應用 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 需要知道您的資料庫結構描述。設定資料庫結構描述通常有兩種方法。「新建結構描述 (Fresh Schema)」方法假設您從一個空白資料庫開始,並且所有必要的陳述式將一次性套用,使其達到所需狀態。「遷移結構描述 (Migration Schema)」方法則假設您已設定好資料庫和結構描述 (例如現有的生產資料庫),並且將隨著時間逐步套用遷移來更新資料庫的結構描述。
在 SQLDelight 中,這些方法轉化為:針對「新建結構描述」在 .sq
檔案中撰寫您的資料表定義,或針對「遷移結構描述」在 .sqm
檔案中撰寫遷移陳述式。無論哪種情況,您的 SQL 查詢 都將寫在 .sq
檔案中 (如這裡所示)。
新建結構描述
您可以在 src/main/sqldelight
目錄下的 .sq
檔案中撰寫您的 SQL 語句。通常 .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 陳述式。
遷移結構描述
首先,設定 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)
}
就這樣!請查看側邊欄中的其他頁面以了解其他功能。