带有可选图像列的Scala Slick Model

时间:2014-05-23 19:23:51

标签: scala slick

我正在尝试将列添加到具有可选图像的现有模型中,我正在使用Scala Slick和Play Framework。使用Scala Slick模型存储图像的示例是什么?

case class Complication(complicationId:Long,
vitalSignId:Long,
complication:String,definition:String,reason:String,
treatment:String,notes:String,
weblinks:String,upperlower:String)


object ComplicationDAO extends Table[Complication]("complications") with DbConn { 

  def complicationId = column[Long]("complication_id", O.PrimaryKey, O.AutoInc)
  def vitalSignId = column[Long]("vital_sign_id") 
  def complication = column[String]("complication")
  def definition = column[String]("definition",O.DBType("varchar(4000)"))
  def reason = column[String]("reason",O.DBType("varchar(4000)"))
  def treatment = column[String]("treatment",O.DBType("varchar(4000)"))
  def notes = column[String]("notes",O.DBType("varchar(4000)")) 
  def weblinks = column[String]("weblinks")
  def upperlower = column[String]("upperlower") 
  def treatmentImage = ??? //here is where it needs to be defined! 
  def * = complicationId ~  vitalSignId ~ complication ~ definition ~ reason ~ treatment ~ notes ~ weblinks ~ upperlower<> (Complication, Complication.unapply _) 

  def autoInc = 
    vitalSignId ~ complication ~ definition ~ reason ~ 
    treatment ~ notes ~ weblinks ~ upperlower <>
    (NewComplication, NewComplication.unapply _) returning complicationId 

}

这是我试图将图像整合到的模型。

感谢您的建议!

1 个答案:

答案 0 :(得分:2)

如果您不想将其实际存储到数据库中,可以将网址用作String字段,this示例可以帮助您入门。

使用图片表:

case class Picture(url: String, id: Option[Int] = None)

trait PictureComponent { this: Profile => //requires a Profile to be mixed in...
  import profile.simple._ //...to be able import profile.simple._ 

  class Pictures(tag: Tag) extends Table[Picture](tag, "PICTURES") {  

    def id = column[Option[Int]]("PIC_ID", O.PrimaryKey, O.AutoInc)
    def url = column[String]("PIC_URL", O.NotNull)

    def * = (url, id) <> (Picture.tupled, Picture.unapply)
  }

  val pictures = TableQuery[Pictures]

  private val picturesAutoInc = pictures returning pictures.map(_.id) into { case (p, id) => p.copy(id = id) }
  def insert(picture: Picture)(implicit session: Session): Picture = picturesAutoInc.insert(picture)
}

然后将用户表作为图片ID的外部参考:

class Users(tag: Tag) extends Table[(String, Int, Option[Int])](tag, "USERS") {
  def id = column[Option[Int]]("USER_ID", O.PrimaryKey, O.AutoInc)
  def name = column[String]("USER_NAME", O.NotNull)
  def pictureId = column[Int]("PIC_ID", O.NotNull)
  def * = (name, pictureId, id)
}

插入时,您可以上传图像,存储网址,检索ID并将其作为外部密钥分配给User实体。要使外键列可以为空,您只需使用[column[Option[Int]]而不是column[Int]

否则,您可以根据评论there's a test inside the Slick library with JDBC中的建议使用Blob字段来创建包含Blob字段的表格:

class T(tag: Tag) extends Table[(Int, Blob)](tag, "test3") {
  def id = column[Int]("id")
  def data = column[Blob]("data")
  def * = (id, data)
}

val ts = TableQuery[T]

然后插入:

ts insert (1, new SerialBlob(Array[Byte](1,2,3)))
ts insert (2, new SerialBlob(Array[Byte](4,5)))

然后,您可以查看java.io.serializable如何将文件转换为bites,然后将其存储到Blob中,此link可以提供帮助(忽略sql部分)。