Как перенести простые 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]]
Можете ли вы просто вставить этапы настройки драйвера и БД, чтобы мы могли глубже изучить код, чтобы определить действительный шаг ошибки