Проверьте, существует ли элемент в базе данных, используя Slick 3 и Play.

Я новичок в Scala, Slick и Play, но я пытаюсь сделать небольшую услугу, используя эту технологию. У меня проблема с правильным способом проверки наличия элемента в БД.

Воспроизвести действие — легко увидеть вывод в браузере:

val id = 5
val name = "xx"
def show(): Action async {
    dao.isExist(id,name).map(c => Ok(c.toString)
}

Дао

User = TableQuery[UserRow]
def isExist(id:Int, name:String) = {
val res = db.run(User.filter(i => (i.id === id || i.name === name)).result)}
// I would like to do something like 
if (res.length > 0) true else false 
// or since action is async to return future.
res match {
  case 0 => Future(true)
  case _ => Future(false)
}
// but this doesnt compile. I came up with
val trueRes = Await.result(res, Duratin.Inf)
// which in not async Action do what I want. 

Я думаю, что мне следует избегать использования Await, но в этом случае мне нужно выполнить какое-то действие в зависимости от того, что вернет БД. Не могли бы вы посоветовать, что было бы лучшим шаблоном для решения этого случая?


person leemonix    schedule 10.11.2015    source источник
comment
Ознакомьтесь с Essential Slick. Эта книга охватывает Slick 2 и 3. Я использовал ее, чтобы освоить Slick — хорошо написанные и надежные примеры.   -  person Kevin Meredith    schedule 10.11.2015
comment
Спасибо. Образец выглядит очень информативно и полезно   -  person leemonix    schedule 11.11.2015


Ответы (1)


Прежде всего: если вы хотите преобразовать результат асинхронной операции, вы должны использовать Future.map (или flatMap, если вы хотите вложить асинхронные операции) и вернуть контроллеру Future.

Кроме этого, весь ваш метод может быть реорганизован так:

def exists(id : Int, name : String) : Future[Boolean] = 
    db.run(User.filter(i => i.id === id || i.name === name).exists.result)

что должно переводиться во что-то вроде SELECT 1 ... WHERE EXISTS вместо COUNT(*) или, что еще хуже, в вашем конкретном случае это будет SELECT * с проверкой длины на стороне клиента.

person Patryk Ćwiek    schedule 10.11.2015