2014年4月26日土曜日

Play FrameworkのSlickでevolutionを使ったテーブル管理をしてみた

今回はPlay FrameworkにSlickを入れて、evolutionを使ったテーブル管理をやってみました。

バージョン
Play Framework 2.2.2
slick 2.0.1
play-slick 0.6.0.1

build.sbtに下記を追加する。
  "com.typesafe.slick" %% "slick" % "2.0.1",
  "org.slf4j" % "slf4j-nop" % "1.7.6",
  "com.typesafe.play" % "play-slick_2.10" % "0.6.0.1"

application.confでevolutionを有効にし、slickでテーブルを作る対象をmodels.*で指定する。
evolutionplugin=enabled
slick.default="models.*"

上で指定したパッケージ配下にmodelを作成
package models
 
import play.api.db.slick.Config.driver.simple._
import java.sql.Date
import models.dao.DAO
 
case class Twitter(id: Int, word: String, ins_date: Date, upd_date: Date, ng_flg : Boolean)
  
class Twitters(tag: Tag) extends Table[Twitter](tag,"twitter"){
 
  def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
  def word = column[String]("word",O.NotNull)
  def ins_date = column[Date]("ins_date",O.NotNull)
  def * = (id,word,ins_date) <> (Twitter.tupled,Twitter.unapply)
}
 
object Twitters extends DAO{
    
  def insert(word:String,ins_date:Date)(implicit s: Session) = {
    Twitters map{
      r => (r.word,r.ins_date)
    } +=(word,ins_date)
  }
  
  def findByWord(word:String)(implicit s: Session):List[Int] = {
    Twitters filter {
      _.word === word
    } map {
     _.id
    } list()
  }
}

DAOは分けてこう書いておくとよいと見かけたので、この形で作成。
ちなみにTableを継承してないclassがslickの対象パッケージにいるとエラー出るので別の階層にしないといけない。
package models.dao
 
import models.h2.Twitters
import scala.slick.lifted.TableQuery
 
private[models] trait DAO{
  val Twitters = TableQuery[Twitters]
}

ひととおり揃えたのでplay runして実行させるとエラーが出た。。。
エラーメッセージ
Found a matching object: modules.Twitter for modules.Twitter but it is not a Slick Table and a wildcard was not specified"

テーブルとして見てもらえてないようなメッセージ。
application.confの指定を*でなく指定する形の以下にしてみたもののだめ。
slick.default="models.Twitters"

結局、この形で記述してみたらうまくいきました。(h2はDBにh2database使ってるため)
最初のだとdaoとTwitter.scalaが同一ディレクトリにいるのがだめなようで、
指定した場所にTable以外のものが入ってないようにしないといけないようです。
slick.default="models.h2.*"


参考URL
http://akiomik.hatenablog.jp/entry/2014/02/23/033444
http://windymelt.hatenablog.com/entry/2014/03/30/191152
https://github.com/freekh/play-slick/blob/6b49ec019e00158c96df12d673856c53830ed1e6/code/src/main/scala/play/api/db/slick/ddl/TableScanner.scala
http://nilfigo.hatenablog.com/entry/2013/09/10/173552

0 件のコメント:

コメントを投稿