2017-12-10 25 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コントローラのいくつかの未来は決して完了していないことに気づいたので、この問題に遭遇しました...

答えて

1

db.run(...)への呼び出しの結果はFutureです。 the documentation of Future#valueによる:

将来が完了しなかった場合、戻り値はNoneになります。

結果にアクセスする方法は、db.runへの呼び出しが返されるとすぐに.valueを呼び出します。これは、接続を開いて文を実行し、結果を返すのに十分な時間をSlickに与えません。したがって、あなたはNoneを得ています。

コントローラのFutureについてのご意見は、これも明白です。この場合、.valueの呼び出しは常にNoneを返します。

+0

しかし、それは '.value'なしの他の未来(下の行)がなぜ完了しないのかを説明していません。 – Marin

+0

私には分かりません。ごめんなさい。他のクエリは機能しますか? –

+0

hm ... addntはもう動作しないようです...それは数日前に働いたので変です – Marin