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