+ All Categories
Home > Documents > What is Slick and why we use it? Mark van der Tol.

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

Date post: 24-Dec-2015
Category:
Upload: jacob-perkins
View: 214 times
Download: 0 times
Share this document with a friend
22
What is Slick and why we use it? Mark van der Tol
Transcript
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


Recommended