2017-12-10 1 views
-1

저는 Slick에 처음 왔고, 저를 일으키는 몇 가지 문제로 어려움을 겪고 있습니다.Slick 결과를 찾지 못했습니다.

내 데이터베이스에 내 이메일 주소로 사용자를 저장했습니다. 그러나이 메서드를 실행할 때 (DAO에서 구현 됨) :

def getByEmail(email: String): Future[Option[User]] = { 

    println(s":${email}:") 
    println(db.run(users.filter(_.email === email).result.headOption).value) 

    db.run(users.filter(_.email === email).result.headOption) 
} 

출력 결과는 없음 (전자 메일이 존재 함을 확인할 수 있음)입니다.

slick.dbs.default.profile = "slick.jdbc.PostgresProfile$" 
slick.dbs.default.db.driver = "org.postgresql.Driver" 
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/databasename" 

전체 DAO는 다음과 같이 구현됩니다 :

내 application.conf 아래와 같이 설정되어 결과가 없음 존재하지 계속 왜 이해가 안

package dao 

import javax.inject.{Inject, Singleton} 

import models.User 
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider} 
import slick.jdbc.{JdbcProfile, PostgresProfile} 
import slick.lifted.ProvenShape 

import scala.concurrent.{ExecutionContext, Future} 

/** 
    * Created by Marin on 08/09/2017. 
    */ 
@Singleton 
class UserDAO @Inject()(val dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) extends HasDatabaseConfigProvider[PostgresProfile] { 

    import profile.api._ 

    private class UserTable(tag: Tag) extends Table[User](tag, "users") { 

     def id: Rep[Long] = column[Long]("id", O.PrimaryKey, O.AutoInc) 

     def email: Rep[String] = column[String]("email", O.Unique) 

     def name: Rep[String] = column[String]("name") 

     def surname: Rep[String] = column[String]("surname") 

     override def * : ProvenShape[User] = (id.?, email, name.?, surname.?) <> (User.tupled, User.unapply) 
    } 

    private val users = TableQuery[UserTable] 

    def add(user: User): Future[User] = { 

     val query = users returning users.map(_.id) into ((user, id) => user.copy(id = Some(id))) 

     db.run(query += user) 
    } 

    def get(id: Long): Future[Option[User]] = { 

     db.run(users.filter(_.id === id).result.headOption) 
    } 

    def getByEmail(email: String): Future[Option[User]] = { 

     println(s":${email}:") 
     println(db.run(users.filter(_.email === email).result.headOption).value) 

     db.run(users.filter(_.email === email).result.headOption) 
    } 

    def listAll: Future[Seq[User]] = { 

     db.run(users.result) 
    } 
} 

... 내가 ' 내 Play 컨트롤러의 일부 Future가 완료되지 않은 것을 알게되면서이 문제가 발생합니다 ...

답변

1

db.run(...)을 호출 한 결과는 Future입니다. the documentation of Future#value에 따르면 :

미래가 완료되지 않은 경우 None이됩니다.

결과에 액세스하는 방법은 db.run에 대한 호출이 반환되는 즉시 즉시 .value을 호출합니다. 이것은 Slick이 연결을 열고, 명령문을 실행하고, 결과를 반환 할 충분한 시간을주지 않는다. 따라서 None이 표시됩니다.

이것은 컨트롤러의 Future에 대한 의견이 분명하지 않음을 분명히합니다. 이 경우 .value으로 전화하면 항상 None이 반환됩니다.

+0

확인. 그러나 그 이유는 '.value'가없는 다른 미래 (줄 아래)가 결코 완료되지 않는다는 것을 설명하지 못합니다. – Marin

+0

말할 수 없습니다. 죄송합니다. 다른 쿼리가 작동합니까? –

+0

흠 ... 더 이상 작동하지 않는 것 같아요 ... 며칠 전 일한 것처럼 이상합니다 – Marin

관련 문제