【问题标题】:Selecting many arbitrary columns in Slick在 Slick 中选择许多任意列
【发布时间】:2014-09-19 23:13:24
【问题描述】:

我正在尝试在 Slick 中针对视图运行 SELECT * 样式的查询。理想情况下,我最终会得到一个函数,您可以将一组列名作为Seq[String] 传递,它会执行查询SELECT col1, col2, ... FROM view。如果这不可行,那么只返回所有列是可以接受的 (SELECT * FROM view)。

我知道我可以通过为此视图定义 Table 类以及随附的案例类来做到这一点,但是其中一些视图有数百列(这需要嵌套元组,因为有 22 个元素的限制在元组上),并且我必须为此执行许多视图,因此要编写/生成/维护很多代码。如果可能的话,我想避免这种情况。

这在 Slick 中可行吗?通过定义 Table 类而不必在静态代码中定义列(使用动态列字符串列表初始化某些类是可以接受的),或者仅使用 sql"""...""" 自己生成 SQL 查询并以某种方式获取 .as[...]处理返回一组任意长度的列?

我不需要对实际的列类型做任何特别的事情:在数据库端,我们有多种类型,但如果它们都被视为 Slick 端的文本列,那就没问题了和我一起。

【问题讨论】:

标签: sql scala slick


【解决方案1】:

Slick 不适合您的要求。

当您想要访问任意列(例如,通过使用列名的List[String])时,您将失去 Slick 提供的所有类型安全优势,因为它无法验证架构。

这意味着您必须放弃 Slick 的表类,并使用生成的 SQL(使用 String 查询)寻求完全动态的解决方案。

虽然 Slick 允许您手动编写 SQL(查看 StaticQuery.query 函数),但其他库更适合该任务。我建议看看 ScalikeJDBC。

【讨论】:

  • 这也是我们得出的结论。我们最终切换到 jOOQ 并且非常高兴。
  • jOOQ 与 Scala 集成的进展如何? (Option 之类的?)
  • 我们对 jOOQ 还很陌生,所以我不能权威地回答这个问题,但我发现 Scala 集成不错但不是很好。总体而言,jOOQ 是一个非常令人印象深刻的 ORM,它的(有限的)Scala 集成并没有阻碍我们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多