Slick flatMap не выполняет все запросы как группа - PullRequest
1 голос
/ 07 ноября 2019

Я считаю, что 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)

1 Ответ

0 голосов
/ 07 ноября 2019

Я предполагаю, что использование переменных SQL в slick проблематично, может иметь несколько контекстов в БД. Вы можете связать запросы с «картой», а не ждать результата. Попробуйте что-то вроде этого (не проверено)

   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])
   }
...