【问题标题】:Slick 3 Transactions with logic in ScalaScala 中带有逻辑的 Slick 3 事务
【发布时间】:2015-10-26 18:12:06
【问题描述】:

我有一个关于 Slick 3 和 Transactions 的问题

我已阅读文档

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

和其他 Slick 3 交易问题

Slick 3 Transactions

Executing non-database actions in a transaction in 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 中运行一些逻辑,然后作为一个原子事务运行另一个操作(例如插入)。

谢谢 彼得

【问题讨论】:

    标签: scala transactions slick typesafe


    【解决方案1】:

    要在事务中运行它,您需要构建一个包含查询和逻辑的操作。然后使用事务运行该操作。

    修改你的例子:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多