Scala Slick如何将select查询转换为Json

时间:2016-02-03 19:46:06

标签: json scala playframework slick slick-3.0

我正在使用光滑的3.1.1并且我们无法弄清楚如何在Json中转换查询。我有这个简单的查询返回一个全名

def listfollowing() = Action {

    val setup = DBIO.seq(
      sql"""select p.fullname from profiles p join relations r on(p.id=r.following) where r.me=32;""".as[(String)]
    )
    val setupFuture = db.run(setup)


    Ok(Json.toJson(setupFuture.toString))


  }

简单地给出了这个结果

  

" scala.concurrent.impl.Promise$KeptPromise@6a3903"

任何建议都会很棒

这里有一些额外的信息:

import play.api.data.Form
import play.api.libs.json.{Json, JsValue}
import play.api.mvc.{Action, Controller}
import slick.dbio.DBIO
import slick.driver.PostgresDriver.api._
import play.api.data.Forms._
import scala.concurrent.ExecutionContext.Implicits.global

  val db= Database.forConfig("database")
  try {
    // ...
  } finally db.close

我连接到光滑如下

database {
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    databaseName = "mydbname"
    user = "user"
    password = "password"
  }
  numThreads = 10

}

1 个答案:

答案 0 :(得分:1)

在您的情况下,

setupFutureFuture,这意味着它(可能)将来会持有一个值。要获得Future的“内部”,您需要.map就可以了(如果您对前端世界更熟悉,则类似于Javascript Promise s / {{1 }})。当未来的值可用时,.then的正文将会运行。

这是一个将返回实际数据的实现:

map

特别注意def listfollowing() = Action.async { val setup = DBIO.seq( sql"""select p.fullname from profiles p join relations r on(p.id=r.following) where r.me=32;""".as[String] ) db.run(setup).map { result => Ok(Json.toJson(result.toString)) } }