slick db.run 没有被调用

slick db.run is not called

我想在数据库中插入一条记录,但是 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)
    })
  }

在这种情况下可能有什么问题?

你应该将你的未来组合成 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、查询等相关)。