我是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。,我正在尝试支持现有架构,无法更改表规范化。
答案 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,所以你仍然无法使用Function
和tupled
。
作为编写这些函数的替代方法,您可以将与映射类型对应的提升类型定义为explained in the manual。当您为映射类型嵌套案例类(每个&lt; = 22个字段)时,这尤其有用。您只需为每个案例类定义单独的映射,当您在unapply
投影(或投影或查询中的任何其他位置)中使用它们时,它们将自动编写。