如何使用嵌套元组或 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 示例。

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

作为编写这些函数的替代方法,您可以将与映射类型相对应的 lifted 类型定义为explained in the manual。当您的映射类型有嵌套的案例类(每个 单独映射,当您在* 投影(或投影或查询中的任何其他位置)中使用它们时,它们会自动组合。

【讨论】:

我无法使这个自定义案例类映射(基于测试)工作。我在这里打开了一个相关问题:***.com/questions/28305023/…

以上是关于如何使用嵌套元组或 HList 处理具有 Slick 的 > 22 列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中创建具有两列作为元组或 Pandas 数据框的单个变量?

找不到参数元组的隐式值

数据库查询学习心得

返回元组或无的函数:如何很好地调用该函数?

遍历列表元组或字符串的函数enumerate

在“if”子句中使用“in”时的元组或列表?