2013-01-24 50 views
8

我將在Play 2.1(Scala)中實現一個只讀的Web應用程序。因爲我只會讀取和編組讀取到JSON的數據,所以我想避免使用其他任何DSL和映射。什麼SQL訪問層用於Play-Scala中的簡單閱讀?

我已經使用dapper-dot-net在.NET/C#中完成了類似的項目,並且對事情結果非常滿意。沒有大驚小怪,鍋爐板也不多。

我目前看:

  • anormanormtyped看起來非常有前途過,但可能是早期採用避免變量的手動映射到案例類構造函數的參數看起來真棒。)
  • prequel
  • slick - 因爲它應該是在2.1做SQL的主要方式和主要平原SQL API
+0

我可能應該更清楚地關注浮油,因爲它應該是在Play 2.1中執行SQL的首選方式。他們關於普通SQL類型的文檔顯示他們更喜歡其他兩種API。 –

回答

3

油滑非常好。確保你看看this short book - 它很好的解釋一些基礎知識。隨着文檔,它會讓你快速前進。另外請注意,github中的文檔更好 - 最新的文檔尚未發佈。

使用普通的sql選項得到很好的支持。儘管使用普通的sql查詢,但在類型檢查方面並不多。否則,使用Scala的2.10做一個簡單的查詢一樣簡單:

sql"select * from coffees where name = $name".as[Coffee] 

這甚至會保護你的SQL injction,爲$name實際上不是在查詢中。請參閱docs瞭解更多信息。

+0

請參閱我對原始問題的評論。你使用了簡單的SQL API還是其他的? –

+0

我現在看到。我開始喜歡Slick。我仍然必須編寫'GetResult'? –

0

我有一個GitHub項目,是由大量小巧玲瓏的啓發,被稱爲dbmapper

優勢,較油滑的是:

  • 沒有DSL - 你已經知道了良好的數據DSL,它被稱爲SQL
  • 完全異步
  • 很少的樣板代碼

下面是一個例子:

// Scala class that maps to the book table, with columns to match the class members 
case class Book(
    bookId: Int, 
    title: String, 
    retailPrice: BigDecimal, 
    publishDate: LocalDate) 

// mapping function from table row to Book class, 
// auto generated at compile time by Scala Macro 
implicit def rowToBook: RowData => Book = (r) => DbCodeGenerator.rowToClass[Book](r) 

// query returning future list of books, 
// safe query interpolation, the maxPrice is converted to a query argument 
val maxPrice = 11.99 
val allBooksFuture = DbAsync.exec[Book](q"select * from book where retail_price < $maxPrice")   

val oneBook: Future[Book] = DbAsync.execOne[Book](q"select * from book where book_id = 2") 

// returns Future[Option[]]  
val maybeOneBook: Future[Option[Book]] = DbAsync.execOneOrNone[Book](q"select * from book where book_id = -123") 

如果你知道從DOTNET世界短小精悍然後dbmapper會感到奇怪的熟悉!

+0

看起來很有希望!不幸的是,我們已經從Play/Scala轉移,因爲當時在Play中缺少對Windows生產的支持。 –