21

我是 Scala(使用 2.10)和 Slick(使用 2.0-M2)的新手。我看到解决 Slick 中表的 22 列限制的方法之一是使用嵌套元组。尽管在 GitHub 上找到了此部分代码,但我不知道该怎么做。

当前的开发分支 Scala (2.11-M5) 支持具有超过 22 个元素的案例类,但不支持 arity > 22 的元组。并且 Slick 尚未针对 Scala 2.11 预发行版分发。如何定义一个 33 列的表(并让它与所有 Slick 的语法糖一起使用)?

注意,我正在尝试支持现有架构并且无法更改表规范化。

4

2 回答 2

6

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

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

综上所述,我使用额外的case Class将一些列打包为一个,这不会影响真正的物理列。然后当我们使用投影映射到自定义类型时,我们涉及到元组返回。这是一个 hack 解决方案,但很容易修复 Scala 编程语言的限制,即元组的大小应小于 22。

于 2016-03-31T14:00:09.007 回答
2

您链接到的测试代码已过时。如果您不为表使用映射,这很简单:类型*对应于您在查询表时获得的返回类型,无论是单个元组、HList 还是嵌套元组。从 Slick 2.1 开始,这适用于所有操作。(在 2.0 中,它不支持*投影,因此您必须定义替代投影并覆盖create_*。)请参阅此处以获取 HList 示例。

如果要将*投影映射到自定义类型,也可以将<>运算符用作单个元组,但无法获得为案例类自动生成的tupledand方法的便利性,因此您必须编写两个映射unapply手动函数(从未映射到映射类型并返回),如下所示。请注意,Scala 2.11 并没有改善这种情况。虽然它允许具有超过 22 个字段的案例类,但没有对应Function的类型为 arities > 22,因此您仍然不能使用tupledand unapply

作为编写这些函数的替代方法,您可以定义与您的映射类型相对应的提升类型,如手册中所述。当您的映射类型有嵌套的案例类(每个 <= 22 个字段)时,这尤其有用。您只需为每个案例类定义单独*的映射,当您在投影(或投影或查询中的任何其他位置)中使用它们时,它们将自动组合。

于 2015-01-30T16:52:01.347 回答