如何在Slick事务中混合选择和删除

时间:2017-01-10 15:33:41

标签: scala transactions slick slick-3.0

为什么在Slick查询中组合SELECT和DELETE语句不起作用?如:

 val query = (for {
     item <- SomeTable
     _ <- OtherTable.filter(_.id === item.id).delete
 } yield ()).transactionally
  

“无法以事务方式解析符号”

(没有.transactionally,它是Query[Nothing, Nothing, Seq],如果有帮助的话) 而这两个行动分开进行:

 val query = (for {
     item <- SomeTable
 } yield ()).transactionally

 val query = (for {
     _ <- OtherTable.filter(_.id === 2).delete
 } yield ()).transactionally

1 个答案:

答案 0 :(得分:2)

好的,这是将DBIOQuery混合的典型示例。

在你的第一个案例中:

val query = (for {
     item <- SomeTable // this is `Query`
     _ <- OtherTable.filter(_.id === item.id).delete // this is `DBIO`
 } yield ()).transactionally

显然,对于DML,您只能使用Query用于DQL的操作 - 只需SELECT)。

首先是 - 将代码更改为仅使用DBIO s。以下示例不正确。

val query = (for {
     item <- SomeTable.result // this is `DBIO` now
     _ <- OtherTable.filter(_.id === item.id).delete // but this won't work !!
 } yield ()).transactionally
好的,我们差不多了 - 问题在于它没有编译。你需要做的是要意识到现在这一部分:

item <- SomeTable.result

返回Seq案例类SomeTable(其中包含您的id)。

因此,请考虑一下:

val query = (for {
     items <- SomeTable.result // I changed the name to `items` to reflect it's plural nature
     _ <- OtherTable.filter(_.id.inset(items.map(_.id))).delete // I needed to change it to generate `IN` query
 } yield ()).transactionally