【问题标题】:How to mix select and delete in a Slick transaction如何在 Slick 事务中混合选择和删除
【发布时间】:2017-05-25 03:48:27
【问题描述】:

为什么在 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

【问题讨论】:

  • 试试item &lt;- SomeTable.result。我无法编译第二个示例,SomeTableTableQuery 对吗?
  • 我试过了。然后我不能使用item 过滤第二个表,删除与否(我更新了第一个 sn-p 以显示这种情况)。真正的查询更复杂。
  • @insan-e SomeTableTableQuery,是的。您也可以在其后添加filter。您可以使用for 链接选择语句,或删除语句,但显然不能同时使用。
  • 使用item &lt;- SomeTable.result,您将获得Seq[ModelRow](来自SomeTable 的行列表)。你必须说类似OtherTable.filter(_.id.inSet(item.map(_.id)).delete
  • @insan-e 好像是这样!谢谢

标签: scala transactions slick slick-3.0


【解决方案1】:

好的,这是一个将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

返回您的SomeTable 案例类的Seq(其中包含您的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

【讨论】:

  • 我不得不拆分事情——在一个查询中进行选择并将该查询 + 删除放入事务中——但最终当我添加 result 时它起作用了。感谢您的详细解释。在 IDE 中检查对象类型并不容易,而且我把事情与连接的语法混为一谈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多