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]]
改用.它推断出可空性.
归档时间: |
|
查看次数: |
4077 次 |
最近记录: |