Scala Anorm - 如何正确使用它
Scala Anorm - how use it properly
Scala 的播放框架声称 Anorm,并且编写您自己的 SQL 比 ORM 的更好。原因之一是无论如何您通常只希望在数据库和前端之间以 json 的形式传输数据。然而,大多数教程,甚至 Play 文档都给出了将 sql 的返回值解析为 case classes 的示例,以便再次将其解析为 json。无论如何,我们仍然有一个对象关系映射,还是我漏掉了一点?
在我的数据库中存在一个包含 33 列的 table。声明一个 case class 需要 33 行,使用 ~ 运算符声明一个解析器需要另外 33 行。使用 case 语句创建一个对象,另外 66 行!说真的,我做错了什么?有捷径吗?在 Django 中,同样的事情只需要 33 行。
如果您在 Play 应用程序中使用 Anorm,则映射到您案例的 Json 对象 class(假设它具有为其定义的相当正常的 apply 和 unapply 函数,这大多数都这样做)应该像定义一个使用基于 >2.10 宏的 Json-inception 方法的隐式一样简单......所以你真正需要的是这样的定义:
implicit val myCaseFormats = Json.format[MyCaseClass]
其中 'MyCaseClass' 是您的案例类型的名称。您甚至可以将其烘焙到用于从数据库反序列化行集的解析器组合器中……这将显着清理您的代码并减少您必须编写的代码量。
有关 Json 宏的详细信息,请参见此处:
https://www.playframework.com/documentation/2.1.1/ScalaJsonInception
我在相当大的代码库中广泛使用它,它确实使事情变得非常干净。
就您的 Anorm 解析器而言,请记住您 没有 生成 case-class 实例作为解析的结果...你实际上可以 return 任何你喜欢的东西,它可以只是你的列值的索引序列(如果你使用类似 Shapeless 的东西来允许混合类型列表等......)或其他一些结构。
你在 Anorm 中也有宏支持,所以你的案例的解析器 classes 可以是这样的一个衬里:
import norm.{Macro, Rowset}
val parser = Macro.namedParser[MyCaseClass]
如果您想做一些自定义的事情(例如直接解析为 JsValue),那么您可以灵活地手工制作一个更巧妙的解析器。
HTH
Scala 的播放框架声称 Anorm,并且编写您自己的 SQL 比 ORM 的更好。原因之一是无论如何您通常只希望在数据库和前端之间以 json 的形式传输数据。然而,大多数教程,甚至 Play 文档都给出了将 sql 的返回值解析为 case classes 的示例,以便再次将其解析为 json。无论如何,我们仍然有一个对象关系映射,还是我漏掉了一点?
在我的数据库中存在一个包含 33 列的 table。声明一个 case class 需要 33 行,使用 ~ 运算符声明一个解析器需要另外 33 行。使用 case 语句创建一个对象,另外 66 行!说真的,我做错了什么?有捷径吗?在 Django 中,同样的事情只需要 33 行。
如果您在 Play 应用程序中使用 Anorm,则映射到您案例的 Json 对象 class(假设它具有为其定义的相当正常的 apply 和 unapply 函数,这大多数都这样做)应该像定义一个使用基于 >2.10 宏的 Json-inception 方法的隐式一样简单......所以你真正需要的是这样的定义:
implicit val myCaseFormats = Json.format[MyCaseClass]
其中 'MyCaseClass' 是您的案例类型的名称。您甚至可以将其烘焙到用于从数据库反序列化行集的解析器组合器中……这将显着清理您的代码并减少您必须编写的代码量。
有关 Json 宏的详细信息,请参见此处: https://www.playframework.com/documentation/2.1.1/ScalaJsonInception
我在相当大的代码库中广泛使用它,它确实使事情变得非常干净。
就您的 Anorm 解析器而言,请记住您 没有 生成 case-class 实例作为解析的结果...你实际上可以 return 任何你喜欢的东西,它可以只是你的列值的索引序列(如果你使用类似 Shapeless 的东西来允许混合类型列表等......)或其他一些结构。
你在 Anorm 中也有宏支持,所以你的案例的解析器 classes 可以是这样的一个衬里:
import norm.{Macro, Rowset}
val parser = Macro.namedParser[MyCaseClass]
如果您想做一些自定义的事情(例如直接解析为 JsValue),那么您可以灵活地手工制作一个更巧妙的解析器。
HTH