Ответ 1
Проблема в моем коде ниже заключается в том, что все подзапросы не работают (вложенные db.run)
Я подозреваю, что вы закончили вложенные результаты Future[R]
. Однако я этого не исследовал. Потому что...
Концептуально говоря, чего я не получу?
То, как я решал это, - это посмотреть на объединение DBIO[R]
. Это может быть концепция, которая помогает.
То, что вы делаете, пытается выполнить каждое действие (запрос, вставить...) индивидуально. Вместо этого объедините отдельные действия в одно действие и запустите это.
Я бы переписал основную логику следующим образом:
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")
Вторая половина сообщения https://github.com/d6y/so-31471590