Scala 中带有逻辑的 Slick 3 事务

Slick 3 Transactions with logic in Scala

我对 Slick 3 和交易有疑问

我已阅读文档

http://slick.typesafe.com/doc/3.1.0/dbio.html

和其他 Slick 3 交易问题

但他们没有帮助我

我需要从数据库中读取一些值,运行 Scala 中的一些逻辑,然后根据结果修改数据库。我希望整个操作是原子的。

我的代码看起来像这样:

database.run(TableQuery[X].filter(blah).result).map { x =>
  database.run { 
    if( someLogicNotInSQL(x) ) 
      TableQuery[Y].insert(someFoo) 
    else 
      TableQuery[Y].insert(someBah)
  } 
}

如何获取查询的值,运行 Scala 中的一些逻辑,然后 运行 另一个操作(例如插入)都作为一个原子事务。

谢谢 彼得

为了 运行 在事务中,您需要构造一个包含您的查询和逻辑的操作。然后 运行 那个带有交易的动作。

修改您的示例:

import scala.concurrent.ExecutionContext.Implicits.global 

val action = 
  tableQuery.filter(blah).result.flatMap { x =>
     if (someLogicNotInSql(x)) 
        tableQuery.insert(someFoo)
     else 
        tableQuery.insert(someBah)
  }

flatMap 需要一个从 xDBIO[T] 的函数作为参数。它会将两个动作排序在一起,允许第二个动作使用第一个动作的结果。

为了 运行 这个组合操作,您需要一个执行上下文。 (因为你的计算 if (someLogicNotInSql ... 将不得不 运行 在某处的某个线程上,而不是 Slick 的内部执行上下文。

您可以将此组合操作包装在事务中,只需调用 run 一次:

 val future = database.run(action.transactionally)