On Github oschrenk / slick-presentation
Created by Oliver Schrenk / @oschrenk
scalaVersion := "2.10.0" libraryDependencies ++= List( "com.typesafe.slick" %% "slick" % "1.0.0", "org.slf4j" % "slf4j-nop" % "1.6.4", "mysql" % "mysql-connector-java" % "5.1.25" )
import scala.slick.session.Database._ import scala.slick.driver.MySQLDriver.simple._
Database.forURL(
"jdbc:mysql://host:3306/elmar",
driver = "com.mysql.jdbc.Driver"
) withSession {...}
val ds = new MysqlDataSource
ds.setUrl("jdbc:mysql://host:3306/elmar")
ds.setUser("...")
ds.setPassword( "...")
Database.forDataSource(ds)
Data Definition
(Q.updateNA + "insert into companies values(101, 'Acme, Inc.'").execute
Queries
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import Q.interpolation
case class AvailabilityRecord(
brand: String, city: String, dateOfQuery: Timestamp
)
implicit val getAvailabilityRecordResult =
GetResult(r => AvailabilityRecord(
r.nextString, // r.<<
r.nextString, // r.<<
r.nextTimestamp()) // r.<<
)
val myBrand = "OA"
val q =
sql"select brand, city, dateOfQuery
from availabilitylog
where brand = $myBrand limit 10".as[AvailabilityRecord]
println(q.list())
Table with default projection
object AvailabilityRecords
extends Table[(String, String, Timestamp)]
("availabilitylog") {
def brand = column[String]("brand")
def city = column[String]("city")
def dateOfQuery = column[Timestamp]("dateOfQuery")
def * = brand ~ city ~ dateOfQuery
}
Table with mapped projection
case class AvailabilityRecord(
brand: String, city: String, dateOfQuery: Timestamp
)
object AvailabilityRecords
extends Table[AvailabilityRecord]("availabilitylog") {
def brand = column[String]("brand")
def city = column[String]("city")
def dateOfQuery = column[Timestamp]("dateOfQuery")
def * = brand ~ city ~ dateOfQuery
<>(AvailabilityRecord, AvailabilityRecord.unapply _)
}
AvailabilityRecords.ddl.create
AvailabilityRecords.insert("TUI", "Hanoi", "2013-10-02")
val q = for {
c <- AvailabilityRecords if c.name === "TUI"
} yield c.city
q.update("New York")
Query(AvailabilityRecords). sortBy(_.city.desc.nullsFirst). drop(5)take(10)
Query(AvailabilityRecords). take(30). filter(_.brand === "OA")
object Persons extends Table[Person]("person") {
def id = column[String]("id")
def firstName = column[String]("firstName")
def lastName = column[String]("lastName")
def * = id ~ firstName ~ lastName <> (Person, Person.unapply _)
}
object Bookings extends Table[Booking ]("booking") {
def city = column[String]("cityName")
def bookingDate = column[Timestamp]("bookingDate")
def bookerId = column[String]("booker_id")
def * = city ~ bookingDate ~ bookerId <> (Booking, Booking.unapply _)
}
val implicitInnerJoin = for {
b <- Bookings
p <- Persons if b.bookerId === p.id
} yield (b.city, p.firstName, p.lastName)
println(implicitInnerJoin.take(5).list)
object Persons extends Table[Person]("person") {
def id = column[String]("id")
def firstName = column[String]("firstName")
def lastName = column[String]("lastName")
def * = id ~ firstName ~ lastName <> (Person, Person.unapply _)
}
object Bookings extends Table[Booking ]("booking") {
def city = column[String]("cityName")
def bookingDate = column[Timestamp]("bookingDate")
def bookerId = column[String]("booker_id")
def * = city ~ bookingDate ~ bookerId <> (Booking, Booking.unapply _)
}
val explicitInnerJoin = for {
(b, p) <- Bookings innerJoin Persons on (_.bookerId === _.id)
} yield (b.city, p.firstName, p.lastName)
println(explicitInnerJoin.take(5).list)