我有(工作)以下代码:
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的新手,所以如果我错过任何内容,请不要犹豫,请指出我的文档!
答案 0 :(得分:9)
<强> DBIO.sequence 强>
使用DBIO.sequence
将List[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.Sequence
将List[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