¿Qué capa de acceso SQL usar para lectura simple en Play-Scala?

anorm dapper playframework-2.0 scala sql

Pregunta

Implementaré una aplicación web de solo lectura en Play 2.1 (Scala). Como solo leeré y ordenaré los datos leídos a JSON, me gustaría evitar cualquier otra DSL y mapeo.

He hecho proyectos similares en .NET / C # usando dapper-dot-net y estaba muy contento con la forma en que sucedieron las cosas. Sin problemas y sin mucho plato de caldera.

Actualmente estoy viendo:

  • anorm ( anormtyped parece muy prometedor también, pero es probablemente demasiado pronto para adoptar. Evitar la asignación manual de las variables para los parámetros de constructor de la clase de casos parece impresionante.)
  • precuela
  • slick - porque se supone que es la forma principal de hacer SQL en 2.1 y principalmente la API de SQL simple

Respuesta aceptada

Slick es muy bueno. Asegúrate de echarle un vistazo a este breve libro sobre esto; es muy bueno para explicar algunos conceptos básicos. Junto con los documentos, te haría avanzar rápidamente. Además, tenga en cuenta que los documentos en github son mejores, los últimos aún no se han publicado.

Usar la opción plain sql está muy bien soportado. Sin embargo, con consultas simples de sql, no hace mucho en términos de comprobación de tipos. De lo contrario, usar Scala 2.10 haciendo una consulta simple es tan fácil como:

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

Esto incluso lo protegerá de sql injction, ya que $name no está realmente en la consulta. Vea los documentos para más información.


Respuesta popular

Tengo un proyecto en GitHub que está enormemente inspirado por Dapper, llamado dbmapper

Las ventajas sobre Slick son:

  • sin DSL: ya conoce una buena DSL de datos, se llama SQL
  • totalmente asincrónico
  • muy poco código repetitivo

Aquí hay un ejemplo:

// 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 conoces a dapper del mundo dotnet, entonces dbmapper se sentirá extrañamente familiar!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué