如何在 Slick 3.x 中获取?

How to fetch in Slick 3.x?

我有以下代码,它可以正常连接到数据库,但是我不知道如何打印每一行(相当于 JDBC 中的 rs.next):

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]
    // fetch each user and print it
    println("user : " + ??? )

} finally db.close

任何帮助将不胜感激,对于新手问题深表歉意。

请检查documentation。我也是 scala 和 slick 的新手。希望对您有所帮助。

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]

    // fetch each user and print it
    // You need to import database driver...
    // import slick.driver.MySQLDriver.api._

    val usersListQueryResult = db.run(users.result) //it returns, Future[R]

    // Now you can use blocking or non blocking call
    val userList = Await.result(usersListQueryResult, Duration("60 seconds")) //Blocking
    // OR 
    usersListQueryResult.foreach(println) //NonBlocking
} finally db.close

您也可以尝试以下方法

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]

    val printingAction:DBIO[Unit] =
      for{seqUsers <- users.result}  // DBIO[Seq[User]]
        for{ user <- seqUsers}       // simple executable code, :Unit 
          println("user : " + user )

    val future = db.run(printingAction)
    Await.result(future, 60.seconds) // need to wait before close db    
} finally db.close

(与@Shakil 的回答非常相似)

Slick 中还有一个选项:http://slick.typesafe.com/doc/3.1.0/dbio.html#streaming

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]    
    val p: DatabasePublisher[User] = db.stream(users.result)
    p.foreach { user  => println("user : " + user ) }
} finally db.close

这对我有用。重要的考虑是结果集 returns 一个 "Future",这意味着响应是异步的(与 Java 中的同步相反):

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]
    val action = users.result
    val future = db.run(action)

    future onComplete {
      case Success(u) => u.foreach { user  => println("user : " + user ) }
      case Failure(t) => println("An error has occured: " + t.getMessage)
    }

} finally db.close