Slick:将动作与DBIOAction的Seq结合起来

时间:2016-11-23 07:33:43

标签: scala slick playframework-2.5

我有(工作)以下代码:

val actions = (for {
  _ <- slickUsers.insertOrUpdate(dbUser)
  loginInfo <- loginInfoAction
  _ <- slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get)
} yield ()).transactionally

使用loginInfoAction作为DBIOAction。我想将loginInfoActions更改为Seq of DBIOAction,并为每个后续执行相同的DBUserLoginInfo操作。

我愚蠢地尝试了这个:

val actions = (for {
  _ <- slickUsers.insertOrUpdate(dbUser)
  loginInfoAction <- loginInfoActions
  loginInfo <- loginInfoAction
  _ <- slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get)
} yield ()).transactionally

但是它没有按预期工作(虽然loginInfoAction将遍历DBIOAction的Seq,但我会这样做)。我是Slick的新手,所以如果我错过任何内容,请不要犹豫,请指出我的文档!

1 个答案:

答案 0 :(得分:9)

<强> DBIO.sequence

使用DBIO.sequenceList[DBIO[_]]转换为DBIO[List[_]]并使用for-comprehension。

DBIO.sequence会将DBIO的序列转换为DBIO[Seq[_]]

例如,假设我们有一个函数getUser

def getUser(userId: Long): DBIO[User]

def getAllUsers(userIds: List[Long]): DB[List[User]] = {
  DBIO.sequence(userIds.map(getUser))
}

DBIO.SequenceList[DBIO[_]]转换为DBIO[List[_]]

现在您的代码变为

val actions = (for {
  _ <- slickUsers.insertOrUpdate(dbUser)
  loginInfoActionList <- DBIO.sequence(loginInfoActions)
  _ <- DBIO.sequence { loginInfoActionList.map { loginInfo =>
           slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get) }
      }
} yield ()).transactionally