ドキュメント

§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は既にそのような機能を提供しているでしょう)。

したがって、次の変更を行う必要があります。

§DBActionDBSessionRequestが削除されました

Play Slickは、次のために役立つDBActionを提供していました。

DBActionは、Slick 2.1を使用する場合に確かに便利でした。しかし、新しいSlick 3リリースでは、もう必要ありません。その理由は、Slick 3には新しい非同期API(別名Database I/O Actions 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を調整することで同様の結果を得ることができます。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オブジェクトとSlickConfigDefaultSlickConfigは削除されました。これらの抽象化は単に必要ありません。以前は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で使用可能なコード生成機能を参照してください。

次へ: Play Slick高度なトピック


このドキュメントにエラーが見つかりましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を始めましょう。