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

Slick: combine actions with a Seq of DBIOAction

我有(有效的)以下代码:

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

loginInfoAction 是一个 DBIOAction。我想将 loginInfoActions 更改为 DBIOAction 的 Seq,然后对它们中的每一个执行相同的 DBUserLoginInfo 操作。

我愚蠢地尝试过这个:

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

但它没有按预期工作(我希望 loginInfoAction 会迭代 DBIOAction 的 Seq)。我是 Slick 的新手,所以如果我遗漏了任何内容,请随时指出我的文档!

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