我该如何处理>使用嵌套元组或HLists的Slick 22列表?

时间:2013-10-28 13:52:30

标签: scala tuples slick scala-2.11

我是Scala(使用2.10)和Slick(使用2.0-M2)的新手。我看到在Slick中绕过表的22列限制的方法之一是使用嵌套元组。尽管找到了this partial code on GitHub,但我无法弄清楚如何做到这一点。

当前的dev分支Scala(2.11-M5)支持包含22个以上元素的case类,但不包含arity>的元组。 22. Slick尚未针对Scala 2.11预发行版进行分发。如何定义33列表(并使其与所有Slick的语法糖一起使用)?

N.B。,我正在尝试支持现有架构,无法更改表规范化。

2 个答案:

答案 0 :(得分:5)

在这里,我写了一篇帖子来给出解决方案。这是链接:https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/

我绘制一些图表并使用不同的颜色来帮助您快速理解。

总而言之,我使用附加的Case类将一些列打包为一个,这不会影响实际的物理列。然后当我们使用投影映射到自定义类型时,我们将元组引回。这是一个黑客解决方案,但很容易修复Scala编程语言的限制,其中元组的大小应小于22。

答案 1 :(得分:1)

您链接的测试代码已过时。如果你没有为你的表使用映射,它是直截了当的:*的类型对应于查询表时得到的返回类型,是否是单个元组, HList或嵌套元组。从Slick 2.1开始,这适用于所有操作。 (在2.0中,*投影不支持,因此您必须定义备用投影并覆盖create_*。)有关HList示例,请参阅here

如果您想将*投影映射到自定义类型,您还可以使用<>运算符作为单个元组,但您不会获得{{1}的便利为case类自动生成的{}和tupled方法,因此你必须手动编写两个映射函数(从unmapped到map类型并返回),如图here所示。请注意,Scala 2.11不会改善这种情况。虽然它允许包含超过22个字段的案例类,但arities&gt;没有相应的unapply类型。 22,所以你仍然无法使用Functiontupled

作为编写这些函数的替代方法,您可以将与映射类型对应的提升类型定义为explained in the manual。当您为映射类型嵌套案例类(每个&lt; = 22个字段)时,这尤其有用。您只需为每个案例类定义单独的映射,当您在unapply投影(或投影或查询中的任何其他位置)中使用它们时,它们将自动编写。