§Play Slick マイグレーションガイド
これは、Play Slickを新しいSlick 3.0 APIをサポートするバージョンに移行するためのガイドです。
Play 2.5へのプロジェクトの移行が既に完了していること(Play 2.5 マイグレーションガイドを参照)、Slickドキュメントを読んでいること、そしてPlayアプリケーションを新しいSlick Database I/O Actions APIを使用するように移行する準備ができていることを前提としています。
§ビルドの変更
sbtビルドでPlay Slickの依存関係を、「設定」セクションで提供されているバージョンに更新します。
§H2データベース依存関係の削除
以前のバージョンのPlay SlickはH2データベースライブラリをバンドルしていましたが、現在はそうではありません。したがって、H2を使用する場合は、プロジェクトの依存関係に明示的に追加する必要があります。
"com.h2database" % "h2" % "${H2_VERSION}" // replace `${H2_VERSION}` with an actual version number
§個別のモジュールでのEvolutionsサポート
データベースエボリューションのサポートは、以前はPlay Slickに含まれていましたが、現在はそうではありません。したがって、エボリューションを使用している場合は、こちらで説明されているように、play-slick-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 Database I/O Actions APIを使用するために必要です)、こちらを参照してください。
§DBAction
とDBSessionRequest
が削除されました
Play Slickは、次のために役立つDBAction
を提供していました。
- Slick
Session
をActionメソッドに簡単に渡す。 - アクションの本体、つまりデータベースへのブロッキング呼び出しを別々のスレッドプールで実行する。
- スレッドプールにキューイングされるブロッキングリクエストの数を制限する(アプリケーションのレイテンシを制限するために役立つ)。
DBAction
は、Slick 2.1を使用する場合に確かに便利でした。しかし、新しいSlick 3リリースでは、もう必要ありません。その理由は、Slick 3には新しい非同期API(別名Database I/O Actions 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
を調整することで同様の結果を得ることができます。Database.forConfigのSlick ScalaDocを参照してください(ドキュメントの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はリアクティブ・ストリームSPI(サービス・プロバイダ・インターフェース)を実装しており、Play 2.5はリアクティブ・ストリームをPlayイテレーターに簡単に変換するためのユーティリティクラスを提供しています。
Slickでは、Slickデータベースインスタンスでstream
メソッドを呼び出すことで(eagerなrun
の代わりに)、リアクティブ・ストリームを取得できます。ストリームをイテレーターに変換するには、引数としてストリームを渡してplay.api.libs.streams.Streams.publisherToEnumerator
を単純に呼び出します。
完全な例については、このサンプルプロジェクトをご覧ください。
§DDLサポートは削除されました
以前のバージョンのPlay Slickには、Slickテーブル定義を読み取り、リロード時に自動的にスキーマ更新を作成するDDLプラグインが含まれていました。これは興味深く便利な機能ですが、基盤となる実装は脆弱であり、テーブルがモジュール(つまり、Scalaのobject
)を介してアクセス可能であるという仮定に依存していました。このコーディングパターンは、Play Slickがトップレベルのインポートを介して利用可能なSlickドライバをインポートすることを許可していたため可能でした。しかし、Slickドライバの自動検出のサポートが削除されたため、Slickドライバのトップレベルインポートを宣言しなくなります。これは、Slickテーブルがモジュールを介してアクセスできなくなることを意味します。この事実により、DDLプラグインの初期実装で行われた仮定が破られ、この機能が削除された理由となります。
上記の帰結として、プロジェクトのデータベーススキーマの作成と管理を担当することになります。したがって、コード内のSlickテーブルに変更を加えるたびに、データベーススキーマも更新してください。データベーススキーマとコード内の関連テーブル定義を手動で同期させるのが面倒な場合は、Slickで使用可能なコード生成機能を参照してください。
このドキュメントにエラーが見つかりましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を始めましょう。