§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 已經會提供此功能)。
因此,您需要進行以下變更
- 每個 Slick 資料庫組態都必須提供 Slick 驅動程式(請參閱此處,了解如何遷移您的資料庫組態)。
- 移除所有匯入至
import play.api.db.slick.Config.driver.simple._
的項目。 - 請參閱此處,了解如何查詢 Slick 驅動程式和資料庫執行個體(這是使用新的 Slick 3 資料庫 I/O 動作 API 所需的)。
§DBAction
和 DBSessionRequest
已移除
Play Slick 過去會提供 DBAction
,這對於以下用途很有用
- 方便地將 Slick
Session
傳遞到您的動作方法中。 - 在一個獨立的執行緒池中執行動作主體,以及任何對資料庫的封鎖呼叫。
- 限制執行緒池中排隊的封鎖請求數量(有助於限制應用程式的延遲)
使用 Slick 2.1 時,DBAction
確實很方便。然而,有了新的 Slick 3 版本,我們不再需要它了。原因是 Slick 3 附帶新的非同步 API(又稱資料庫 I/O 動作 API),使用者不需要操作 Session
或 Connection
。這使得 DBSessionRequest
和 DBAction
,以及它的親密好友 CurrentDBAction
和 PredicatedDBAction
,完全過時,這就是它們被移除的原因。
話雖如此,要移植你的程式碼應該就像將所有 DBAction
和好友的出現,改成標準 Play Action.async
一樣簡單。按一下 這裡,查看範例。
§執行緒池
Play Slick 過去提供一個獨立的執行緒池,用於執行需要存取資料庫的控制器動作。Slick 3 已經完全做到這一點,因此 Play Slick 不再需要建立和管理額外的執行緒池。以下設定參數實際上已過時,應從你的 applications.conf 中移除
db.$dbName.maxQueriesPerRequest
slick.db.execution.context
參數 db.$dbName.maxQueriesPerRequest
用於限制執行緒池中排隊的任務數量。在 Slick 3 中,你可以透過調整設定參數 numThreads
和 queueSize
,達到類似的結果。請閱讀 Slick ScalaDoc 的 Database.forConfig(務必在文件中展開 forConfig
列)。
雖然參數 slick.db.execution.context
用於命名由 Play Slick 建立的執行緒池。在 Slick 3 中,每個執行緒池都使用 Slick 資料庫設定路徑命名,也就是說,如果在您的 application.conf
中,您已為名為 default
的資料庫提供 Slick 設定,那麼 Slick 將建立一個名為 default
的執行緒池,用於在預設資料庫上執行資料庫動作。請注意,用於執行緒池的名稱無法設定。
§Profile
已移除
特徵 Profile
已移除,您可以使用 HasDatabaseConfigProvider
或 HasDatabaseConfig
,並獲得類似的結果。
要使用的特徵取決於您選擇用來擷取 Slick 資料庫和驅動程式(也就是 DatabaseConfig
的執行個體)的方法。如果您決定使用相依性注入,那麼 HasDatabaseConfigProvider
將能為您提供良好的服務。否則,請使用 HasDatabaseConfig
。
請閱讀 此處,以瞭解如何使用相依性注入與全域查詢來擷取 DatabaseConfig
的執行個體。
§Database
已移除
物件 Database
已移除。若要擷取 Slick 資料庫和驅動程式(也就是 DatabaseConfig
的執行個體),請閱讀 此處。
§Config
已移除
Config
物件,連同 SlickConfig
和 DefaultSlickConfig
,已移除。這些抽象根本不需要。如果您曾經呼叫 Config.driver
或 Config.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。有問題或建議要分享?請前往 我們的社群論壇 與社群展開對話。