gpt4 book ai didi

scala - SLICK 3.0 - 多个查询相互依赖 - db.run(action)

转载 作者:行者123 更新时间:2023-12-04 01:59:01 25 4
gpt4 key购买 nike

我是 Slick 3 的新手,到目前为止我已经了解 db.run 是异步调用。一旦 Future 返回,.map 或 .flatMap 就会运行。

我下面代码中的问题是所有子查询都不起作用(嵌套的 db.run)。

从概念上讲,我没有得到什么?执行以下这种代码是否有效?基本上在第一个查询的 .map 中,我根据第一个查询执行一些操作。

随处可见 for 循环,产量 ,这是唯一的出路吗?我的代码中的问题是否与返回的 Future 值有关?

val enterprises = TableQuery[Enterprise]
val salaries = TableQuery[Salary]

//Check if entered enterprise exists
val enterpriseQS = enterprises.filter(p => p.name.toUpperCase.trim === salaryItem.enterpriseName.toUpperCase.trim).result

val result=db.run(enterpriseQS.headOption).map(_ match
{
case Some(n) => {
//if an enterprise exists use the ID from enterprise (n.id) when adding a record to salary table
val addSalary1 = salaries += new SalaryRow(0, n.id, salaryItem.worker)
db.run(addSalary1)
}
case None => {
//if an enterprise with salaryItem.enterpriseName doesn't exist, a new enterprise is inserted in DB
val enterpriseId = (enterprises returning enterprises.map(_.id)) += EnterpriseRow(0, salaryItem.enterpriseName)
db.run(enterpriseId).map{
e => {
val salaryAdd2 = salaries += new SalaryRow(0, e, salaryItem.worker)
db.run(salaryAdd2)
}
}
}
})

最佳答案

The problem in my code below is that all the sub queries do not work (nested db.run)



我怀疑您最终会遇到嵌套 Future[R]结果。我没有调查过。因为...

Conceptually speaking, what am I not getting?



我解决这个问题的方法是考虑结合 DBIO[R] .这可能是有帮助的概念。

您正在做的是尝试单独运行每个操作(查询、插入...)。
相反,将单个 Action 组合成一个 Action 并运行它。

我将主要逻辑重写为:
  val action: DBIO[Int] = for {
existingEnterprise <- enterpriseQS.headOption
rowsAffected <- existingEnterprise match {
case Some(n) => salaries += new SalaryRow(0, n.id, salaryItem.worker)
case None => createNewEnterprise(salaryItem)
}
} yield rowsAffected

对于 None如果我创建一个辅助方法:
  def createNewEnterprise(salaryItem: SalaryItem): DBIO[Int] = for {
eId <- (enterprises returning enterprises.map(_.id)) += EnterpriseRow(0, salaryItem.enterpriseName)
rowsAffected <- salaries += new SalaryRow(0, eId, salaryItem.worker)
} yield rowsAffected

最后,我们可以运行:
  val future: Future[Int] = db.run(action)
// or db.run(action.transactionally)

val result = Await.result(future, 2 seconds)

println(s"Result of action is: $result")

下半场 blog post I've written更多地谈论这个。

我使用的代码是: https://github.com/d6y/so-31471590

关于scala - SLICK 3.0 - 多个查询相互依赖 - db.run(action),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471590/

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