Skip to content

在 JVM 上開始使用 HSQL

實驗性

HSQL 支援正在孵化中 (incubating),且此變體 (dialect) 的部分功能仍缺失。如果您遇到此變體中不受支援的部分,請回報至 sql-psi

首先在您的專案中應用 Gradle 外掛。

kotlin
plugins {
  id("app.cash.sqldelight") version "2.1.0"
}

repositories {
  google()
  mavenCentral()
}

sqldelight {
  databases {
    create("Database") {
      packageName.set("com.example")
    }
  }
}
groovy
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 檔案中的第一個語句會建立一個資料表,但您也可以建立索引或設定預設內容。

sql
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 使用遷移來組建結構描述:

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.sqm

SQLDelight 將透過先套用 v1__backend.sqm 然後再套用 v2__backend.sqm 來建立結構描述。請將您一般的 SQL CREATE/ALTER 陳述式放置在這些檔案中。如果其他服務從您的遷移檔案讀取 (例如 Flyway),請務必閱讀有關遷移的資訊以及如何輸出有效的 SQL。

型別安全 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)
}

就這樣!請查看側邊欄中的其他頁面以了解其他功能。