2015-12-02 36 views
2

在學習play-slick並設置最終保存到PostgreSQL的模型類時,我看到了這種模式(代碼如下)。有一個簡單的case類充當模型,然後是擴展處理關係映射的Table的東西。減少案例級模型的Slick定義中的樣板文件

case class Cat(name: String, color: String) 

/* Table mapping 
*/ 
class CatsTable(tag: Tag) extends Table[Cat](tag, "CAT") { 

    def name = column[String]("name", O.PrimaryKey) 
    def color = column[String]("color", O.NotNull) 

    def * = (name, color) <> (Cat.tupled, Cat.unapply _) 
} 

這令我在很多常見的情況是一堆不必要的樣板,但我只是學習,所以我不知道我在這裏失蹤。有沒有更簡單的方法來開始case class Cat,並最終有一個對象,我可以用來在數據庫中的CRUD實例的貓?例如。似乎沒有必要指定String類型的屬性最終應該是column[String],依此類推。在其他框架中,我可能不得不添加一個註釋或者某個東西來表明我想成爲主鍵,還是不能爲空,但是我不會寫一個單獨的映射。通過手寫這些映射,我主要是花費更多時間,並有機會以微妙的方式搞砸它,否則就是簡單的情況。

我最想要的是case class Cat開始,它灑魔術框架灰塵,並獲得了CatsTable合理的默認設置,我可以重寫/根據需要定製。

當我在此搜索文檔時,通常會返回schema code generation,但這似乎是倒退;我不想從現有的/填充的RDBMS生成表映射,我想從頭開始。

+1

位遲了,但另一個庫是'http:// getquill.io /',它需要比Slick更少的樣板,並且還提供了jdbc或真正的異步db調用選擇。截至2017年6月,感覺有點不太好 - 例如我目前使用Slick和Quill的組合,因爲我無法讓後者調用存儲過程。 – thund

回答

4

對於未來在這個問題上搜索,這裏就是我發現:

不能減少樣板,它在那裏。油滑有code generation功能,這是不完全相同的;有了這個如果你有一個SQL模式,它會爲你生成表映射。

現在,你可能會問,如果它可以自動生成你的表映射,爲什麼那麼你應該寫它們並保持它?看起來答案是可以在編譯時加載類型定義。當然,它們可以被生成,但是它們不會是「類型安全的」,因爲編譯器不會檢查你的代碼,而不用編譯時去實際的代碼。

所以這似乎取決於在這一層的類型安全的感知價值。如果你認爲這是必要的,那麼這個代碼不是樣板。如果你認爲在這個特定層面上的類型安全不是絕對必要的,那麼這真的是樣板。

這似乎歸結爲較大的FP假設,即類型安全總是很重要,對我來說這只是一個「純粹」論點的結尾。