gpt4 book ai didi

scala - 从灵活查询中的多个表中删除行

转载 作者:行者123 更新时间:2023-12-01 10:03:37 36 4
gpt4 key购买 nike

我用谷歌搜索并找到了这个线程 Slick 3.0: Delete rows from multiple tables in a transaction但是解决方案说这不是一个好的解决方案。

我正在使用下面的代码从多个表中删除行

val deleteB = for {
aId <- TableA.filter(a => a.id === param).map(_.id)
bId <- TableB.filter(_.aId === aId)
} yield bId

val deleteC = for {
aId <- TableA.filter(a => a.id === param).map(_.id)
cId <- TableC.filter(_.aId === aId)
} yield cId

val deleteA = TableA.filter(a.Id === param)

val query = (deleteC.delete andThen deleteB.delete andThen deleteA.delete).transactionally
db.run(query)

但我想知道是否有更好的写法。

上述方法的问题是我想返回从 TableA 中删除的行数,而不是从子表 TableB 和 TableC 中删除的行的总和。

此外,在运行时它会提示在删除查询中有连接。

最佳答案

我想你也可以这样做-

 def buildTransactionQuery = {
for {
deleteA <- TableA.filter(a.Id === param)
deleteB <- TableB.filter(_.aId === deleteA.map(_.id))
deleteC <- TableC.filter(_.aId === deleteA.map(_.id))

deleteAAction = deleteA.delete
deleteBAction = deleteB.delete
deleteCAction = deleteC.delete
res = (deleteAAction, deleteBAction, deleteCAction)
} yield res
}

def executeTransactionQuery = {
val transactionQuery = for {
queries <- buildTransactionQuery
action = DBIOAction.seq(queries._3, queries._2, queries._1)
} yield action
transactionQuery.flatMap(action => db.run(action.transactionally).transform(s => true, t => {
logger.error(t.getMessage)
t
}))
}

关于scala - 从灵活查询中的多个表中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41991742/

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