gpt4 book ai didi

scala - 使用 Anorm RowParser

转载 作者:行者123 更新时间:2023-12-05 08:19:08 28 4
gpt4 key购买 nike

我已经使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com