没有调用光滑的db.run

时间:2017-06-07 07:23:59

标签: scala playframework slick

我想在数据库中插入记录,但不调用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)
    })
  }

在这种情况下会出现什么问题?

1 个答案:

答案 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,查询等相关联)。