如何在 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混合 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
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
为什么在 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混合 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
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