如何使用嵌套元组或 HList 处理具有 Slick 的 > 22 列表?
Posted
技术标签:
【中文标题】如何使用嵌套元组或 HList 处理具有 Slick 的 > 22 列表?【英文标题】:How can I handle a > 22 column table with Slick using nested tuples or HLists? 【发布时间】:2013-11-07 07:58:44 【问题描述】:我是 Scala(使用 2.10)和 Slick(使用 2.0-M2)的新手。我看到解决 Slick 中表的 22 列限制的方法之一是使用嵌套元组。尽管找到了this partial code on GitHub,但我不知道该怎么做。
当前的开发分支 Scala (2.11-M5) 支持具有超过 22 个元素的案例类,但不支持 arity > 22 的元组。并且 Slick 尚未针对 Scala 2.11 预发行版分发。如何定义一个 33 列的表(并让它与所有 Slick 的语法糖一起使用)?
注意,我正在尝试支持现有架构并且无法更改表规范化。
【问题讨论】:
不会帮助你,但与***.com/questions/19593137/… 相关(把它放在那里是因为如果有人想出这个问题的答案,它也可以回答那个人)。 这个相关问题有很多有用的信息:***.com/questions/13906684/… 【参考方案1】:我在这里写一个帖子来给出解决方案。这是链接:https://lihaimei.wordpress.com/2016/03/30/slick-1-fix-more-than-22-columns-case/
我画了一些图表并使用不同的颜色来帮助您快速理解。
总而言之,我使用额外的case Class将一些列打包为一个,这不会影响真正的物理列。然后当我们使用投影映射到自定义类型时,我们涉及到元组返回。这是一个 hack 解决方案,但很容易修复 Scala 编程语言的限制,即元组的大小应小于 22。
【讨论】:
【参考方案2】:您链接到的测试代码已过时。如果你不为你的表使用映射,那很简单:*
的类型对应于你在查询表时得到的返回类型,无论是单个元组、HList 还是嵌套元组。从 Slick 2.1 开始,这适用于所有操作。 (在 2.0 中,*
投影不支持,因此您必须定义替代投影并覆盖 create_*
。)请参阅 here 以获取 HList 示例。
如果您想将 *
投影映射到自定义类型,您还可以使用 <>
运算符作为单个元组,但您无法获得 tupled
和 unapply
方法的便利为案例类自动生成,因此您必须手动编写两个映射函数(从未映射到映射类型并返回),如here 所示。请注意,Scala 2.11 并没有改善这种情况。虽然它允许具有超过 22 个字段的案例类,但没有对应的 Function
类型用于 arities > 22,因此您仍然不能使用 tupled
和 unapply
。
作为编写这些函数的替代方法,您可以将与映射类型相对应的 lifted 类型定义为explained in the manual。当您的映射类型有嵌套的案例类(每个 单独映射,当您在*
投影(或投影或查询中的任何其他位置)中使用它们时,它们会自动组合。
【讨论】:
我无法使这个自定义案例类映射(基于测试)工作。我在这里打开了一个相关问题:***.com/questions/28305023/…以上是关于如何使用嵌套元组或 HList 处理具有 Slick 的 > 22 列表?的主要内容,如果未能解决你的问题,请参考以下文章