gpt4 book ai didi

scala - Slick 3 Transactions with logic in Scala

转载 作者:行者123 更新时间:2023-12-04 08:05:42 27 4
gpt4 key购买 nike

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

我已阅读文档

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

谢谢
彼得

最佳答案

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

修改您的示例:

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需要来自 x 的函数作为参数到 DBIO[T] .它将两个 Action 一起排序,允许第二个使用第一个的结果。

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

您可以将这个组合操作包装在一个事务中,只需调用 run一次:
 val future = database.run(action.transactionally)

关于scala - Slick 3 Transactions with logic in Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33352742/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com