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
需要一个从 x
到 DBIO[T]
的函数作为参数。它会将两个动作排序在一起,允许第二个动作使用第一个动作的结果。
为了 运行 这个组合操作,您需要一个执行上下文。 (因为你的计算 if (someLogicNotInSql ...
将不得不 运行 在某处的某个线程上,而不是 Slick 的内部执行上下文。
您可以将此组合操作包装在事务中,只需调用 run
一次:
val future = database.run(action.transactionally)
我对 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
需要一个从 x
到 DBIO[T]
的函数作为参数。它会将两个动作排序在一起,允许第二个动作使用第一个动作的结果。
为了 运行 这个组合操作,您需要一个执行上下文。 (因为你的计算 if (someLogicNotInSql ...
将不得不 运行 在某处的某个线程上,而不是 Slick 的内部执行上下文。
您可以将此组合操作包装在事务中,只需调用 run
一次:
val future = database.run(action.transactionally)