Mysql Scala Slick:只是执行操作序列的一部分

Mysql Scala Slick:只是执行操作序列的一部分,mysql,scala,playframework,slick,Mysql,Scala,Playframework,Slick,拥有一段代码,用于添加/更新产品,并将一个或多个标记与之关联。标签实际上被添加到与产品关联的标签组中 我面临的问题是,只有addOrUpdateProductWithTags()的“部分”执行。更新或创建产品,但不添加标签。如果我对最后一个查询进行了注释(请参见注释),那么一切都正常。已打开“”以确认这一点 lazy val pRetId = prods returning prods.map(_.id) def addTags(keywords: Seq[String]) = { for

拥有一段代码,用于添加/更新产品,并将一个或多个标记与之关联。标签实际上被添加到与产品关联的标签组中

我面临的问题是,只有addOrUpdateProductWithTags()的“部分”执行。更新或创建产品,但不添加标签。如果我对最后一个查询进行了注释(请参见注释),那么一切都正常。已打开“”以确认这一点

lazy val pRetId = prods returning prods.map(_.id)

def addTags(keywords: Seq[String]) = {
  for {
    k <- keywords
  } yield {
    tags.filter(_.keyword === k).take(1).result.headOption.flatMap {
      case Some(tag) => { 
        Logger.debug("Using existing tag: " + k)  
        DBIO.successful(tag.id)
      }
      case None => {
        Logger.debug("Adding new tag: " + k)
        tags.returning(tags.map(_.id)) += Tag(k, Some("DUMMY")) 
      }
    } 
  }   
}

def addOrUpdateProductWithTags(prod: Product, tagSet: Seq[String]): Future[Option[Long]] = {

  // handle add or update product
  val prodObject = prod.id match {
    case 0L => pRetId += prod
    case _ => prods.withFilter(_.id === prod.id).update(prod)
  }

  val action = for {
    pid <- prodObject
    tids <- DBIO.sequence(addTags(tagSet))
  } yield (tids, pid)

  val finalAction = action.flatMap {
    case (tids, pid) => {
      val prodId = if (prod.id > 0L) prod.id else pid.asInstanceOf[Number].longValue
      val delAction = tagGroups.filter(_.prodId === prodId).delete
      val tgAction = for {
        tid <- tids
      } yield {
        tagGroups += TagGroup("Ignored-XX", prodId, tid)
      }
      delAction.flatMap { x => DBIO.sequence(tgAction) }

      // IF LINE BELOW IS COMMENTED THEN TagGroup is created else even delete above doesn't happen
      prods.filter(_.id === prodId).map(_.id).result.headOption
    }
  }

  db.run(finalAction.transactionally)
}
你知道这个问题出了什么问题吗?
Stack:Scala 2.11.7,play version 2.5.4,play slick 2.0.0(slick 3.1)

终于想出了一个解决方案:

代替以下两行:

    delAction.flatMap { x => DBIO.sequence(tgAction) }
    prods.filter(_.id === prodId).map(_.id).result.headOption
我将与第四个操作员的操作组合如下:

    delAction >> DBIO.sequence(tgAction) >> prods.filter(_.id === prodId).map(_.id).result.headOption

现在执行整个序列。我仍然不知道原始解决方案出了什么问题,但这是可行的。

您是否尝试过打印执行的sql查询<代码>是的,如果最后一行存在,它不会显示删除和后续操作。您能显示
addTags
的内容吗?已编辑-还应添加此代码在某个时候为我工作,突然我看到此行为。不确定是什么原因导致了这种情况您想要执行的sql查询应该是finalAction的flatMap(即action)中的最后一行。flatMap{}最后一行将作为finalAction返回
    delAction >> DBIO.sequence(tgAction) >> prods.filter(_.id === prodId).map(_.id).result.headOption