我发现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)