文件

§使用 Play Slick

Play Slick 模組讓 Slick 成為 Play 的一級公民,並包含兩個主要功能

Play Slick 目前支援 Play 2.8 搭配 Slick 3.3,適用於 Scala 2.12 和 Scala 2.13。

先前版本支援先前版本的 Play!以及 Scala 2.11 和 Scala 2.12。

注意:本指南假設您已具備 Play 2.8 和 Slick 3.3 的知識。

§取得協助

如果您在使用 Play Slick 時遇到問題,請查看 常見問題集 是否有解答。否則,歡迎前往 Play 討論論壇。另外,請注意,如果您要尋求有關 Slick 的協助,Slick 使用者社群 可能會是更適合的地方。

§關於此版本

先前版本 Play Slick 的使用者會發現許多重大變更。請閱讀 遷移指南,以取得從 Play Slick 舊版本升級的詳細資訊。

Play Slick 的初次使用者會讚賞 Slick 與 Play 的無痛整合。如果您熟悉 Play 和 Slick,設定和使用 Play Slick 模組會非常簡單。

§設定

新增 play-slick 的函式庫相依性

libraryDependencies += "org.playframework" %% "play-slick" % "6.1.0"

上述相依性也會將 Slick 函式庫作為傳遞相依性。這表示您不需要明確新增 Slick 的相依性,但如果您願意,也可以新增。如果您需要使用比 play-slick 捆綁版本更新的版本,您可以明確定義 Slick 的相依性。由於 Slick 尾數點版本具有二進位相容性,因此您使用與建置 play-slick 所使用的不同的 Slick 尾數點版本不會產生任何風險。

§支援 Play 資料庫演化

Play Slick 支援 Play 資料庫演化

若要啟用演化,您需要下列依賴項

libraryDependencies ++= Seq(
  "org.playframework" %% "play-slick"            % "6.1.0",
  "org.playframework" %% "play-slick-evolutions" % "6.1.0"
)

請注意,不需要將 Play evolutions 元件新增到您的依賴項,因為它是 play-slick-evolutions 模組的傳遞依賴項。

§JDBC 驅動程式依賴項

Play Slick 模組未套件化任何 JDBC 驅動程式。因此,您需要明確新增要在應用程式中使用的 JDBC 驅動程式。例如,如果您想要使用 H2 等內部記憶體資料庫,您必須新增對它的依賴項

"com.h2database" % "h2" % "${H2_VERSION}" // replace `${H2_VERSION}` with an actual version number

§資料庫設定

