如何使用嵌套元组或HLists在Slick中处理超过22列的表格?

21
我刚接触Scala(使用2.10)和Slick(使用2.0-M2)。我看到在Slick中克服22列表限制的方法之一是使用嵌套元组。尽管在GitHub上找到了这个部分代码,但我仍然无法弄清楚如何做到这一点。

当前开发分支的Scala(2.11-M5)支持具有超过22个元素的case类,但不支持元组的数量> 22。而且Slick尚未为Scala 2.11预发布版本分布。我如何定义一个33列表格(并使其与Slick的所有语法糖一起工作)?
注意,我正在尝试支持一个现有模式,并且不能更改表规范化。

1
不会对你有所帮助,但相关的 https://dev59.com/UXjZa4cB1Zd3GeqPdWbl (把它放在那里是因为如果有人回答了这个问题,也可以回答那个人)。 - om-nom-nom
这个相关的问题有很多有用的信息:https://dev59.com/6WYr5IYBdhLWcg3wKHEp - sventechie
2个回答

6

我写了一篇文章来提供解决方案。这是链接:https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/

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

总之,我使用额外的案例类将某些列打包到一个中,这不会影响真正的物理列。然后,当我们使用投影将其映射到自定义类型时,我们将元组换回。这是一个hack解决方案,但很容易修复Scala编程语言的限制,即元组的大小应小于22。


2
你链接的测试代码已经过时。如果你不使用映射来处理表格,那么很简单: * 的类型对应于查询表格时返回的类型,无论它是单个元组、HList 还是嵌套元组。自从 Slick 2.1 版本以后,这适用于所有操作。(在 2.0 版本中,* 投影不支持此操作,因此您必须定义一个替代投影并覆盖 create_*)。请参见此处 获取 HList 示例。
如果您想将 * 投影映射到自定义类型,则还需要使用 <> 操作符,就像处理单个元组一样,但您不会获得自动生成用于案例类的 tupledunapply 方法的便利性,因此您必须手动编写两个映射函数(从未映射到已映射类型和反向)如此处所示。请注意,Scala 2.11 不会改善这种情况。虽然它允许具有超过 22 个字段的案例类,但是对于大于 22 的元数,没有相应的 Function 类型,因此仍然无法使用 tupledunapply
作为编写这些函数的替代方法,您可以定义一个与映射类型对应的 lifted 类型,如手册中所述。当您的映射类型具有嵌套案例类(每个案例类都小于等于 22 个字段)时,这特别有用。您只需要为每个案例类定义单独的映射,它们将在您在投影或查询中使用它们时自动组合。

我无法使这个基于测试的自定义案例类映射工作。我在这里打开了一个相关的问题:https://dev59.com/oV4c5IYBdhLWcg3wHHGY - Sebastien Lorber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接