2014年5月15日木曜日

PlayのslickでのDBアクセス処理

PlayでSlickを使っていくつかブログ書いてたので、
http://syaka-syaka.blogspot.com/2014/04/play-frameworkslickevolution.html
http://syaka-syaka.blogspot.com/2014/05/play-frameworkslickevolution.html
DBアクセス処理についても載せてみます。
けっこういろんな書き方ができるのでいいところと難しいところあるなと感じました。
package models.h2
 
import play.api.db.slick.Config.driver.simple._
import models.dao.DAO
import java.sql.Timestamp
 
case class Twitter(
    id: Int, 
    word: String, 
    count:Int,
    disp_flg:Boolean,
    ng_flg : Boolean, 
    ins_date: Timestamp, 
    upd_date: Timestamp
)
  
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 count = column[Int]("count",O.NotNull)
  def disp_flg = column[Boolean]("disp_flg",O.NotNull)
  def ng_flg = column[Boolean]("ng_flg",O.NotNull)
  def ins_date = column[Timestamp]("ins_date",O.NotNull)
  def upd_date = column[Timestamp]("upd_date",O.NotNull)
  def * = (id,word,count,disp_flg,ng_flg,ins_date,upd_date) <> (Twitter.tupled,Twitter.unapply)
}
 
object Twitters extends DAO{
  
  /**
   * 特定のカラムのみを引数指定でinsertする
   */
  def insert(word:String,ins_date:Timestamp,upd_date:Timestamp,count:Int,ng_flg:Boolean,disp_flg:Boolean)(implicit s: Session) = {
    Twitters map{
      r => (r.word,r.ins_date,r.upd_date,r.count,r.ng_flg,r.disp_flg)
    } +=(word,ins_date,upd_date,count,ng_flg,disp_flg)
    
  }
  
  /**
   *特定のカラムをkeyに該当するデータ(1カラム)をリストでselectする
   */ 
  def findByWord(word:String)(implicit s: Session):List[Int] = {
    Twitters filter {
      _.word === word
    } map {
     _.id
    } list
  }
 
  /**
   * 特定のカラムをkeyに該当するデータ(全カラム)を1件取得する
   */ 
  def findById(id:Int)(implicit s:Session):Twitter = {
    Twitters.where(_.id === id).first
  }
  
  /**
   * 特定のカラムをkeyに該当するデータ(全カラム)をリストでselectする
   */ 
  def findAllByWord(word:String)(implicit s: Session):List[Twitter] = {
   Twitters.where(_.word === word).list
  }
  
  /**
   * 全件select
   */ 
  def findAll()(implicit s:Session):List[Twitter] = {
    Twitters.list
  }
 
  /**
   * 全件select(idの降順)
   */ 
  def findAllOrderByIdDesc()(implicit s:Session):List[Twitter] = {
    Twitters.sortBy(_.id.desc).list
  }
 
  /**
   * select order byをしてlimitとoffsetつき
   */ 
  def findAllLimitOffsetOrderByIdDesc(limit:Int,offset:Int)(implicit s:Session):List[Twitter] = {
    val q = Twitters.sortBy(_.id.desc).drop(offset).take(limit)
//    println(q.selectStatement) //組み立てられたSQLを確認できる
    q.list
  }
  
  /**
   * select upd_date,idでorder byをしてlimitとoffsetつき
   */ 
  def findAllLimitOffsetOrderByUpdDateDescAndIdDesc(limit:Int,offset:Int)(implicit s:Session):List[Twitter] = {
    val q = Twitters.sortBy(_.id.desc).sortBy(_.upd_date.desc).drop(offset).take(limit) //order by upd_date desc,id descになる
//    println(q.selectStatement) //組み立てられたSQLを確認できる
    q.list
  }
  
  /**
   * 特定のカラムをkeyに該当するデータの1カラムをupdateする
   */ 
  def update(id:Int,updCount:Int)(implicit s:Session) = {
   Twitters.where(_.id === id).map(_.count).update(updCount)
  }
 
  /**
   * 特定のカラムをkeyに該当するデータの複数カラムをupdateする
   */ 
  def updateMultiColumn(id:Int,updCount:Int,updDate:Timestamp)(implicit s:Session) = {
   
   val q = (for 
  {twi <- Twitters if twi.id === id}
   yield
    (twi.count , twi.upd_date)
   )
   
//   println(q.updateStatement) //組み立てられたSQLを確認できる
   q.update(updCount,updDate)
  }
  
  /**
   * 件数をselectする
   */ 
  def count(implicit s:Session):Int = {
    Query(Twitters.length).first
  }
  
}


参考URL
https://github.com/freekh/play-slick
http://blog.lunatech.com/2013/09/25/play-slick-defining-queries
http://qiita.com/ryu1_okd/items/6871515ec42e88cd534f
http://zephiransas.github.io/blog/2013/04/24/slickwoshi-u/
http://tototoshi.hatenablog.com/entry/20121204/1354615421
http://krrrr.hatenablog.com/entry/20130213/1360687102

0 件のコメント:

コメントを投稿