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

问题描述 投票:1回答:1

我发现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)
mysql scala slick flatmap
1个回答
0
投票

我想在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])
   }
© www.soinside.com 2019 - 2024. All rights reserved.