【问题标题】:Play + scala + MySQL玩 + 斯卡拉 + MySQL
【发布时间】:2014-06-05 08:10:32
【问题描述】:

我开始使用 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 不起作用?

谢谢!

【问题讨论】:

  • LimbSoup 的答案绝对是要走的路,但您可能需要一个额外的 (),如 SQL("select ...")().map 中的那样才能使示例正常工作。
  • 谢谢!我会尝试:)
  • 这些回答是否回答了您的问题?如果是这样,您应该接受一个作为正确答案。

标签: mysql scala playframework playframework-2.2 anorm


【解决方案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)
    }
}

【讨论】:

    【解决方案2】:

    在教程中提到,

    在我们得到任何结果之前,我们必须创建一个查询。使用 Anorm,您可以调用 anorm.SQL 将您的查询作为字符串参数:

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

    您的代码中是否缺少此内容?

    【讨论】:

    • 是的,我用过:import anorm.SQL 和 import anorm.SqlQuery,但什么都没有:(
    • 你声明了sql查询吗?
    【解决方案3】:

    SqlQuery 被设为私有(等待 PR),因此不应直接使用它。可以以更安全的方式使用原地 SQL("...") 或 SQL"..." 函数​​。

    最好的

    【讨论】:

    • OP 并没有真正尝试直接使用SqlQuery。 SQL(..) 只返回该类型。
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2012-06-12
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2011-09-16
    • 2016-01-31
    • 2017-10-23
    相关资源
    最近更新 更多