如何使用新的Slick 2.0 HList克服22列限制?

sve*_*hie 15 scala tuples hlist slick

我目前正在编写Slick代码来定位具有两个表> 22列的旧模式.如何使用新的HList代码?在Scala 2.10.3下,我在其他方面有2.0-M3正常工作.这是我目前使用的案例类/元组的语法.如何使用文档中提到的新HList?

  case class Joiner(
      id: Int,
      name: Option[String],
      contact: Option[String]
  )

  class Joiners(tag: Tag) extends Table[Joiner](tag, "joiner") {
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc, O.DBType("int(11)"))
    def name = column[Option[String]]("name", O.DBType("varchar(255)"))
    def contact = column[Option[String]]("contact", O.DBType("text"))
    def * = (id, name.?, contact.?) <> (Joiner.tupled, Joiner.unapply)
  }
  val joiners = TableQuery[Joiners]
Run Code Online (Sandbox Code Playgroud)

我在示例中没有看到任何内容,只是在最新更新的文档中提及了一下.我是Scala和Slick的新手.

cvo*_*ogt 10

定义

使用Scala> = 2.10.4-RC2(也由Slick 2.0.0代码生成器发出):

import scala.slick.collection.heterogenous._
import syntax._
class Joiners(tag: Tag) extends Table[
    Int :: Option[String] :: Option[String] :: HNil
](tag, "joiner") {
  ...
  def * = id :: name :: contact :: HNil
}
Run Code Online (Sandbox Code Playgroud)

上述内容导致Scala 2.10.3/2.10.4-RC1中的指数编译时间.由于编译时间过长,超过26列不可行.

Scala的解决方法<= 2.10.3/2.10.4-RC1(也由Slick 2.0.1代码生成器发出)

import scala.slick.collection.heterogenous._
import syntax._
class Joiners(tag: Tag) extends Table[
    HCons[Int, HCons[Option[String], HCons[Option[String], HNil]]]
](tag, "joiner") {
  ...
  def * = id :: name :: contact :: HNil
}
Run Code Online (Sandbox Code Playgroud)

我们用30-40列测试没有问题.

目前在Scala 2.10.4-RC2中偶尔出现零星的编译错误似乎仍然存在问题,看起来它将在即将到来的2.10.4-RC3中修复.请参阅https://issues.scala-lang.org/browse/SI-8146

用法示例

Joiners.run.map( r => r(2) ) // Gets column contact. It's typesafe. .apply is a macro. Only works for literals not for variables as positions.
Run Code Online (Sandbox Code Playgroud)

使用<22的元组可以将它们映射到案例类.将HLists用于> 22而不映射到案例类(Scala 2.10中的最大字段限制为22).

另外:不要使用O.Nullable.请column[Option[String]]改用.它推断出可空性.

  • 我更新示例以显示类型.关于案例类,您可以简单地省略它.您将无法在结果中按名称访问列,只能通过位置`r(2)`.如果你真的想要命名访问,你可以通过编写适当的工厂和提取器函数映射到`<>`中的普通类. (3认同)