2015-10-16 76 views
1

Scala的play framework宣稱Anorm和編寫自己的SQL比ORM更好。其中一個原因是,無論如何,你總是希望只將數據庫和前端之間的數據傳輸爲json。然而,大多數教程,甚至是Play文檔都給出了將sql的返回值解析爲case類的例子,以便將其解析爲json。無論如何,我們仍然有一個對象關係映射,或者我錯過了一個觀點?Scala Anorm - 如何正確使用它

在我的數據庫中存在一個33列的表。聲明一個case類需要我33行,用〜運算符聲明一個解析器,再接受33個。使用case語句創建一個Object,另一個66!說真的,我做錯了什麼?有沒有捷徑?在Django中,同樣的事情只需要33行。

+2

你錯過ANORM與ORM之間的真正區別:ORM動態生成查詢,根據映射descriptors.With ANORM,你做的查詢,正如你所知道的最好的數據庫,它僅提供了方便快捷,效果分析。 – cchantep

回答

2

如果您在Play應用程序中使用Anorm,那麼映射到case類的Json對象(假設它有相當正常的apply和unapply函數,大多數情況下都是這樣定義的),應該非常簡單作爲定義的隱含它使用> 2.10宏觀基於JSON的方法開始......所以你真正需要的是這樣一個定義:

implicit val myCaseFormats = Json.format[MyCaseClass] 

其中「MyCaseClass」是你的案件類型的名稱。你甚至可以將它用於解析器組合器,用於從數據庫中反序列化行集......這將大大地清理代碼並減少必須編寫的代碼量。

看到這裏的Json的宏細節: https://www.playframework.com/documentation/2.1.1/ScalaJsonInception

我在一個相當大的代碼庫使用相當廣泛,它確實使事情挺乾淨的。

在你的解析器ANORM而言,記住,你不生產的情況下,類實例作爲一個分析的結果......你其實可以返回任何你喜歡的,這可能僅僅是一個您的列值的索引序列(如果您使用類似Shapeless的方法來允許混合類型列表等)或其他結構。

你做甲肝你的case類在ANORM宏支持,以及這樣的解析器可以是一個套這樣的:

import norm.{Macro, Rowset} 

val parser = Macro.namedParser[MyCaseClass] 

如果你想要做的事的習慣,(如解析直接向JsValue這樣),那麼你就可以靈活地手工製作更狡猾的解析器。

HTH

+0

哇,很好的回答,謝謝!然而,在我的數據庫中我有列號> 22的表,並且由於json宏在我的case類上使用apply + unapply函數,所以我不能使用該宏,也不能使用json play庫... – Hyster

+0

但是,兩個case類之間的列(如果有意義的話),利用宏來解析它們,然後使用〜或〜>將這兩個解析器組合成一個解析器,它返回一個元組(一對case A和case class B)甚至將它們嵌入到容器案例類中? –

+0

對於事物的JSON方面,您可以使用JSON轉換做一些事情 - 查看Play網站上的文檔 - 取決於您想要對結果數據結構執行的操作... –

相關問題