§Play Slickの使用
Play SlickモジュールはSlickをPlayのファーストクラスシチズンにし、2つの主要な機能で構成されています。
- SlickのPlayアプリケーションライフサイクルへの統合。
- Playデータベース進化のサポート。
Play Slickは現在、Scala 2.12およびScala 2.13でPlay 2.8とSlick 3.3をサポートしています。
以前のバージョンは、以前のバージョンのPlayとScala 2.11およびScala 2.12もサポートしています。
注記:このガイドでは、Play 2.8とSlick 3.3の両方を既に知っていることを前提としています。
§ヘルプの取得
Play Slickの使用に問題がある場合は、FAQに回答が含まれているかどうかを確認してください。それ以外の場合は、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`コンポーネントを依存関係に追加する必要はありません。
§JDBCドライバの依存関係
Play SlickモジュールにはJDBCドライバはバンドルされていません。そのため、アプリケーションで使用したいJDBCドライバを明示的に追加する必要があります。たとえば、H2などのインメモリデータベースを使用する場合は、それに依存関係を追加する必要があります。
"com.h2database" % "h2" % "${H2_VERSION}" // replace `${H2_VERSION}` with an actual version number
§データベース設定
Play SlickモジュールでSlickデータベースのライフサイクルを処理させるには、コード内でデータベースインスタンスを明示的に作成しないことが重要です。代わりに、有効なSlickドライバとデータベース設定を**application.conf**に提供する必要があります(慣例により、デフォルトの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設定であることに注意してください(データベースの設定に使用できる設定パラメータの完全なリストについては、Database.forConfigのSlick ScalaDocを参照してください - ドキュメントの`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:vendor://host:port/db?args`形式の`JDBC_DATABASE_URL`環境変数を置換できます。例:
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データベースインスタンスは、スレッドプールと接続プールを管理します。一般的に、Play Slickモジュールが既にこれを実行しているため、コードでデータベースを明示的にシャットダウンする(`close`メソッドを呼び出す)必要はありません。
§ランタイム依存性注入による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`インスタンスを注入することも簡単です。`@NamedDatabase("<db-name>")`アノテーションを`dbConfigProvider`コンストラクタパラメータの前に追加するだけです。
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を使用するのと同じです!
§接続プールの設定
接続プールの設定方法については、こちらを参照してください。
このドキュメントにエラーを発見されましたか?このページのソースコードはこちらにあります。ドキュメント作成ガイドラインをお読みになった後、プルリクエストを送信してご協力ください。ご質問やアドバイスがありましたら、コミュニティフォーラムでコミュニティとの会話を開始してください。