10. Play! Framework との統合
Play! Framework は元々は Ruby on Rails に強く影響された Java 向けの Web アプリケーションフレームワークでしたが、version 2.0 からは Akka ベースのアーキテクチャに書き直され、Scala での利用を基本とするフレームワークに生まれ変わりました。
2014 年 11 月時点で最新の安定バージョンは 2.3.6 です。
また Play 2.0 からは Typesafe Stack の一部として Typesafe 社が公式にサポートしているプロダクトでもあります。
ScalikeJDBC と Play
ScalikeJDBC の SQL("...") から始まる API は Play が提供する Anorm という DB アクセスライブラリの API コンセプトに影響を受けています。また、Play を使った実案件で ScalikeJDBC が利用された実績が多数あり、Play の関係は強いといえます。
Play アプリで ScalikeJDBC を使う
Play はプラガブルな構造になっているフレームワークです。ScalikeJDBC も Play プラグインを提供し、スムーズに Play アプリに組み込めるようサポートしています。
https://github.com/scalikejdbc/scalikejdbc/tree/master/scalikejdbc-play-plugin
project/Build.scala
H2 以外の DB を使用する場合は JDBC ドライバーも必要です。
lazy val root = (project in file("."))
.enablePlugins(PlayScala)
.enablePlugins(SbtWeb)
.settings(
libraryDependencies = Seq(
"org.scalikejdbc" %% "scalikejdbc" % "2.2.+",
"org.scalikejdbc" %% "scalikejdbc-config" % "2.2.+",
"org.scalikejdbc" %% "scalikejdbc-play-plugin" % "2.3.+"
)
)
conf/play.plugins
10000:scalikejdbc.PlayPlugin
conf/application.conf
Play の標準の DB プラグインと同じキー名で接続設定を記述することができます。ConnectionPool の設定値は独自のものです。
# DB で接続する DB
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user="sa"
db.default.password="sa"
# ScalikeJDBC 独自の ConnectionPool 設定
db.default.poolInitialSize=10
db.default.poolMaxSize=10
db.default.poolValidationQuery=
default 以外は以下のように記述します。
# NamedDB('another) で接続する DB
db.another.driver=org.h2.Driver
db.another.url="jdbc:h2:mem:play"
db.another.user="sa"
db.another.password="sa"
# ScalikeJDBC 独自の ConnectionPool 設定
db.another.poolInitialSize=10
db.another.poolMaxSize=10
db.another.poolValidationQuery=
SQL ロギングなどの ScalikeJDBC 共通設定は以下のように渡します。
# グローバル設定
scalikejdbc.global.loggingSQLAndTime.enabled=true
scalikejdbc.global.loggingSQLAndTime.logLevel=debug
scalikejdbc.global.loggingSQLAndTime.warningEnabled=true
scalikejdbc.global.loggingSQLAndTime.warningThresholdMillis=1000
scalikejdbc.global.loggingSQLAndTime.warningLogLevel=warn
Play 起動
あとは通常通り sbt run で起動するだけです。もし設定に問題があれば最初の DB 接続時に例外が発生します。
PlayFixturePlugin
Play アプリのテスト用に fixture 機能を提供しています。
https://github.com/scalikejdbc/scalikejdbc/tree/master/scalikejdbc-play-fixture-plugin
実際にどのようにして使用するかの詳細はこちらのサンプルを参照してください。
https://github.com/scalikejdbc/scalikejdbc/blob/master/scalikejdbc-play-plugin/test/zentasks
conf/play.plugins
必ず PlayPlugin よりも後にロードしてください。
10000:scalikejdbc.PlayPlugin
11000:scalikejdbc.PlayFixturePlugin
conf/application.conf
db.default.fixtures.test=[ "project.sql", "project_member.sql" ]
conf/db/fixtures/default/project.sql
fixture データの生成と削除を記述します。
# --- !Ups
insert into project (id, name, folder) values (1, 'Play 2.0', 'Play framework');
insert into project (id, name, folder) values (2, 'Play 1.2.4', 'Play framework');
insert into project (id, name, folder) values (3, 'Website', 'Play framework');
alter sequence project_seq restart with 10;
# --- !Downs
alter sequence project_seq restart with 1;
delete from project;
DBPlugin との連携
Play の標準で提供されている DBPlugin を無効にせずそのまま連携させるためのプラグインもあります。こちらを使う場合は上記の PlayPlugin は不要です。
libraryDependencies = Seq(
"org.scalikejdbc" %% "scalikejdbc" % "2.2.+",
"org.scalikejdbc" %% "scalikejdbc-dbplugin-adapter" % "2.3.+"
)
conf/play.plugins に以下を追加します。
10000:scalikejdbc.PlayDBPluginAdapter
こうすることで DBPlugin に依存しているものと ScalikeJDBC を同じ Play アプリケーションで無駄なく利用することができます。