sve*_*hie 20 scala tuples slick scala-2.11
我是Scala(使用2.10)和Slick(使用2.0-M2)的新手.我看到在Slick中绕过表的22列限制的方法之一是使用嵌套元组.尽管在GitHub上找到了这个部分代码,但我无法弄清楚如何做到这一点.
当前的dev分支Scala(2.11-M5)支持具有22个以上元素的case类,但不支持arity> 22的元组.而Slick尚未针对Scala 2.11预发行版进行分发.如何定义33列表(并使其与所有Slick的语法糖一起使用)?
NB,我正在尝试支持现有架构,无法更改表规范化.
在这里,我写了一篇帖子来给出解决方案.这是链接:https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/
我绘制一些图表并使用不同的颜色来帮助您快速理解.
总而言之,我使用额外的case Class将一些列打包为一个,这不会影响真实的物理列.然后,当我们使用投影映射到自定义类型时,我们将元组引回.这是一个黑客解决方案,但很容易修复Scala编程语言的限制,其中元组的大小应小于22.
您链接到的测试代码已过时。如果您的表不使用映射,则很简单: 的类型*对应于查询表时获得的返回类型,无论它是单个元组、HList 还是嵌套元组。从 Slick 2.1 开始,这适用于所有操作。(在 2.0 中,投影不支持*,因此您必须定义备用投影并覆盖create_*。)请参阅此处的 HList 示例。
如果您想将投影映射*到自定义类型,您还可以使用<>as 运算符来表示单个元组,但您无法享受为案例类自动生成的tupled和方法的便利,因此您必须编写两个映射unapply手动调用函数(从未映射到映射类型并返回),如下所示。请注意,Scala 2.11 并没有改善这种情况。虽然它允许案例类具有超过 22 个字段,但 arities > 22 没有相应的Function类型,因此您仍然无法使用tupledand unapply。
作为编写这些函数的替代方法,您可以定义与映射类型相对应的提升类型,如手册中所述。当您的映射类型有嵌套案例类(每个 <= 22 个字段)时,这尤其有用。您只需为每个案例类定义单独的*映射,当您在投影(或投影或查询中的任何其他位置)中使用它们时,它们就会自动组合。
| 归档时间: |
|
| 查看次数: |
4463 次 |
| 最近记录: |