Shapeless HList support for Slick.
by Richard Dallaway, Miles Sabin, and Dave Gurnell.
Copyright 2015-2016 Underscore Consulting LLP. Licensed Apache 2.
Grab the code by adding the following to your build.sbt
:
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "3.1.1",
"com.chuusai" %% "shapeless" % "2.3.1",
"io.underscore" %% "slickless" % "<<VERSION>>"
)
Import Slick, shapeless, and slickless,
and you should be able to define Tables
on any shapeless HList
type:
import slick.jdbc.H2Profile.api._
import shapeless.{ HList, ::, HNil }
import slickless._
class Users(tag: Tag) extends Table[Long :: String :: HNil](tag, "users") {
def id = column[Long]( "id", O.PrimaryKey, O.AutoInc )
def email = column[String]("email")
def * = id :: email :: HNil
}
lazy val users = TableQuery[Users]
If you want to map your HList
to a case class
(i.e. you have a case class that has more than
22 fields and you are using slickless to bypass this limit),
you can do the following
import slick.jdbc.H2Profile.api._
import shapeless.{ HList, ::, HNil, Generic }
import slickless._
case class User(id: Long, email: String)
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[Long]( "id", O.PrimaryKey, O.AutoInc )
def email = column[String]("email")
def * = (id :: email :: HNil).mappedWith(Generic[User])
}
lazy val users = TableQuery[Users]
Due to this issue,
if you accidentally make a mapping which is incorrect,
the Scala compiler can take a huge amount of time to report an error.
If your slickless project is taking an insanely long amount of time to compile
(more than a couple of minutes),
try to make sure you have the mapping correct before using <>
.
We use the sbt-pgp plugin and the sbt-sonatype plugin to publish to Maven Central.