为什么在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
答案 0 :(得分:2)
好的,这是将DBIO
与Query
混合的典型示例。
在你的第一个案例中:
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