Я считаю, что 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% случаев возвращает результат (список элементов). Но, иногда список пуст, даже если я уверен, что должен вернуть некоторые данные). Итак, я думаю, что compented не ждет и не выполняет оба запроса в виде группы каждый раз. Как я могу это сделать, потому что мне нужно во втором запросе результат первого (используется как параметр во втором)
edit: другое решение - дождаться результата первого запроса и использовать его в качестве параметрав секунду. Но это хорошее решение / практика? Использование кода синхронизации.
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)