Search code examples
scalaplayframeworkplayframework-2.0slickplay-slick

Scala/Slick plain SQL: retrieve result as a map


I have a simple method to retrieve a user from a db with Sclick plain SQL method:

object Data {

    implicit val getListStringResult = GetResult[List[String]] (
        prs => (1 to prs.numColumns).map(_ => prs.nextString).toList
    )

    def getUser(id: Int): Option[List[String]] = DB.withSession {
        sql"""SELECT * FROM "user" WHERE "id" = $id""".as[List[String]].firstOption
    }

}

The result is List[String] but I would like it to be something like Map[String, String] - column name and value pair map. Is this possible? If so, how?

My stack is Play Framework 2.2.1, Slick 1.0.1, Scala 2.10.3, Java 8 64bit


Solution

  • import scala.slick.jdbc.meta._
    val columns = MTable.getTables(None, None, None, None)
                        .list.filter(_.name.name == "USER") // <- upper case table name
                        .head.getColumns.list.map(_.column)
    val user = sql"""SELECT * FROM "user" WHERE "id" = $id""".as[List[String]].firstOption
                                                             .map( columns zip _ toMap )