gpt4 book ai didi

scala - Slick 3 - 在一个事务中调用多个 db.run()

转载 作者:行者123 更新时间:2023-12-01 05:02:50 25 4
gpt4 key购买 nike

我有带有 byId 的模型存储库类并保存方法

def byID(id:Long) = db.run{ query.filter(_.id === id).result }.map(_.headOption)
def save(model:User) = db.run{ query.filter(_.id===model.id).update(model) }

现在我想同时使用这两种方法,首先加载用户,然后更改某些内容,然后保存用户,就像这样
userRepository.byID(5L).map{_.map{user =>
val newuser = user.copy(name = "John")
userRepository.save(newuser)
}}

我怎样才能在一笔交易中做到这一点?

最佳答案

我认为 slick 3 不支持跨越不同 future 以及当您调用 db.run 时的交易。您正在传递 DBIO[SomeType]进入并获得 Future出去。好消息是,您可以改用 DBIO 以稍微不同的方式构建 API:

def byID(id:Long) = query.filter(_.id === id).result }.map(_.headOption)
def save(model:User) = query.filter(_.id===model.id).update(model)

进而:
db.run(userRepository.byID(5L).flatMap { users => 
DBIO.sequence(users.map { user =>
userRepository.save(user.copy(name = "John"))
})
}.transactionally)

关于scala - Slick 3 - 在一个事务中调用多个 db.run(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438049/

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