Quelle couche d'accès SQL utiliser pour une lecture simple dans Play-Scala?

anorm dapper playframework-2.0 scala sql

Question

Je vais implémenter une application Web en lecture seule dans Play 2.1 (Scala). Comme je ne ferai que lire et marshaler les données lues au format JSON, je voudrais éviter d’autres DSL et mappages.

J'ai réalisé des projets similaires en .NET / C # en utilisant dapper-dot-net et j'étais très satisfait de la manière dont les choses se sont passées. Pas de chichi et pas beaucoup de plaque chauffante.

Je suis en train de regarder:

  • anorm ( anormtyped semble très prometteur aussi, mais il est probablement trop tôt pour l’adopter. Éviter le mappage manuel des variables avec les paramètres du constructeur de la classe de cas semble génial.)
  • prequel
  • slick - car il est censé être le principal moyen de SQL dans 2.1 et principalement l’API SQL simple

Réponse acceptée

Slick est très bon. Assurez-vous de consulter ce petit livre à ce sujet - il est très utile pour expliquer certaines bases. Avec les docs, cela vous ferait avancer rapidement. En outre, notez que les documents de github sont meilleurs - les derniers n'ont pas encore été publiés.

L'utilisation de l'option SQL simple est très bien prise en charge. Avec les requêtes SQL simples, vous ne faites pas grand chose en termes de vérification de type. Sinon, utiliser Scala 2.10 pour effectuer une requête simple est aussi simple que:

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

Cela vous protégera même de sql injction, car $name n'est pas réellement dans la requête. Consultez les documents pour plus d'informations.


Réponse populaire

J'ai un projet sur GitHub qui est massivement inspiré par Dapper, appelé dbmapper

Les avantages sur Slick sont:

  • pas de DSL - vous connaissez déjà une bonne DSL de données, elle s'appelle SQL
  • totalement asynchrone
  • très peu de code passe-partout

Voici un exemple:

// 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")

Si vous connaissez Dapper du monde dotnet, alors dbmapper se sentira étrangement familier!




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi