带有可选图像列的 Scala Slick 模型

Posted

技术标签:

【中文标题】带有可选图像列的 Scala Slick 模型【英文标题】:Scala Slick Model with Optional Image column 【发布时间】:2014-05-23 19:23:51 【问题描述】:

我正在尝试向具有可选图像的现有模型添加一列,我正在使用带有 Play Framework 的 Scala Slick。使用 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 


这是我试图将图像集成到其中的模型。

感谢您的建议!

【问题讨论】:

您是否尝试过使用Option[Blob] 【参考方案1】:

如果您不想将其实际存储到数据库中,您可以使用 url 作为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)

然后将user表作为图片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)

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

否则,您可以按照评论中的建议使用 Blob 字段,there's a test inside the Slick library with JDBC 创建带有 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,了解如何在将文件存储到Blob 之前将其转换为bites,这link 可能会有所帮助(忽略sql 部分)。

【讨论】:

以上是关于带有可选图像列的 Scala Slick 模型的主要内容,如果未能解决你的问题,请参考以下文章

Scala + Play Framework + Slick - Json 作为模型字段

React Slick Custom Carousel 与图像重叠 div

将 Scala Slick 与数据库枚举一起使用

插入具有自动增量 id 的行 - Playframework Scala - Slick

Scala Slick 3 游戏框架

自定义 Slick 滑块设计,在图像之间留出适当的空间