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

How to mix select and delete in a Slick transaction

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

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

"Cannot resolve symbol 'transactionally'"

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

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

,

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

好的,所以这是一个 class混合 DBIOQuery 的例子。

在你的第一个案例中:

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

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

所以第一件事是 - 将您的代码更改为仅使用 DBIOs。下面的例子是不正确的。

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

returns Seq 您的 SomeTable 案例 class(其中包含您的 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