为了理解而有条件地运行Slick语句

时间:2018-03-26 23:07:52

标签: scala slick slick-3.0

鉴于以下Slick代码:

   val doUpdate = true

   val table1 = TableQuery[Table1DB]
   val table2 = TableQuery[Table2DB]
   val table3 = TableQuery[Table3DB]

   val action = (for {
          _ <- table1.filter(_.id === id).update(table1Record)
          _ <- table2.filter(_.id === id).update(table2Record)
          _ <- table3.filter(_.id === id).update(table3Record)
     } yield ()).transactionally

如果变量doUpdate为true,我需要更新table2table3。这是我的尝试:

   val action = (for {
          _ <- table1.filter(_.id === id).update(table1Record)
          _ <- table2.filter(_.id === id).update(table2Record)
               if (doUpdate == true)
          _ <- table3.filter(_.id === id).update(table3Record)
               if (doUpdate == true)
     } yield ()).transactionally

这个编译,但是当我运行它时,我得到以下错误Action.withFilter failed。如何添加条件?

1 个答案:

答案 0 :(得分:5)

如果您注意到if内部使用了for,则会在下面调用withFilter。对于管道(DBIOFuture s,Task s),过滤归结为是否继续管道(幸福路径)或失败(生成{{1}或类似的。)

如果您想要更新,那么您可以使用Failure道路并恢复if。但是,它会让我们难看,因为根据你写Future的方式,它也可能会从你希望被告知的错误中恢复过来。

替代方法是简单地使用if-else来提供不同的case

DBIOAction

在你的情况下,它可能看起来像:

(for {
  _ <- {
    if (doUpdate) conditionalAction.map(_ => ())
    else DBIOAction.successful(())
  }
} yield ()).transactionally