我想在数据库中插入记录,但不调用db.run
我的代码看起来像这样
val insertQueryStep = processStepTemplates returning processStepTemplates.map(_.id) into ((processStep, id) => processStep.copy(id = Some(id)))
/**
* Generates a new ProcessStepTemplate
*
* @param step
* @return
*/
def addProcessStepTemplateToProcessTemplate(step: ProcessStepTemplatesModel, processId: Int): Future[Some[ProcessStepTemplatesModel]] = {
println("In DTO: " + step + ", processtemplate: " + processId)
//val p = processStepTemplates returning processStepTemplates.map(_.id) += step
val p = insertQueryStep += step
db.run(p).map(id => {
println("Die Query lautet: " + p)
println("Die erzeugte ID lautet: " + id)
//Update the foreign key
val q = for { p <- processStepTemplates if p.id == id } yield p.processtemplate
val updateAction = q.update(Some(processId))
db.run(updateAction).map(id => {
println("Der neue Prozesschritt lautet: " + step)
Some(step)
})
Some(step)
})
}
在这种情况下会出现什么问题?
答案 0 :(得分:1)
你应该将你的未来编成monad(使用flatMap)。因为内心的未来不会完成。 尝试以下列方式更改代码(请参阅注释#1,#2):
def addProcessStepTemplateToProcessTemplate(step: ProcessStepTemplatesModel, processId: Int): Future[Some[ProcessStepTemplatesModel]] = {
println("In DTO: " + step + ", processtemplate: " + processId)
//val p = processStepTemplates returning processStepTemplates.map(_.id) += step
val p = insertQueryStep += step
db.run(p).flatMap(id => { // #1 change map to flatMap
println("Die Query lautet: " + p)
println("Die erzeugte ID lautet: " + id)
//Update the foreign key
val q = for { p <- processStepTemplates if p.id == id } yield p.processtemplate
val updateAction = q.update(Some(processId))
val innerFuture = db.run(updateAction).map(id => {
println("Der neue Prozesschritt lautet: " + step)
Some(step)
})
innerFuture // # 2 return inner future
})
}
还使用日志记录来检测其他问题(与db-schema,查询等相关联)。