Slick flatMap 不会将所有查询作为一个组执行
Slick flatMap does not execute all queries as a group
我发现 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 return 错误为:
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% 的情况下 return 结果(项目列表)。但是,有时列表是空的,即使我确定必须 return 一些数据)。所以,我认为 composedAction 不会每次都等待并作为一个组执行这两个查询。我该怎么做,因为我需要在第二个查询中查询第一个结果(在第二个中用作参数)
编辑:
另一种解决方案是等待第一个查询的结果并将其用作第二个查询的参数。不过好solution/practice?使用同步代码。
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)
我想在 slick 中使用 SQL 变量是有问题的,可能是多个数据库上下文。您可以使用 'map' 链接查询而不是等待结果。尝试这样的事情(未经测试)
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])
}
我发现 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 return 错误为:
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% 的情况下 return 结果(项目列表)。但是,有时列表是空的,即使我确定必须 return 一些数据)。所以,我认为 composedAction 不会每次都等待并作为一个组执行这两个查询。我该怎么做,因为我需要在第二个查询中查询第一个结果(在第二个中用作参数)
编辑: 另一种解决方案是等待第一个查询的结果并将其用作第二个查询的参数。不过好solution/practice?使用同步代码。
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)
我想在 slick 中使用 SQL 变量是有问题的,可能是多个数据库上下文。您可以使用 'map' 链接查询而不是等待结果。尝试这样的事情(未经测试)
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])
}