2016-12-28 44 views
1

我試圖使用Slick(3.0.2)在我的項目中使用scala操作數據庫。 這裏是我的代碼如何從浮動查詢結果中獲取值

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

val f = db.run(query.result) 

部分如何從「F」讀取數據 我曾嘗試谷歌的解決方案很多次,但沒有回答能解決了我的迷惑 非常感謝

回答

2

query.result的類型是DBIO。當你撥打db.run時,它會變成Future

如果你要打印的數據,使用

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

要繼續使用數據,使用f.map { case (username, password, role, delFlg) ⇒ ... }

如果你想阻止於未來,得到的結果(如果你玩各地REPL爲例),考慮使用類似

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

熊,這是不是你想要的產品代碼做 - 阻塞期貨是一種不好的做法。

我通常建議特別學習Scala核心類型和期貨。當您致電db.run時,光滑的「責任」結束。

+0

對不起,我還是要問你一些問題 – LeoAshin

+0

對不起,我仍然不是很清楚,我 自己的方式f.map {情況下(用戶名,密碼,角色,delFlg)⇒...} 但它使試圖編譯錯誤,你能給我多一點示例代碼嗎? 例如,我想判斷是否delFlg == 1,然後執行下一步 – LeoAshin

+0

用您的條件替換'...'。 –

2

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和查詢的結果將是其他的東西異步打印在控制檯上。

但是,大多數情況下您希望將該值用於其他操作,也許是另一個數據庫查詢。在這種情況下,最簡單的方法是使用來理解。像下面這樣:

for (r <- f) yield db.run(q(r)) 

其中q是一個函數/方法,將您的第一個查詢的結果,建立一個又一個。當然,這個理解的結果也是未來

需要注意的一件事是,如果您在運行完所有代碼後執行退出的程序中運行此程序,則需要使用Await(請參閱Scala API)以防止程序退出而你的一個db查詢仍然有效。

相關問題