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

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)

  • 我忘了回来说,但效果很好。再次感谢! (2认同)
  • 仍与Slick 3.3.0相关,保存了我的白天(或夜晚)+1 (2认同)