2016-12-28 20 views
1

Slick(3.0.2)を使用して、自分のプロジェクトでスカラーを使ってデータベースを操作しようとしました。 は、ここで私は私が解決策何回Googleを試してみましたが、何の答えは私の混乱を解決することはできません 「F」から どうもありがとうクエリ結果の値を滑らかに取得する方法

答えて

2

query.resultのタイプはDBIOです。 db.runに電話すると、Futureに変わります。

あなたがデータを印刷したい場合は、あなたがプレーしている場合(、データでの作業を続行しますが、将来にブロックする場合はf.map { case (username, password, role, delFlg) ⇒ ... }

を使用して結果を取得するには

import scala.concurrent.ExecutionContext.Implicits.global 
f.foreach(println) 

を使用先物にブロッキングが悪い習慣である - 例えば約REPL)で、これは本番コードで何をしたいのかではなく、心の中で

import scala.concurrent.Await 
import scala.concurrent.duration._ 
Await.result(f, 1.second) 

クマのようなものを使用します。

一般的に、Scalaのコアタイプと先物について具体的に学習することをお勧めします。 db.runに電話するとスリックな「責任」が終了します。私はまだ非常に明確に、 は、私はそれが作るあなたの方法のf.map {場合(ユーザ名、パスワード、役割、delFlg)⇒...} では試していないため、私はまだあなたにいくつか質問をしたいため

+0

ごめん – LeoAshin

+0

ごめんコンパイルエラー、もう少しサンプルコードを教えていただけますか? たとえば、delFlg == 1であるかどうかを判断したい場合は、次のステップを実行してください。 – LeoAshin

+0

'...'をあなたの状態に置き換えてください。 –

2

をデータを読み取ることができますどのようにコード

val query = table.filter(_.username === "LeoAshin").map { user => (user.username, user.password, user.role, user.delFlg) } 

val f = db.run(query.result) 

の私の一部であり、 f将来のであり、必要な緊急度に応じて値を取得するためにできることがいくつかあります。待っている間に何もできることがなければ、それが完了するのを待ってから値を取得するだけです。おそらく、最も簡単には、次の行(Slick documentationから)に沿っている:

val q = for (c <- coffees) yield c.name 
val a = q.result 
val f: Future[Seq[String]] = db.run(a) 
f.onSuccess { case s => println(s"Result: $s") } 

あなたはその後、Fの結果に依存しないと、クエリの結果がされる他の事をする上で行くことができます非同期にコンソールに表示されます。

しかし、ほとんどの場合、他の操作(おそらく別のデータベースクエリ)の値を使用することをお勧めします。その場合、最も簡単なことは、理解のためにを使用することです。以下のような何か:

Qはあなたの最初のクエリの結果を取得し、別のものを構築する関数/メソッドである
for (r <- f) yield db.run(q(r)) 

。これについての理解度はFutureとなります。

注意しなければならないことは、すべてのコードが実行された後で終了するプログラムでこれを実行する場合、プログラムが終了するのを防ぐためにAwait(Scala APIを参照)を使用する必要がありますあなたのdbクエリの1つはまだ動作しています。

関連する問題