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列的报告......
今天去尝试实验,看看我是否找不到自己可行的解决方案。