玩+ scala + MySQL

时间:2014-06-05 08:10:32

标签: mysql scala playframework playframework-2.2 anorm

我开始使用Play 2.2.1和Scala 2.10.2开发。我正在开发一个CRUD应用程序。我跟随了书中的一个例子" Play for Scala:Covers 2",但我有一个问题。

在这本书中,模型中有这个代码

import play.api.Play.current
import play.api.db.DB

def getAll: List[Product] = DB.withConnection { implicit connection =>
sql().map
  ( row =>
      Product(row[Long]("id"), row[Long]("ean"), row[String]("name"), row[String]("description"))
  ).toList
}

但是当我尝试运行它时,我收到了这个错误:

    value map is not a member of anorm.SqlQuery

为什么不运行.map?

谢谢!

3 个答案:

答案 0 :(得分:1)

SqlQuery没有map功能。我不确定这本书中的例子应该如何看,但如果它使用那种笨重的语法来表示我,我会有点担心。我认为应该始终优先使用与函数本身分开定义的结果集解析器 - 因为您将能够在其他地方重用它们。

import anorm._
import anorm.SqlParser._
import play.api.Play.current
import play.api.db.DB

case class Product(id: Long, ean: Long, name: String, description: String)

object Product {

    /** Describes how to transform a result row to a `Product`. */
    val parser: RowParser[Product] = {
        get[Long]("products.id") ~ 
        get[Long]("products.ean") ~ 
        get[String]("products.name") ~ 
        get[String]("products.description") map {
            case id ~ ean ~ name ~ description => Product(id, ean, name, description)
    }

    def getAll: List[Product] = {
        DB.withConnection { implicit connection =>
            SQL("SELECT * FROM products").as(parser *)
        }
    }
}

我假设您的表名为products。最好在解析器中使用完整列名称(products.id而不是id),就好像以后需要组合解析器(使用连接结果),然后anorm不会因使用多个表而混淆类似于id的列名。 getAll函数现在看起来更清晰,我们可以将解析器重用于其他函数:

def getById(id: Long): Option[Product] = {
    DB.withConnection{ implicit connection =>
        SQL("SELECT * FROM products WHERE id = {id}")
            .on("id" -> id)
            .as(parser.singleOpt)
    }
}

答案 1 :(得分:0)

在教程中提到了

在我们获得任何结果之前,我们必须创建一个查询。有了Anorm,你打电话 anorm.SQL将您的查询作为字符串参数

import anorm.SQL
import anorm.SqlQuery
val sql: SqlQuery = SQL("select * from products order by name asc")

您的代码中是否遗漏了这些内容?

答案 2 :(得分:0)

SqlQuery正在变为私有(待定PR),所以不应该直接使用它。就地SQL(" ...")或SQL" ..."可以以更安全的方式使用函数。

最佳