播放anorm 2.3 - 2.4迁移

时间:2015-10-08 09:23:07

标签: playframework anorm

迁移到2.4时,我注意到以下内容:

1 / apply在SqlQuery上已弃用 - 好的 - 我查看了提供的实现:

def go(c: Option[Cursor], s: Stream[Row]): Stream[Row] = c match {
      case Some(cursor) => go(cursor.next, s :+ cursor.row)
      case _ => s
    }

是不是将每个元素追加到Stream的时间与流的大小成正比?例如,最终不是n2?以前的实现使用了我认为......

2 / SqlQuery(“qry”)曾经有办法解析查询 - 这似乎已被删除

我有一个经常执行查询的用例(如1000qps)并且我无法缓存一次:它看起来像dbname中的选择X,Y,Y.db - 所以没有数据库名称的可绑定语句。对于一个大型查询,事实证明语句解析器有点慢 - 有没有办法明确说:我不需要解析该查询?

3 / ResultSetParser完全私有 - 我有一个util函数提供:

def vector[A](p: RowParser[A]): ResultSetParser[Vector[A]] ...

因为我更喜欢Vector - 我将它与SQL(“...”)一起使用 有关如何更换的任何建议? withResult也许?

1 个答案:

答案 0 :(得分:0)

1。 .apply的当前实现仅用于向后兼容,因为已弃用。如果您想进行流式传输,可以查看Streaming支持:.withResult.foldWhile

2. 不再允许直接构造基础查询类型(SqlQuery),因为它会绕过使用公共构造函数SQL(...)(或SQL)时完成的一些检查插值SQL"...")。没有什么能阻止以这种方式初始化查询以使用不同的参数重新使用它。

val baseQuery = SQL("SELECT * FROM Test WHERE id = {id}")
val query1 = baseQuery.on("id" -> "foo")
val query2 = baseQuery.on("id" -> "bar")

3。正如问题跟踪器所述,ResultSetParser并非设计为通用类型,而是用于Anorm实现的内部使用。开封它会对维护产生影响。

您可以从VectorList.*解析器)获取.+,也可以使用Streaming支持自行构建矢量,而无需中间列表。< / p>