ScalaでPlayFrameworkを使う場合にDBアクセスにはanormとslickがあるようです。
slickはscalaQueryと呼ばれていたものが進化した模様。
scala2.9まではscalaQuery,それ以降はslickらしいです
http://d.hatena.ne.jp/tototoshi/20121204/1354615421
Build.scalaに必要なモジュールを書いてインストールするのが一般的らしいですが、うまくいかなかったので手動インストールで作成してみます。
slick
https://github.com/freekh/play-slick
からZIPでダウンロードし解凍
1 2 3 4 5 6 7 8 | $ cd slick-1.0.1 $ sbt > compile > package $ find .|grep jar ./slick-testkit/target/scala-2.10/slick-testkit_2.10-1.0.1.jar ./target/root/scala-2.10/root_2.10-1.0.1.jar ./target/scala-2.10/slick_2.10-1.0.1.jar |
play-slick
プラグインなのでこちらも入れます
https://github.com/freekh/play-slick
1 2 3 4 5 6 | $ cd play-slick-master $ sbt > compile > package $ find .|grep jar ./target/scala-2.10/play-slick_2.10-0.3.3-SNAPSHOT.jar |
プロジェクト作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | $ play new sample _ _ _ __ | | __ _ _ _| | | '_ \| |/ _' | || |_| | __/|_|\____|\__ (_) |_| |__/ play! 2.1.2 (using Java 1.7.0_25 and Scala 2.10.0), http://www.playframework.org The new application will be created in /Users/admin/Documents/workspace/play_sample/sample What is the application name? [sample] > sample Which template do you want to use for this new application? 1 - Create a simple Scala application 2 - Create a simple Java application > 1 OK, application sample is created. Have fun! $ cd sample $ play eclipse $ mkdir lib $ cp slick-1.0.1/target/scala-2.10/slick_2.10-1.0.1.jar . $ cp play-slick-master/target/scala-2.10/play-slick_2.10-0.3.3-SNAPSHOT.jar . |
Eclipse
- eclipseの既存プロジェクトの読み込みで読み込む
- プロジェクトのプロパティからslick_2.10-1.0.1.jar、play-slick_2.10-0.3.3-SNAPSHOT.jarのライブラリを追加
PlayFramework
http://takashima0411.hatenablog.com/entry/2012/11/28/231817
こちらの方のサンプルをそのままいただきました
Application.scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package controllers import play.api._ import play.api.mvc._ import play.api.data._ import play.api.data.Forms._ import models._ object Application extends Controller { val taskForm = Form( "label" -> nonEmptyText) def index = Action { Redirect(routes.Application.tasks) } def tasks = Action { Ok(views.html.index(Tasks.all(), taskForm)) } def newTask = Action { implicit request => taskForm.bindFromRequest.fold( errors => BadRequest(views.html.index(Tasks.all(), errors)), label => { Tasks.create(label) Redirect(routes.Application.tasks) }) } def deleteTask(id: Long) = Action { Tasks.delete(id) Redirect(routes.Application.tasks) } } |
Task.scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package models import scala.slick.driver.H2Driver.simple._ import Database.threadLocalSession case class Task(id: Long, label: String) object Tasks extends Table[Task]("TASK") { def id = column[Long]("ID", O.PrimaryKey, O.AutoInc) def label = column[String]("LABEL", O.NotNull) def * = id ~ label <> (Task, Task.unapply _) def ins = label returning id def all(): List[Task] = connectDB { Query(Tasks).sortBy(_.id).list } def create(label: String) = connectDB { Tasks.ins.insert(label) } def delete(id: Long) = connectDB { Tasks.where(_.id === id).delete } def connectDB[Any](f: => Any): Any = { Database.forURL("jdbc:h2:mem:play", driver = "org.h2.Driver") withSession { f } } } |
Global.scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import play.api._ import models._ import scala.slick.driver.H2Driver.simple._ import Database.threadLocalSession import models._ import java.sql.{Date,Time,Timestamp} object Global extends GlobalSettings { override def onStart(app: Application) { Logger.info("Application has started") Database.forURL("jdbc:h2:mem:play", driver = "org.h2.Driver") withSession { Tasks.ddl.create } } override def onStop(app: Application) { Logger.info("Application shutdown...") } } |
index.scala.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @(tasks: List[Task], taskForm: Form[String]) @import helper._ <h1>@tasks.size task(s)</h1> <ul> @tasks.map { task => <li> @task.label @form(routes.Application.deleteTask(task.id)) { <input type="submit" value="Delete"> } </li> } </ul> <h2>Add a new task</h2> @form(routes.Application.newTask) { @inputText(taskForm("label")) <input type="submit" value="Create"> } |
routes
1 2 3 4 5 6 7 8 9 10 11 12 13 | # Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / controllers.Application.index GET /index controllers.Application.index GET /tasks controllers.Application.tasks GET /newTask controllers.Application.newTask GET /deleteTask/:id controllers.Application.deleteTask(id:Long) # Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.at(path="/public", file) |
application.conf
1 2 3 4 5 6 7 8 9 10 | db.default.driver=org.h2.Driver db.default.url="jdbc:h2:mem:play" slick.default="models.*" # Evolutions # ~~~~~ # You can disable evolutions if needed evolutionplugin=disabled |
これでとりあえず動きます