2016-02-09 1 views
0

Я делаю простой запрос выбора к базе данных для системы входа. Я должен получить запись из базы данных, а затем сравнить пароли, но я борюсь за то, чтобы эта часть работала в основном на том, чтобы получить запрос выбора, чтобы вернуть то, что мне нужно. Это то, что у меня естьScala Slick Ошибка выполнения при выборе запроса

def example() = Action.async { 

    val myquery=sql"""SELECT password,id,email from profiles where [email protected]""".as[(String,Int,String)] 


    dbcall.run(myquery.map { Result => 

     Result.headOption match { 
     case d: (String, Int,String) => 
      if (BCrypt.checkpw("mypassword", d._1)) { 
      Ok("it worked") 
      } 
      else 
      Ok("No match") 

     case None => Ok("Empty") 
     } 
    } 

    } 

Этот код работает, но он не возвращается обратно в правильном формате, он дает мне ошибку, указав:

[MatchError: Некоторые из них (($ 2a $ 12 $ HoNBl1DBlH .X, 32, hetmam @ yahoo.com))

Уведомление выше, это правильные значения, которые я хочу, однако я хочу строго получить первый столбец: пароль, который я думал Я сделал здесь ...

BCrypt.checkpw("mypassword", d._1) 

Однако я просто продолжаю получать ошибку исключения совпадения на Result.headOption match, а не d._1 Предположим, что нужно указывать только значение столбца пароля?

ответ

2

Result.headOption возвращает Option[(String, Int, String)], но вы соответствуете по (String, Int, String). Вы могли бы попробовать что-то вроде этого, вместо:

Result.headOption match { 
    case Some((password, _, _)) => 
     if (BCrypt.checkpw("mypassword", password)) { 
     Ok("it worked") 
     } else { 
     Ok("No match") 
     } 

    case None => Ok("Empty") 
    } 
} 

В case Some((password, _, _)), мы называем первым членом кортежа password, и мы будем использовать подстановочные _ по существу игнорировать вторые и третьи член кортежа. Затем, с правой стороны, мы можем обратиться к password вместо d._1.

+0

Отличная благодарность за то, что просто реализовано, и оно работает – user1591668