带有可选图像列的 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