如何在Scala for Anorm中创建一个可变长度的RowParser?

时间:2015-04-23 00:15:16

标签: sql scala playframework anorm

Anorm中的典型解析器看起来有点像这样:

  val idSeqParser: RowParser[IDAndSequence] = {
    long("ID") ~
      int("sequence") map {
        case id ~ sequence => IDAndSequence(id, sequence)
      }
  }

当然假设您有一个类似的案例类:

  case class IDAndSequence(id: Long, sequence: Int = 0)

如果您想要在运行时编写即时查询(原始SQL),那么如果您事先知道这一点,那么所有方便的花花公子? (提示:即时报告引擎)

如何解决这个问题?

你能创建一系列通用解析器或不同数量的字段(我看到Scala本身在处理表单上的元组时必须求助,这意味着你只能在表单中找到22个元素,并且不确定你在做什么后会做什么该...)

你可以假设"一切都是字符串"为了报告,Option[String]应该删除它。

是否可以动态创建解析器?如果是这样,那会是什么样子?

是解决这个问题的更优雅方式"?

编辑(以帮助澄清我之后的事情)

尽我所能"问"使用别名

Select f1 as 'a', f2 as 'b', f3 as 'c' from sometable

然后我可以使用预先编写的解析器来收集它

  val idSeqParser: RowParser[IDAndSequence] = {
      get[Option[String]]("a") ~ 
      get[Option[String]]("b") ~ 
      get[Option[String]]("c") map {
        case a ~ b ~ c => GenericCase(a, b, c)
      }
  }

但是,这意味着我需要为实际报告输出添加列别名。 SqlParser.flatten的建议已经让我领先于它,因为它有多达22个(那些"文字" kludge!)列。

由于我曾经写过超过22列的报告 - 主要是作为进一步手动数据挖掘的电子表格的输入 - 我想尽可能地逃避这个限制。很难告诉客户,您可以在5天内获得紧急的27列报告,但是您可以在5分钟内获得这个21列的报告......

今天去尝试实验,看看我是否找不到自己可行的解决方案。

0 个答案:

没有答案