miércoles, 1 de mayo de 2013

SLICK, accediendo a almacenes de datos con scala


Seguimos recorriendo el stack tecnológico de typesafe, y es hora de presentarles a Slick. Que es Slick? The Scala Language Integrated Connection Kit (Slick). Queda clarisimo, y para que sirve?  Bueno Slick sirve para conectarnos a bases de datos relacionales o NoSQL de forma fácil desde scala. Slick integra bases de datos en Scala, lo que permite almacenar, datos remotos consultados y procesados ​​de la misma manera que los datos en memoria.

Esto da la sensación de que trabajamos con colecciones, pero en realidad estamos trabajando con base de datos. Por lo tanto tenemos un mayor control de lo que sucede en la base de datos y no necesitamos escribir sql, sino que todo lo hacemos en scala.

Como Slick genera sql debe generarlo para una base en particular, es similar a lo que sucede en hibernate con los dialectos. Slick soporta actualmente las siguientes bases de datos:


  • DB/2
  • Derby/JavaDB
  • H2
  • HSQLDB/HyperSQL
  • Microsoft Access
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • PostgreSQL
  • SQLite
Debido Slick proporciona una capa frontal que integra las consultas de manera transparente utilizando tipos Scala ordinarias, las consultas pueden ser procesadas ​​y validadas en tiempo de compilación. Usando Slick, los programadores pueden escribir directamente las consultas de base de datos en Scala, beneficiándose de la comprobación estática, seguridad en tiempo de compilación y composicionalidad de Scala. Slick también permite escribir consultas SQL y ejecutarlas con un API optimizado para Scala en lugar de utilizar JDBC.

Veamos un pequeño ejemplo:

object Coffees extends Table[(String, Int, Double)]("COFFEES") {
    def name = column[String]("COF_NAME", O.PrimaryKey)
    def supID = column[Int]("SUP_ID")
    def price = column[Double]("PRICE")
    def * = name ~ supID ~ price
  }
 
  Coffees.insertAll(
    ("Colombian",         101, 7.99),
    ("Colombian_Decaf",   101, 8.99),
    ("French_Roast_Decaf", 49, 9.99)
  )
 
  val q = for {
    c <- Coffees if c.supID === 101
    //                       ^ comparing Rep[Int] to Rep[Int]!
  } yield (c.name, c.price)
 
  println(q.selectStatement)
 
  q.foreach { case (n, p) => println(n + ": " + p) }

Se ve genial!!

Dejo link: