- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Play framework 2.0 大约 6 个月了,我一直想知道为什么他们使用这么多样板代码来解析我的 SQL 查询返回,如下所示:
case class Journal_accountDetail(amount: Double, states: Boolean)
val Journal_AccountParser: RowParser[Journal_accountDetail] = {
get[Double] ("amount") ~
get[Boolean] ("states") map({
case amount~states => Journal_accountDetail(amount,states)
})
}
它能提高 Play 框架的性能吗??
最佳答案
解析 API 起初看起来有点乏味,但当您开始组合和重新使用解析器时它会非常强大,并且远比返回 SQL 的每个函数中的模式匹配更不丑陋结果。
想象一下这样的事情:
case class User(id: Int, name: String, address: Address)
case class Address(id: Int, street: String, city: String, state: State, country: Country)
case class State(id: Int, abbrev: String, name: String)
case class Country(id: Int, code: String, name: String)
要构建 User
,您需要使用多个 JOIN
解析结果。我们没有一个大型解析器,而是为它的伴随对象中的每个类构造一个解析器:
object User {
val parser: RowParser[User] = {
get[Int]("users.id") ~
get[String]("users.name") ~
Address.parser map {
case id~name~address => User(id, name, address)
}
}
}
object Address {
val parser: RowParser[Address] = {
get[Int]("address.id") ~
get[String]("address.street) ~
get[String]("address.city") ~
State.parser ~
Country.parser map {
case id~street~city~state~country => Address(id, street, city, state, country)
}
}
}
object State {
val parser: RowParser[State] = {
get[Int]("states.id") ~
get[String]("states.abbrev") ~
get[String]("states.name") map {
case id~abbrev~name => State(id, abbrev, name)
}
}
}
object Country {
val parser: RowParser[Country] = {
get[Int]("countries.id") ~
get[String]("countries.code") ~
get[String]("countries.name") map {
case id~code~name => Country(id, code, name)
}
}
}
请注意我是如何在解析器中使用整个表空间的,以避免列名冲突。
总的来说,这看起来像很多代码,但对于每个源文件来说,它只占很小的空间。最大的好处是我们的 User
解析器非常干净,尽管它的结构很复杂。假设在 User
中,address
实际上是 Option[Address]
。然后,考虑该更改就像将 User
解析器中的 Address.parser
更改为 (Address.parser ?)
一样简单。
对于解析简单的查询,是的,它看起来确实像很多样板文件。但在解析上述示例(以及更复杂的示例)时,我非常感谢解析 API。
关于scala - 使用 Anorm RowParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24384169/
object Users { implicit object UserReads extends Reads[User] { def reads(json: JsValue) = JsS
解决方案:我不知道如何返回 Option[User] 的不存在,所以在没有找到用户的情况下,我创建了一个虚拟用户对象并从 Controller 对其进行推理(感觉很糟糕但有效。 ..):来自 Appl
在 Play 框架 2.0 中,我试图使用这样的行解析器从 PostgreSQL 加载一个真正的(即单精度浮点数)类型的列: case class Foo(bar: Float) object Foo
我想在 Scala 中将数据从 SQL server 复制到 vertica,我正在考虑使用 Anorm,但我没有找到任何关于批量插入的文档。如果 Anorm 不支持批量插入,我应该使用什么库? 最佳
我已经使用 Play framework 2.0 大约 6 个月了,我一直想知道为什么他们使用这么多样板代码来解析我的 SQL 查询返回,如下所示: case class Journal_accoun
当我尝试运行时(来自 Play Framework): import play.api.db.DB import anorm._ import org.joda.time.DateTime impor
在 yabe 示例中,有以下查询: def allWithAuthor:List[(Post,User)] = SQL( """
我刚刚开始使用 Anorm 和解析器组合器。似乎有很多样板代码。例如,我有 case class Model( id:Int, field1:String, field2:In
我正在使用游戏!框架与 Anorm 一起访问数据库。我经常看到像下面这样的例子,对象成员被直接注入(inject)到 SQL 语句中。 我的问题是,这些输入是否经过 sanitizer ?大多数示例如
考虑像这样的存储库/DAO 方法,效果很好: def countReports(customerId: Long, createdSince: ZonedDateTime) = DB.withCo
首先,我是 Play 2 Scala 的新手。我正在尝试将我的模型对象与 JSON 进行转换。 根据此博客 http://mandubian.com/2012/10/01/unveiling-play
我发现这个答案可以解决一个字段 -> Inserting multiple values into table with anorm var fields: List[String] = Nil
更新查询返回1,但插入查询返回None。 def que3(params) { DB.withConnection { implicit c => val i=SQL("UPDATE QUE
我正在尝试使用 Anorm(在 play framework 2.3.1 中)对 MySQL 数据库表进行批量插入。我正在构建的应用程序除了需要批量数据插入外,还有一个标准的 Web 前端,我想尝试将
当有记录匹配 WHERE 子句时,这段代码工作正常: val pinfo = SQL("SELECT * FROM tableName WHERE id={id}").on("id" -> "scal
我不想删除并重新插入每一行,所以我使用以下方法尝试将多行与异常一起使用: SQL(""" delete from PERSON_ROLES WHERE
是否可以在 Anorm 中使用带有字符串插值的 LIKE 子句? // e.g. this doesn't work SQL"SELECT * FROM users WHERE last_name L
我有一个可以为空列的表,当查询空列时,它抛出了错误 val row: List[(String,String)] = SQL("select top 10 Spare_Part part,Prici
使用 findBy 如下所示,我可以通过 key 和 value 在 Authentications 表中搜索记录 def findBy(key: String, value: String): An
你如何在 Scala 的游戏之外使用 Anorm?在用于 Play 的 Anorm 文档中,它只是使用以下内容: DB.withConnection { implicit c => val res
我是一名优秀的程序员,十分优秀!