Slick:将动作与 DIOAction 的 Seq 组合 [英] Slick: combine actions with a Seq of DBIOAction

查看:94
本文介绍了Slick:将动作与 DIOAction 的 Seq 组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有(工作)以下代码:

I have the (working) following code:

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

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

with loginInfoAction being a DBIOAction. I would like to change loginInfoActions to a Seq of DBIOAction and for each of them, execute the same DBUserLoginInfo action afterwards.

我愚蠢地尝试了这个:

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

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

But it does not work as expected (I would have though loginInfoAction would iterate over the Seq of DBIOAction). I am a newbie in Slick so do not hesitate to point me to the documentation if I missed anything !

推荐答案

DBIO.sequence

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

Use DBIO.sequence to convert List[DBIO[_]] to DBIO[List[_]] and use for-comprehension.

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

DBIO.sequence will convert the sequence of DBIO's into DBIO[Seq[_]].

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

For example let say we have a function 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

这篇关于Slick:将动作与 DIOAction 的 Seq 组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