【问题标题】:Why does this ScalaQuery statement only delete the odd rows?为什么这个 ScalaQuery 语句只删除奇数行?
【发布时间】:2012-06-29 01:54:33
【问题描述】:

尝试删除一批记录时,仅删除奇数行!

val byUser = Orders.createFinderBy(_.userID)
byUser(id).mutate(_.delete)

如果我改为打印记录,我会得到正确的行数。

byUser(id).mutate{x => x.echo}

我解决了这样的问题,它生成了所需的 SQL。

(for{o <- Orders if o.userID is id.bind } yield o).delete

但是,变异版本为什么或如何只影响奇数行?

【问题讨论】:

  • 虽然我不知道在这种特殊情况下发生了什么,但它是链表的一个非常常见的问题:当您尝试在迭代时删除时,您删除一个,然后迭代一个,然后删除一个等。剩下一半的列表。可变集合上的任何迭代器都可能遇到此问题,具体取决于它的创建方式。我不知道这里有哪些可供您使用的替代策略 - 使用链表,您只需删除即可解决问题,并让删除本身遍历整个列表。
  • @RexKerr 必须与您所描述的类似。另一种方法是创建一个不调用 MutatingUnitInvoker 的查询(由准备好的语句表达式生成的查询类型,如 createFinderBy 和通过参数 [T] 绑定的表达式)
  • @RexKerr 看起来你已经得到了唯一的答案,我会这样发布并获得一些支持:)
  • @AnthonyMastrean - 这个问题没有得到正确回答,所以我宁愿把它留在 cmets 中。 (这不像我缺乏声誉。)

标签: scala scalaquery


【解决方案1】:

我已经在源代码中进行了挖掘,它似乎就像@RexKerr 所说的那样 - 一个迭代器用于处理元素,在迭代时应用删除(这里的 mutate 方法中的 while 循环):

https://github.com/rjmac/scala-query/blob/master/src/main/scala/org/scalaquery/MutatingInvoker.scala

有趣的是,有一个 previousAfterDelete 标志可用于在每次删除后强制迭代器向后移动。对于 Access 数据库,这似乎设置为 true(请参阅 AccessQueryInvoker 类),而不是其他数据库:

https://github.com/rjmac/scala-query/blob/master/src/main/scala/org/scalaquery/ql/extended/AccessDriver.scala

我建议下载源代码并调试代码。也许应该为您正在使用的数据库供应商设置此标志。我也会考虑提交错误报告:

http://scalaquery.org/community.html

PS。我知道这是一个老问题,但回答它以防万一其他人遇到这个问题

【讨论】:

  • 社区早已转向下一个版本的库,Slick,但我在 SQ 上还有一个项目,所以感谢期待已久的回答 ;-)
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2021-01-14
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多