2017-02-01 69 views
3

我使用Google搜索並找到了此線程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中刪除的行的總和。

另外,在運行時,它抱怨加入刪除查詢。

+0

我沒有看到有辦法的任何問題。它應該工作得很好..你在刪除記錄時是否面臨任何特定的問題? –

+0

已更新的問題 –

回答

6

我認爲你可以做到這樣也 -

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 
    })) 
    } 
+0

這是行不通的?我認爲你正在執行他們自己的交易中的每個行動。但是我們需要在一次交易中運行全部3個。 –

+0

它會工作,在這裏執行一個事務中的3個動作。 – Jet

1

以下內容將解決加入警告/錯誤。

val deleteB = TableB.filter(_.aid in TableA.filter(a => a.id === id).map(_.id)) 

val deleteC = TableC.filter(_.aid in TableA.filter(a => a.id === id).map(_.id)) 

val deleteA = TableA.filter(_.id === id) 

db.run((deleteB.delete andThen deleteC.delete andThen deleteA.delete).transactionally) 

而且,由於您使用andThen來鏈你的行動,該行動由總會回到上一個動作的行受影響算作陳述here。因此,返回的數字始終是從deleteA操作中刪除的行,因爲這是andThen鏈中的最後一項操作。

andThen

運行此 動作接連不斷的動作,如果成功完成,並返回 第二作用的結果。如果兩個操作中的任何一個失敗,則產生的 操作也會失敗。