ドキュメント

§Play Slickの使用

Play SlickモジュールはSlickをPlayのファーストクラスシチズンにし、2つの主要な機能で構成されています。

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を使用するのと同じです!

§接続プールの設定

接続プールの設定方法については、こちらを参照してください。

次へ:Play Slick移行ガイド


このドキュメントにエラーを発見されましたか?このページのソースコードはこちらにあります。ドキュメント作成ガイドラインをお読みになった後、プルリクエストを送信してご協力ください。ご質問やアドバイスがありましたら、コミュニティフォーラムでコミュニティとの会話を開始してください。