文件

§Play Slick 遷移指南

本指南說明如何從 Play Slick 遷移到支援新的 Slick 3.0 API 的版本。

假設您已將專案移轉到使用 Play 2.5(請參閱 Play 2.5 移轉指南),已閱讀 Slick 文件,並準備將 Play 應用程式移轉到使用新的 Slick 資料庫 I/O 動作 API。

§建置變更

將 sbt 建置中的 Play Slick 相依性更新為與 設定 區段中提供的版本相符。

§移除 H2 資料庫相依性

Play Slick 的先前版本會套件 H2 資料庫函式庫。此情況已不再發生。因此,如果您要使用 H2,您需要將其明確新增到專案的相依性中

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

§在獨立模組中提供 Evolutions 支援

資料庫 evolutions 的支援曾包含在 Play Slick 中。此情況已不再發生。因此,如果您使用 evolutions,您現在需要新增一個額外的相依性到 play-slick-evolutions,如 此處 所述。

同時,如果您未使用 evolutions,您現在可以安全地從 application.conf 中移除 evolutionplugin=disabled

§資料庫設定

在 Play Slick 的過去版本(使用 Slick 2.1 或更早版本)中,您會使用設定 Play JDBC 資料來源的方式來設定 Slick 資料來源。此情況已不再發生,而以下設定現在會被 Play Slick 忽略

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""

此變更有多個原因。首先,上述並非有效的 Slick 設定。其次,從 Slick 3 開始,您不僅設定資料來源,還設定連線池和執行緒池。因此,Play Slick 使用完全不同的路徑來設定 Slick 資料庫是有道理的。Slick 設定的預設路徑現在為 slick.dbs

以下是如何遷移上述組態

slick.dbs.default.profile="slick.jdbc.H2Profile$" # You must provide the required Slick profile! 
slick.dbs.default.db.driver=org.h2.Driver
slick.dbs.default.db.url="jdbc:h2:mem:play"
slick.dbs.default.db.user=sa
slick.dbs.default.db.password=""

注意:如果您的資料庫組態包含連線池的設定,請注意您也需要遷移那些設定。不過,這可能會有點棘手,因為 Play 2.3 預設的連線池使用 BoneCP,而 Slick 3 預設的連線池是 HikariCP。請參閱此處,了解如何組態連線池。

§自動 Slick 驅動程式偵測

Play Slick 過去會自動從資料源組態推斷所需的 Slick 驅動程式。此功能已移除,因此您必須在 application.conf 中為每個 Slick 資料庫組態提供要使用的 Slick 驅動程式。

移除此功能的理由是我們只想要接受有效的 Slick 組態。此外,從資料庫組態自動偵測正確的 Slick 驅動程式並不總是可行(如果可行,則 Slick 已經會提供此功能)。

因此,您需要進行以下變更

§DBActionDBSessionRequest 已移除

Play Slick 過去會提供 DBAction,這對於以下用途很有用

使用 Slick 2.1 時,DBAction 確實很方便。然而,有了新的 Slick 3 版本,我們不再需要它了。原因是 Slick 3 附帶新的非同步 API(又稱資料庫 I/O 動作 API),使用者不需要操作 SessionConnection。這使得 DBSessionRequestDBAction,以及它的親密好友 CurrentDBActionPredicatedDBAction,完全過時,這就是它們被移除的原因。

話雖如此,要移植你的程式碼應該就像將所有 DBAction 和好友的出現,改成標準 Play Action.async 一樣簡單。按一下 這裡,查看範例。

§執行緒池

Play Slick 過去提供一個獨立的執行緒池,用於執行需要存取資料庫的控制器動作。Slick 3 已經完全做到這一點,因此 Play Slick 不再需要建立和管理額外的執行緒池。以下設定參數實際上已過時,應從你的 applications.conf 中移除

db.$dbName.maxQueriesPerRequest
slick.db.execution.context

參數 db.$dbName.maxQueriesPerRequest 用於限制執行緒池中排隊的任務數量。在 Slick 3 中,你可以透過調整設定參數 numThreadsqueueSize,達到類似的結果。請閱讀 Slick ScalaDoc 的 Database.forConfig(務必在文件中展開 forConfig 列)。

雖然參數 slick.db.execution.context 用於命名由 Play Slick 建立的執行緒池。在 Slick 3 中,每個執行緒池都使用 Slick 資料庫設定路徑命名,也就是說,如果在您的 application.conf 中,您已為名為 default 的資料庫提供 Slick 設定,那麼 Slick 將建立一個名為 default 的執行緒池,用於在預設資料庫上執行資料庫動作。請注意,用於執行緒池的名稱無法設定。

§Profile 已移除

特徵 Profile 已移除,您可以使用 HasDatabaseConfigProviderHasDatabaseConfig,並獲得類似的結果。

要使用的特徵取決於您選擇用來擷取 Slick 資料庫和驅動程式(也就是 DatabaseConfig 的執行個體)的方法。如果您決定使用相依性注入,那麼 HasDatabaseConfigProvider 將能為您提供良好的服務。否則,請使用 HasDatabaseConfig

請閱讀 此處,以瞭解如何使用相依性注入與全域查詢來擷取 DatabaseConfig 的執行個體。

§Database 已移除

物件 Database 已移除。若要擷取 Slick 資料庫和驅動程式(也就是 DatabaseConfig 的執行個體),請閱讀 此處

§Config 已移除

Config 物件,連同 SlickConfigDefaultSlickConfig,已移除。這些抽象根本不需要。如果您曾經呼叫 Config.driverConfig.datasource 來擷取 Slick 驅動程式和資料庫,您現在應該使用 DatabaseConfigProvider。請閱讀 此處 以取得詳細資訊。

§SlickPlayIteratees 已移除

如果您使用 SlickPlayIteratees.enumerateSlickQuery 從資料庫串流資料,您會很高興知道這樣做變得容易多了。Slick 3 實作 reactive-streams SPI(服務提供者介面),而 Play 2.5 提供一個實用程式類別,可輕鬆將 reactive 串流轉換為 Play 列舉器。

在 Slick 中,您可以透過呼叫 Slick 資料庫執行個體上的方法 stream 來取得 reactive 串流(而不是急切的 run)。若要將串流轉換為列舉器,只要呼叫 play.api.libs.streams.Streams.publisherToEnumerator,並將串流傳遞為引數即可。

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

§已移除 DDL 支援

Play Slick 的先前版本包含一個 DDL 外掛程式,它會讀取您的 Slick 表格定義,並在重新載入時自動建立架構更新。雖然這是一個有趣且有用的功能,但其底層實作很脆弱,且依賴於表格可透過模組(例如,Scala object)存取的假設。這種編碼模式之所以可行,是因為 Play Slick 允許匯入透過頂層匯入可用的 Slick 驅動程式。然而,由於已移除 自動偵測 Slick 驅動程式 的支援,您不會為 Slick 驅動程式宣告頂層匯入。這表示 Slick 表格不再可透過模組存取。這個事實打破了 DDL 外掛程式初始實作中的假設,也是移除此功能的原因。

上述結果表示您負責建立和管理專案的資料庫架構。因此,每當您在程式碼中變更 Slick 表格時,務必也要更新資料庫架構。如果您覺得手動同步資料庫架構和程式碼中相關的表格定義很繁瑣,不妨看看 Slick 中提供的程式碼產生功能。

下一頁: Play Slick 進階主題


在這個文件發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,歡迎貢獻一個 pull request。有問題或建議要分享?請前往 我們的社群論壇 與社群展開對話。