22
What is Slick and why we use it? Mark van der Tol

What is Slick and why we use it? Mark van der Tol

Embed Size (px)

Citation preview

Page 1: What is Slick and why we use it? Mark van der Tol

What is Slick and why we use it?Mark van der Tol

Page 2: What is Slick and why we use it? Mark van der Tol

Why we moved to SQLMongoDB has• No joins or referential integrity• No transactions• Max element size for indexAdvantages PostgreSQL has• Better indexes• Better tooling• Strict schema

2

Page 3: What is Slick and why we use it? Mark van der Tol

Problem faced with MongoDBQuery unseen alerts for usersData:{ "message": "Example alert", "seenBy": [...]}Query:{ "seenBy": { "$ne": "user" }}Max element size for indexed elements: 1 KB

3

Page 4: What is Slick and why we use it? Mark van der Tol

Trivial in SQLSELECT messageFROM alertsWHERE id NOT IN ( SELECT messageId FROM views WHERE user = "user")

4

Page 5: What is Slick and why we use it? Mark van der Tol

MongoDB• We keep using Mongo for statistics data• Easier to shard/replicate• No schema enforcement

5

Page 6: What is Slick and why we use it? Mark van der Tol

What is Slick• Database query library for Scala

• Table mapping• Strongly typed• Collection like syntax

6

Page 7: What is Slick and why we use it? Mark van der Tol

Available for • DB2*• Derby/JavaDB• H2• HSQLDB/HyperSQL• Microsoft Access• Microsoft SQL Server• MySQL• Oracle*• PostgreSQL• SQLite*Requires subscription for production use

7

Page 8: What is Slick and why we use it? Mark van der Tol

Database connectionimport scala.slick.driver.PostgresDriver.simple._ import Database.threadLocalSession

Database.forURL("jdbc:postgresql://…", driver = "org.postgresql.Driver") withSession { //session is now implicitly available in thread-local storage}

Database.forURL("jdbc:postgresql://…", driver = "org.postgresql.Driver") withTransaction { //session is now implicitly available in thread-local storage}

8

Page 9: What is Slick and why we use it? Mark van der Tol

Table definition

object CoffeeTable extends Table[(String, BigDecimal, Int)]("COFFEE") {

def name = column[String]("NAME", O.PrimaryKey) def price = column[BigDecimal]("PRICE") def sales = column[Int]("SALES")

def * = name ~ price ~ sales} 9

Page 10: What is Slick and why we use it? Mark van der Tol

Simple SELECT queryval minPrice: BigDecimal = 1.0

val query = for { c <- CoffeeTable if (c.price >= minPrice)} yield (c.name)

val names = query.list10

Page 11: What is Slick and why we use it? Mark van der Tol

Table definition for Case classcase class Coffee (name: String, price: BigDecimal, sales: Int)

object CoffeeTable extends Table[Coffee]("coffee") {

def name = column[String]("NAME", O.PrimaryKey) def price = column[BigDecimal]("PRICE") def sales = column[Int]("SALES") def * = name ~ price ~ sales <> (Coffee, Coffee.unapply _)} 11

Page 12: What is Slick and why we use it? Mark van der Tol

Simple SELECT query

val query = for { c <- CoffeeTable} yield (c)

val coffees = query.list

12

Page 13: What is Slick and why we use it? Mark van der Tol

SELECT query with join

val query = for { p <- PersonTable c <- CoffeeTable if (p.favoriteCoffee === c.name)} yield (p.name, c.name, c.price)

13

Page 14: What is Slick and why we use it? Mark van der Tol

INSERT query

CoffeeTable.insert( Coffee("Java", 2.50, 0))

14

Page 15: What is Slick and why we use it? Mark van der Tol

UPDATE/DELETE queryval query = for { c <- CoffeeTable if (c.price < 1.50)} yield (c.price)

query.update(1.50)

query.delete15

Page 16: What is Slick and why we use it? Mark van der Tol

Plain SQL queries

val query = StaticQuery .query[BigDecimal, (String, Int)]( """select c.name, c.sales from coffees c where c.price < ?""")

16

Page 17: What is Slick and why we use it? Mark van der Tol

Features not shown

• Queries with parameters• Extensible: Add own types and functions• "Direct embedding"

17

Page 18: What is Slick and why we use it? Mark van der Tol

Features

• Query library that stays close to SQL• Hides dbms specific syntax• Prevents SQL-injections• Many checks compile time

18

Page 19: What is Slick and why we use it? Mark van der Tol

Disadvantages

• DSL not always intuitive• Difficult compile errors• Focus on single thread usage• Not very comprehensive documentation

19

Page 20: What is Slick and why we use it? Mark van der Tol

Multi-threaded use workaround val session = Database.forURL("jdbc:…", driver = “…").createSession()

session.conn.setAutoCommit(false)//prevent Slick from creating transactions itselfsession.asInstanceOf[BaseSession].inTransaction = true

session.conn.commit()session.close()

20

Page 21: What is Slick and why we use it? Mark van der Tol

Resources

• Slick:http://slick.typesafe.com/http://groups.google.com/group/scalaquery

• Sheets:http://www.plotprojects.com/

21

Page 22: What is Slick and why we use it? Mark van der Tol

THANK YOU 22