gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:50:26 25 4
gpt4 key购买 nike

我目前正在编写 Slick 代码以针对具有两个 > 22 列的表的旧模式。我该怎么做 use the new HList code ?我有 2.0-M3 在 Scala 2.10.3 下的其他方面工作正常。
这是我目前在案例类/元组中使用的语法。我该怎么办 use the new HLists mentioned in the docs?

  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]

我在示例中没有看到任何内容,仅在新更新的文档中简要提及。我是 Scala 和 Slick 的新手。

最佳答案

定义

使用 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
}

以上导致 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
}

我们用 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.

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

另外:不要使用 O.Nullable。使用 column[Option[String]]反而。它推断可空性。

关于scala - 如何使用新的 Slick 2.0 HList 来克服 22 列的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com