gpt4 book ai didi

scala - Slick:将操作与 DBIOAction 的 Seq 组合起来

转载 作者:行者123 更新时间:2023-12-02 01:20:59 24 4
gpt4 key购买 nike

我有(工作)以下代码:

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.序列

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

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

关于scala - Slick:将操作与 DBIOAction 的 Seq 组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40758492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com