Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用Anorm行分析器_Scala_Anorm - Fatal编程技术网

Scala 使用Anorm行分析器

Scala 使用Anorm行分析器,scala,anorm,Scala,Anorm,我已经使用Play framework 2.0大约6个月了,我一直想知道为什么他们使用这么多样板代码来解析我的SQL查询返回,如下所示: 案例类日记账\u accountDetailamount:双精度,状态:布尔值 val Journal\u AccountParser:RowParser[Journal\u accountDetail]={ 获得[双倍]金额~ 获取[布尔]状态映射{ 案例金额~states=>Journal\u accountDetailamount,states } }

我已经使用Play framework 2.0大约6个月了,我一直想知道为什么他们使用这么多样板代码来解析我的SQL查询返回,如下所示:

案例类日记账\u accountDetailamount:双精度,状态:布尔值 val Journal\u AccountParser:RowParser[Journal\u accountDetail]={ 获得[双倍]金额~ 获取[布尔]状态映射{ 案例金额~states=>Journal\u accountDetailamount,states } }
它是否能提高Play framework的性能???

解析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)
要构造用户,您需要解析具有多个联接的结果。我们没有一个大型解析器,而是为它的伴生对象中的每个类构造一个解析器:

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)
        }
    }
}
请注意,为了避免列名冲突,我是如何在解析器中使用完整的表空间的

总之,这看起来像是很多代码,但对于每个源文件来说,这只是一个很小的占用空间。最大的好处是我们的用户解析器非常干净,尽管它的结构很复杂。假设在用户中,地址实际上是选项[address]。然后,对该更改进行说明就像将用户解析器中的Address.parser更改为Address.parser?一样简单


对于解析简单查询,是的,它看起来确实像很多样板。但我非常感谢解析API在解析上面的示例和更复杂的示例时所提供的解析API。

解析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)
要构造用户,您需要解析具有多个联接的结果。我们没有一个大型解析器,而是为它的伴生对象中的每个类构造一个解析器:

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)
        }
    }
}
请注意,为了避免列名冲突,我是如何在解析器中使用完整的表空间的

总之,这看起来像是很多代码,但对于每个源文件来说,这只是一个很小的占用空间。最大的好处是我们的用户解析器非常干净,尽管它的结构很复杂。假设在用户中,地址实际上是选项[address]。然后,对该更改进行说明就像将用户解析器中的Address.parser更改为Address.parser?一样简单


对于解析简单查询,是的,它看起来确实像很多样板。但我非常感谢解析API在解析上述示例和更复杂的示例时提供的解析API。

anrom.SqlParser还提供了方便的解析函数,如.str、.int、.float、.double、。。。而不是.get[String]、.get[Int]、.get[Float]、.get[Double]。致以问候。

anrom.SqlParser还提供了方便的解析器函数,如.str、.int、.float、.double、。。。而不是.get[String]、.get[Int]、.get[Float]、.get[Double]。致以最良好的祝愿。

您能举一个使用较少样板文件的库/框架的例子吗?如果我没有弄错的话,Ruby on rails/yii不会使用类似的代码来获取或使用SQL查询结果。。正当我在这里还是个新手。一句话,为了类型安全。你能举一个使用较少样板文件的库/框架的例子吗?如果我没有弄错的话,Ruby on rails/yii不会使用这样的代码来获取或使用SQL查询结果。。正当我在这里还是个新手。一句话,为了类型安全。谢谢你的把戏。。但是,我更关心的是性能。。它只是为了更好的代码可读性吗?我在Play 2.0中读过一次关于JSON解析的文章,也有一些样板代码,但有人说它可以帮助在执行过程中更快地生成JSON。性能上不应该有任何明显的差异。类型安全性和可读性应放在首位。过早优化不是解决问题的办法。SQL查询比解析器更有可能导致性能问题。我已经使用Play一年多了,还没有出现由解析器引起的性能问题。我认为这很好。您能否给出一个使用连接的anorm查询的示例,该连接可以与您的用户解析器一起使用?谢谢您的技巧。。但是,我更关心的是性能。。它只是为了更好的代码可读性吗?我在Play 2.0中读过一次关于JSON解析的文章,也有一些样板代码,但有人说它可以帮助在执行过程中更快地生成JSON。性能上不应该有任何明显的差异。类型安全性和可读性应放在首位。过早优化不是解决问题的办法。SQL查询比解析器更有可能导致性能问题。我已经使用Play一年多了,还没有出现由解析器引起的性能问题。我认为这很好。您能否给出一个带有连接的anorm查询的示例,该连接可以与您的用户解析器一起使用?