Как перенести простые SQL-запросы Slick 2.1 на Slick 3.0

Следующий рабочий код из Slick 2.1 возвращает одно целое число (которое в этом примере является результатом запуска функции с именем "foobar"):

def getFoobar(): Int = DB.withSession {
   val query = Q.queryNA[Int]("select foobar()")
   query.first
}

Как бы один порт это на Slick 3.0? Согласно документации Slick 3.0, запрос должен быть преобразован в DBIOAction. Вот что я попробовал:

import driver.api._

...

def getFoobar(): Future[Int] = {
   val query = sql"select foobar()".as[Int]
   db.run(query) 
}

но это приводит к следующей ошибке компиляции:

[error]  found   : slick.profile.SqlStreamingAction[Vector[Int],Int,slick.dbio.Effect]#ResultAction    [Int,slick.dbio.NoStream,slick.dbio.Effect]
[error]  required: MyDAO.this.driver.api.DBIO[Seq[Int]]

Похоже, что SQL-интерполятор дает SqlStreamingAction а не DBIO, как db.run ожидает.

Как правильно написать это в новом Slick 3 API?

1 ответ

Я использовал что-то подобное, и это сработало для меня

import slick.driver.MySQLDriver.api._

def get(id : String) : Future[Channel] = {
implicit val getChannelResult = GetResult(r => Channel(r.<<, r.<<, r.<<, r.<<, r.<<))
val query = sql"select * from Channel where id = $id".as[Channel]
db.run(myq.headOption)
}

Команда db.run(DBIOAction[T,NoStream,Nothing]) будет принимать все типы действий, таких как sqlstreamingaction, StreamingDriverAction, DriverAction и т. Д.

Я думаю, что проблема заключается в конфигурации драйвера или БД. Итак, ошибка

[error]  required: MyDAO.this.driver.api.DBIO[Seq[Int]]

Можете ли вы просто вставить этапы настройки драйвера и БД, чтобы мы могли глубже изучить код, чтобы определить действительный шаг ошибки

Другие вопросы по тегам