若要讓 Play Slick 模組處理 Slick 資料庫的生命週期,請務必不要在程式碼中明確建立資料庫執行個體。相反地,您應該在 application.conf 中提供有效的 Slick 驅動程式和資料庫設定(依慣例,預設的 Slick 資料庫必須稱為 default

# Default database configuration
slick.dbs.default.profile="slick.jdbc.H2Profile$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play"

首先,請注意上述為有效的 Slick 設定(有關可讓您用來設定資料庫的設定參數完整清單,請參閱 Slick ScalaDoc 的 Database.forConfig - 請務必展開文件中的 forConfig 列)。

其次,資料庫名稱之前的 slick.dbs 前置詞是可以設定的。事實上,您可以透過覆寫設定金鑰 play.slick.db.config 的值來變更它。

第三,在上述設定中,slick.dbs.default.profile 用於設定 Slick 設定檔,而 slick.dbs.default.db.driver 是 Slick 後端使用的基礎 JDBC 驅動程式。在上述設定中,我們設定 Slick 使用 H2 資料庫,但 Slick 支援其他多個資料庫。查看 Slick 文件 以取得支援資料庫的完整清單,並找出相符的 Slick 驅動程式。

Slick 不像預設的 Play JBDC 連線池那樣支援 DATABASE_URL 環境變數。但從版本 3.0.3 開始,Slick 提供 DatabaseUrlDataSource 專門用於剖析環境變數。

slick.dbs.default.profile="slick.jdbc.PostgresProfile$"
slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
slick.dbs.default.db.properties.driver = "org.postgresql.Driver"

在某些平台(例如 Heroku)上,您可以 替換 JDBC_DATABASE_URL 環境變數,其格式為 jdbc:vendor://host:port/db?args(如果可用)。例如

slick.dbs.default.profile="slick.jdbc.PostgresProfile$"
slick.dbs.default.db.driver="org.postgresql.Driver"
slick.dbs.default.db.url=${JDBC_DATABASE_URL}

注意:如果未提供 slick.dbs.default.profileslick.dbs.default.db.driver 的有效值,則在嘗試執行 Play 應用程式時,將導致例外狀況。

設定多個資料庫

# Orders database
slick.dbs.orders.profile="slick.jdbc.H2Profile$"
slick.dbs.orders.db.driver="org.h2.Driver"
slick.dbs.orders.db.url="jdbc:h2:mem:play"

# Customers database
slick.dbs.customers.profile="slick.jdbc.H2Profile$"
slick.dbs.customers.db.driver="org.h2.Driver"
slick.dbs.customers.db.url="jdbc:h2:mem:play"

如果某項設定不正確,您會在瀏覽器中收到通知

注意:只有在提供有效的 Slick 設定時,您的應用程式才會啟動。

§用法

在適當設定 Slick 資料庫後,您可以使用相依性注入取得 DatabaseConfig(這是將資料庫和驅動程式組合在一起的 Slick 類型)。

注意:Slick 資料庫執行個體會管理執行緒池和連線池。一般來說,您不需要在程式碼中明確關閉資料庫(透過呼叫其 close 方法),因為 Play Slick 模組已經會處理這項工作。

§透過執行時期相依性注入的 DatabaseConfig

雖然您可以透過存取 SlickApi 手動取得 DatabaseConfig 執行個體,但我們已提供一些輔助工具供執行時期 DI 使用者(Guice、Scaldi、Spring 等)在控制器中取得特定執行個體。

以下是注入預設資料庫(即設定檔中名為 default 的資料庫)的 DatabaseConfig 執行個體的範例

class Application @Inject() (protected val dbConfigProvider: DatabaseConfigProvider, cc: ControllerComponents)(implicit
    ec: ExecutionContext
) extends AbstractController(cc)
    with HasDatabaseConfigProvider[JdbcProfile] {

在此範例中,我們也會注入 Play 的預設 ExecutionContext,它會在以下的未來轉換中隱含使用。

注入不同資料庫的 DatabaseConfig 執行個體也很容易。您只要在 dbConfigProvider 建構函數參數前面加上註解 @NamedDatabase("<db-name>") 即可

class Application2 @Inject() (
    @NamedDatabase("<db-name>") protected val dbConfigProvider: DatabaseConfigProvider,
    cc: ControllerComponents
)(implicit ec: ExecutionContext)
    extends AbstractController(cc)
    with HasDatabaseConfigProvider[JdbcProfile] {

當然,您應該將字串 "<db-name>" 取代為您要使用的資料庫組態名稱。

注意:要存取資料庫物件,您只需要在 HasDatabaseConfig 特質上呼叫函數 db 即可。您不需要參考 dbConfigProvider 建構函數參數。

如需完整範例,請參閱 此範例專案

§編譯時期相依性注入

如果您使用編譯時期 DI,您可以使用 slickApi.dbConfig(DbName(name)) 方法直接從 SlickApi 查詢資料庫組態。play.api.db.slick.SlickComponents 提供存取 slickApi 的權限。

§在控制器中執行資料庫查詢

要在您的控制器中執行資料庫查詢,您需要 Slick 資料庫和驅動程式。很幸運的是,從上述內容我們現在知道如何取得 Slick DatabaseConfig,因此我們具備執行資料庫查詢所需的條件。

您需要從驅動程式匯入一些類型和隱含項目

import dbConfig.profile.api._

然後,您可以定義將執行資料庫查詢的控制器方法

def index(name: String) = Action.async { implicit request =>
  val resultingUsers: Future[Seq[User]] = db.run(Users.filter(_.name === name).result)
  resultingUsers.map(users => Ok(views.html.index(users)))
}

這就像使用現成的 Play 和 Slick 一樣!

§組態連線池

請閱讀 此處,了解如何組態連線池。

下一頁:Play Slick 遷移指南


在此文件中發現錯誤?此頁面的原始程式碼可在此處找到 here。閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享?前往 我們的社群論壇 與社群展開對話。