Can*_*ant 5 scala slick playframework-2.5
我有(工作)以下代码:
val actions = (for {
_ <- slickUsers.insertOrUpdate(dbUser)
loginInfo <- loginInfoAction
_ <- slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get)
} yield ()).transactionally
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作(虽然loginInfoAction会迭代DBIOAction的Seq).我是Slick的新手,如果我遗漏了任何东西,请不要犹豫,请指出我的文档!
pam*_*amu 12
DBIO.sequence
使用DBIO.sequence转换List[DBIO[_]]到DBIO[List[_]]和使用,理解.
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))
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)