§使用 Play Slick
Play Slick 模組讓 Slick 成為 Play 的一級公民,並包含兩個主要功能
- 將 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.profile
和slick.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。閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享?前往 我們的社群論壇 與社群展開對話。