Slick flatMap不能将所有查询作为一个组执行

我发现Scala Slick无法将多个查询作为纯SQL执行。

例如:

val query = sql"""
  SET @referenceTime = '12:00:00';
  SELECT * FROM table WHERE dateTime <= @referenceTime;
""".as[ClassResult]

dbConfig.db.run(query)

在此字符串中有2个查询,Slick返回错误为:

You have an error in your SQL syntax; check the manual .... to use near 'SELECT * FROM

据此,我了解到“ SELECT”之前的所有查询(也许是最后一个查询)都将被忽略。因此,我找到了使用flatMap的解决方案,但这并不是完美的方法。

val timeQuery = sql"""SET @referenceTime = '12:00:00';""".as[String]
val dataQuery = sql"""SELECT * FROM table WHERE dateTime <= @referenceTime;""".as[ClassResult]

val composedaction = for {
  timeRes <- timeQuery,dataRes <- dataQuery
} yield dataRes

dbConfig.db.run(composedaction)

这次运行,在99%的情况下返回结果(项目列表)。但是,有时列表为空,即使我确定必须返回一些数据也是如此。因此,我认为compositionaction不会每次都等待并同时执行两个查询。我该怎么做,因为我需要在第二个查询中获得第一个结果(在第二个中用作参数)

编辑: 另一种解决方案是等待第一个查询的结果,然后在第二个中将其用作参数。但这是一个好的解决方案/做法吗?使用同步代码。

   val timeQuery = sql"""SELECT '12:00:00';""".as[String]    
   var defaultTime: String = ""
   val tempResult = dbConfig.db.run(timeParameterQuery.head).map(res => defaultTime = res)
   Await.result(tempResult,Duration.Inf)

   val dataQuery = sql"""SELECT * FROM table WHERE dateTime <= $defaultTime;""".as[ClassResult]    
   dbConfig.db.run(dataQuery)
zjqgd 回答:Slick flatMap不能将所有查询作为一个组执行

我猜想在slick中使用SQL变量是有问题的,可能是多个数据库上下文。您可以将查询与“地图”链接在一起,而不必等待结果。试试这样的东西(未经测试)

   val timeQuery = sql"""SELECT '12:00:00';""".as[String]    
   dbConfig.db.run(timeQuery.head).flatMap{res => 
      dbConfig.db.run(sql"""SELECT * FROM table WHERE dateTime <= $res;""".as[ClassResult])
   }
本文链接:https://www.f2er.com/3144824.html

大家都在问