SlideShare a Scribd company logo
The Slick Library 
Rebecca Grenier 
rebeccagrenier@gmail.com
Intro to Slick 
 Static Typing + Compilation = Type Safety 
 For-Comprehensions 
 Compositionality: build complex queries out of simple 
parts 
@beckythebest
Introduction to Slick 
@beckythebest
Slick Connection Drivers 
 Oracle ($$$) 
 DB2 ($$$) 
 SQL Server ($$$) 
@beckythebest 
Note: Connection Pooling is your 
responsibility 
 PostgreSQL 
 MySQL 
 Access 
 Derby 
 H2 
 Hsqldb 
 SQLite
The Files Table 
@beckythebest 
Field Type Null 
id int (10) unsigned NO 
uid int (10) unsigned NO 
path varchar (255) NO 
filetype varchar (255) NO
Table Definitions: 
Mapping to tuples 
@beckythebest
Table Definitions: 
Mapping to case classes 
@beckythebest
How the 22-item 
tuple Limit Affects Slick 
What if your table has more than 22 columns? 
Define multiple Table Classes that refer to the same table – 
similar to “views” 
* There is a workaround for Scala >= 2.10.3 where you can 
use HList instead 
@beckythebest
Queries in Slick 
Every query starts out as a TableQuery first: 
val files = TableQuery[Files] 
is the equivalent of 
select * from files; 
(You can use .selectStatement on any query to see 
the SQL for a select statment that is generated 
behind the scenes) 
@beckythebest
A Quick Full Example 
val allFiles = db withSession { 
implicit session => 
files.run 
} 
allFiles is a Vector of File case class objects 
files is just the query and remains so until it is invoked 
(with .run) 
@beckythebest
Building Your Query: 
Adding a Where Clause 
With .filter 
files.filter(_.filetype === ‘pdf’) 
In SQL: select * from files where 
filetype= ’pdf’ 
• In Slick, equals is === 
• Not-Equals is =!= 
@beckythebest
Use Method Chaining to Add 
More Clauses to Your Query 
Slick: files.filter(_.filetype === 
“pdf”).filter(_.id < 20000) 
SQL: select * from files where filetype= 
“pdf” and id < 20000 
Reminder: You are not really filtering 
yet; 
@beckythebest 
you are building a Query.
Query Building 
with Modifiers from Slick’s DSL 
 take 
files.take(5) SQL: select * from files limit 5 
 Drop 
files.drop(5) SQL: select * from files offset 5 
 length 
files.length SQL: select count(*) from files 
 map 
 flatMap 
 sortBy SQL: sort by 
@beckythebest
Connecting to Your Database 
in Slick 
Connect with Database.forURL 
There is also forDriver, forName, and forDataSource 
@beckythebest
Queries Need Sessions 
Use that Database Connection to get a 
Session 
@beckythebest 
This is a static 
session
Just Say No to 
Dynamic Sessions 
AKA A non-explicit session you hope was opened earlier this 
thread 
Dynamic 
Sessions 
You can’t count on your thread having a session in an 
@beckythebest 
asyncronous world
Query Invokers 
Invoker Returns 
Vector of results 
List of results 
First result or Exception 
Some(first) or None 
Nothing 
files.run 
files.list 
files.first 
files.firstOption 
files.execute 
@beckythebest
Invoke a Delete Query 
scala> files.deleteStatement 
res5: String = delete from `files` 
invoke with .delete 
files.delete 
@beckythebest
Just Delete One Record 
Reduce your query with filter: 
> files.filter(_.id === 56).deleteStatement 
res6: String = delete from `files` where 
`files`.`id` = 56 
Invoked: 
files.filter(_.id === 56).delete 
@beckythebest
Insert Query Invoker 
scala> files.insertStatement 
res1: String = insert into `files` 
(`id`,`path`,`filetype`,`uid`) values 
(?,?,?,?) 
invoke with += 
files += File(0, “path to file”, “type”, 333) 
@beckythebest
Update Query Invoker 
scala> files.map(_.path).updateStatement 
res4: String = update `files` set `path` = ? 
invoke with .update() 
files.map(_.path).update(“new path to file”) 
@beckythebest
Best Practice: Build your Query 
Completely BEFORE Invoking 
The commands below look similar but have very 
different performance: 
files.take(5).run 
SQL: (select * from files limit 5) 
files.run.take(5) 
SQL: (select * from files) take 5 
@beckythebest
What good is all this 
Typing? 
Use SQL to query the files table by fid (which is an integer) 
What happens when a non-integer value gets passed in? 
@beckythebest 
No error? 
No big deal!
VS. Static Typing 
If you do the same thing in Slick: 
We get the following error at compile time: 
@beckythebest
Joining: Introducing The Users 
Table 
@beckythebest
Files has a new column: uid 
@beckythebest
Joining with For- 
Comprehensions 
SQL: select * from 
users,files where 
files.uid = users.id 
When invoked (with innerJoinFileUser.run) this 
returns a Collection of tuples with the first item being of 
type User and the second being of type File 
@beckythebest
Where Clauses in For- 
Comprehensions 
 Use filter expressions instead of filters 
 Example: limit to only files owned by Sarah: 
@beckythebest
Slick also has its own Join 
Methods 
We just looked at this query joined with a for-comprehension: 
Same query joined with innerJoin method: 
@beckythebest
The SQL Behind the 
Scenes 
Joined with a for-comprehension 
select x2.`uid`, x2.`name`, x2.`mail`, x2.`status`, 
x3.`id`, x3.`path`, x3.`filetype`, x3.`uid` from 
`users` x2, `files` x3 where x3.`id` = x2.`uid` 
Joined with the innerJoin method 
select x2.x3, x2.x4, x2.x5, x2.x6, x7.x8, x7.x9, 
x7.x10, x7.x11 from (select x12.`id` as x3, x12.`name` 
as x4, x12.`mail` as x5, x12.`status` as x6 from 
`users` x12) x2 inner join (select x13.`id` as x8, 
x13.`path` as x9, x13.`filetype` as x10, x13.`uid` as 
x11 from `files` x13) x7 on x2.x3 = x7.x11 
@beckythebest
Return Anything You Want 
With these for-comprehension use yield to reduce the data 
you want returned 
Instead of yield(u, f) you could have 
 yield(f) 
 yield (u.name, f.path) 
 yield (f.path) 
@beckythebest
Slick Outer Joins 
 You can’t do these with for-comprehensions 
 f.path.? turns values into Options (there might not be 
files for every user) 
 f.? doesn’t work 
* Remember, you can always use plain SQL with Slick 
@beckythebest
Query Compositionality 
Every query does Double 
Duty: 
1. Invoke to get data 
2. Use as a building block for 
another query 
@beckythebest
Create Query Methods 
object Files { 
def byType(filetype: String) = 
files.filter(_.filetype === filetype) 
} 
implicit session => 
Files.byType(“text/html”).list 
Returns a list of HTML File case classes 
@beckythebest
Let’s Look at the SQL Behind 
That 
The method itself is not a Query, but it returns a Query 
scala> filesByType.selectStatement 
ERROR 
scala> filesByType(“pdf").selectStatement 
res3: String = select * from `files` x2 where 
x2.`filetype` = ‘pdf' 
@beckythebest
Composing Queries out of 
Queries 
object Users { 
def userPDFS(email: String) = for { 
u <- users if u.email === email 
f <- Files.byType(“pdf”) if f.uid === 
u.id 
} yield (f) 
} 
@beckythebest
Quick Look at the SQL 
scala> 
userPDFS("sarah@eatingwell.com").selectStatement 
res0: String = select files`id`, files.`path`, 
files.`filetype`, files.`id` from `users`, 
`files` where ((users.`mail` = 
'sarah@eatingwell.com') and (files.`filetype` = 
'application/pdf')) and (files.`uid` = 
users.`id`) 
* There are many more advanced ways 
@beckythebest
Use the Combos in Code 
Now to get all Sarah’s PDFS is a short, clear statement: 
val sarahsPdfs = db withSession { 
implicit session => 
Users.userPDFS(“sarah@eatingwell.com”).list 
} 
sarahsPDFS is now a List of File case classes OR 
continue to build on it further 
@beckythebest
Slick Drawbacks 
Not a lot of documentation for advanced use 
Re-using Slicks collection methods for query building can 
be confusing 
Learning curve (compared to already knowing SQL) (If 
you do) 
Not the most efficient SQL 
@beckythebest
Save Yourselves! 
There is now code generation in Slick! 
You don’t have to write out 65 Table class definitions like I did 
@beckythebest
Summary 
Slick uses Scala’s best features to bring type safety and 
composability to your Relational Database access 
• Static Typing 
• Collection Methods 
• For-Comprehensions 
• Compositionality 
@beckythebest
Resources 
Slick Documentation: http://slick.typesafe.com/doc/2.1.0/ 
Activator’s Hello Slick! http://typesafe.com/activator/template/hello-slick 
Adam Mackler’s Learning Slick V2 
https://mackler.org/LearningSlick2/ 
IRC chat room #scala on Freenode 
Advanced Query Composing: 
http://slick.typesafe.com/talks/2013-12-03_Scala-eXchange/ 
2013-12-03_Patterns-for-Slick-database-applications- 
Scala-eXchange.pdf 
Working around the 22 tuple limit: 
http://stackoverflow.com/questions/20555304/how-can-i-use-the- 
new-slick-2-0-hlist-to-overcome-22-column-limit 
@beckythebest
Thank You 
Questions? 
Rebecca Grenier 
rebeccagrenier@gmail.com 
@beckythebest 
Special Thanks to: Underscore Consulting 
@beckythebest

More Related Content

PDF
Brief introduction of Slick
ODP
Patterns for slick database applications
PDF
Using Scala Slick at FortyTwo
PPTX
GreenDao Introduction
PDF
Green dao
PPTX
Getting started with Elasticsearch and .NET
PDF
How to Use JSON in MySQL Wrong
PDF
Http4s, Doobie and Circe: The Functional Web Stack
Brief introduction of Slick
Patterns for slick database applications
Using Scala Slick at FortyTwo
GreenDao Introduction
Green dao
Getting started with Elasticsearch and .NET
How to Use JSON in MySQL Wrong
Http4s, Doobie and Circe: The Functional Web Stack

What's hot (20)

PDF
Cloudera Impala, updated for v1.0
PDF
Green dao
PPTX
Discover the Power of the NoSQL + SQL with MySQL
PDF
Web2py Code Lab
PDF
Web2py tutorial to create db driven application.
PDF
Recursive Query Throwdown
PPTX
MongoDB-SESSION03
PDF
MySQL for beginners
PDF
greenDAO
PDF
Building data flows with Celery and SQLAlchemy
PPTX
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
PDF
CQL performance with Apache Cassandra 3.0 (Aaron Morton, The Last Pickle) | C...
ODP
Slickdemo
PDF
ORMLite Android
PPTX
Database connectivity in python
PPTX
ElasticSearch for .NET Developers
PDF
Php summary
PDF
Indexing and Query Optimizer (Mongo Austin)
PPTX
Webinar: Index Tuning and Evaluation
Cloudera Impala, updated for v1.0
Green dao
Discover the Power of the NoSQL + SQL with MySQL
Web2py Code Lab
Web2py tutorial to create db driven application.
Recursive Query Throwdown
MongoDB-SESSION03
MySQL for beginners
greenDAO
Building data flows with Celery and SQLAlchemy
SenchaCon 2016: Theming the Modern Toolkit - Phil Guerrant
CQL performance with Apache Cassandra 3.0 (Aaron Morton, The Last Pickle) | C...
Slickdemo
ORMLite Android
Database connectivity in python
ElasticSearch for .NET Developers
Php summary
Indexing and Query Optimizer (Mongo Austin)
Webinar: Index Tuning and Evaluation
Ad

Viewers also liked (8)

ODP
Modular programming Using Object in Scala
PPTX
Slick – the modern way to access your Data
PPTX
Reactive Database Access With Slick 3
PPTX
Slick - The Structured Way
PPTX
A Deeper Look Into Reactive Streams with Akka Streams 1.0 and Slick 3.0
PDF
Reactive database access with Slick3
PDF
Slick 3.0 functional programming and db side effects
PDF
バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri
Modular programming Using Object in Scala
Slick – the modern way to access your Data
Reactive Database Access With Slick 3
Slick - The Structured Way
A Deeper Look Into Reactive Streams with Akka Streams 1.0 and Slick 3.0
Reactive database access with Slick3
Slick 3.0 functional programming and db side effects
バッチを Akka Streams で再実装したら100倍速くなった話 #ScalaMatsuri
Ad

Similar to Slick: Bringing Scala’s Powerful Features to Your Database Access (20)

PPTX
Scala Slick-2
PDF
PDF
Data handling in r
PPTX
R data interfaces
PPTX
PHP and MySQL.pptx
PDF
Hands On Spring Data
PDF
Building node.js applications with Database Jones
PPTX
Learn PHP Lacture2
PPTX
This slide show will brief about database handling
PDF
RMySQL Tutorial For Beginners
PPSX
DIWE - Working with MySQL Databases
PDF
Data Integration through Data Virtualization (SQL Server Konferenz 2019)
PDF
SF Elixir Meetup - RethinkDB
PDF
Graph db as metastore
PPTX
Mojo – Simple REST Server
PDF
JAM819 - Native API Deep Dive: Data Storage and Retrieval
PPTX
CHAPTER six DataBase Driven Websites.pptx
PPTX
Mdst 3559-03-01-sql-php
PPTX
7. PHP and gaghhgashgfsgajhfkhshfasMySQL.pptx
PDF
DBIx::Class walkthrough @ bangalore pm
Scala Slick-2
Data handling in r
R data interfaces
PHP and MySQL.pptx
Hands On Spring Data
Building node.js applications with Database Jones
Learn PHP Lacture2
This slide show will brief about database handling
RMySQL Tutorial For Beginners
DIWE - Working with MySQL Databases
Data Integration through Data Virtualization (SQL Server Konferenz 2019)
SF Elixir Meetup - RethinkDB
Graph db as metastore
Mojo – Simple REST Server
JAM819 - Native API Deep Dive: Data Storage and Retrieval
CHAPTER six DataBase Driven Websites.pptx
Mdst 3559-03-01-sql-php
7. PHP and gaghhgashgfsgajhfkhshfasMySQL.pptx
DBIx::Class walkthrough @ bangalore pm

Recently uploaded (20)

PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
OMC Textile Division Presentation 2021.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Empathic Computing: Creating Shared Understanding
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PPTX
Machine Learning_overview_presentation.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Approach and Philosophy of On baking technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPT
Teaching material agriculture food technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Encapsulation theory and applications.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Encapsulation_ Review paper, used for researhc scholars
cloud_computing_Infrastucture_as_cloud_p
Building Integrated photovoltaic BIPV_UPV.pdf
OMC Textile Division Presentation 2021.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
A comparative study of natural language inference in Swahili using monolingua...
Empathic Computing: Creating Shared Understanding
Heart disease approach using modified random forest and particle swarm optimi...
Machine Learning_overview_presentation.pptx
Unlocking AI with Model Context Protocol (MCP)
Spectral efficient network and resource selection model in 5G networks
Approach and Philosophy of On baking technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Teaching material agriculture food technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
Univ-Connecticut-ChatGPT-Presentaion.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Encapsulation theory and applications.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf

Slick: Bringing Scala’s Powerful Features to Your Database Access

  • 2. Intro to Slick  Static Typing + Compilation = Type Safety  For-Comprehensions  Compositionality: build complex queries out of simple parts @beckythebest
  • 3. Introduction to Slick @beckythebest
  • 4. Slick Connection Drivers  Oracle ($$$)  DB2 ($$$)  SQL Server ($$$) @beckythebest Note: Connection Pooling is your responsibility  PostgreSQL  MySQL  Access  Derby  H2  Hsqldb  SQLite
  • 5. The Files Table @beckythebest Field Type Null id int (10) unsigned NO uid int (10) unsigned NO path varchar (255) NO filetype varchar (255) NO
  • 6. Table Definitions: Mapping to tuples @beckythebest
  • 7. Table Definitions: Mapping to case classes @beckythebest
  • 8. How the 22-item tuple Limit Affects Slick What if your table has more than 22 columns? Define multiple Table Classes that refer to the same table – similar to “views” * There is a workaround for Scala >= 2.10.3 where you can use HList instead @beckythebest
  • 9. Queries in Slick Every query starts out as a TableQuery first: val files = TableQuery[Files] is the equivalent of select * from files; (You can use .selectStatement on any query to see the SQL for a select statment that is generated behind the scenes) @beckythebest
  • 10. A Quick Full Example val allFiles = db withSession { implicit session => files.run } allFiles is a Vector of File case class objects files is just the query and remains so until it is invoked (with .run) @beckythebest
  • 11. Building Your Query: Adding a Where Clause With .filter files.filter(_.filetype === ‘pdf’) In SQL: select * from files where filetype= ’pdf’ • In Slick, equals is === • Not-Equals is =!= @beckythebest
  • 12. Use Method Chaining to Add More Clauses to Your Query Slick: files.filter(_.filetype === “pdf”).filter(_.id < 20000) SQL: select * from files where filetype= “pdf” and id < 20000 Reminder: You are not really filtering yet; @beckythebest you are building a Query.
  • 13. Query Building with Modifiers from Slick’s DSL  take files.take(5) SQL: select * from files limit 5  Drop files.drop(5) SQL: select * from files offset 5  length files.length SQL: select count(*) from files  map  flatMap  sortBy SQL: sort by @beckythebest
  • 14. Connecting to Your Database in Slick Connect with Database.forURL There is also forDriver, forName, and forDataSource @beckythebest
  • 15. Queries Need Sessions Use that Database Connection to get a Session @beckythebest This is a static session
  • 16. Just Say No to Dynamic Sessions AKA A non-explicit session you hope was opened earlier this thread Dynamic Sessions You can’t count on your thread having a session in an @beckythebest asyncronous world
  • 17. Query Invokers Invoker Returns Vector of results List of results First result or Exception Some(first) or None Nothing files.run files.list files.first files.firstOption files.execute @beckythebest
  • 18. Invoke a Delete Query scala> files.deleteStatement res5: String = delete from `files` invoke with .delete files.delete @beckythebest
  • 19. Just Delete One Record Reduce your query with filter: > files.filter(_.id === 56).deleteStatement res6: String = delete from `files` where `files`.`id` = 56 Invoked: files.filter(_.id === 56).delete @beckythebest
  • 20. Insert Query Invoker scala> files.insertStatement res1: String = insert into `files` (`id`,`path`,`filetype`,`uid`) values (?,?,?,?) invoke with += files += File(0, “path to file”, “type”, 333) @beckythebest
  • 21. Update Query Invoker scala> files.map(_.path).updateStatement res4: String = update `files` set `path` = ? invoke with .update() files.map(_.path).update(“new path to file”) @beckythebest
  • 22. Best Practice: Build your Query Completely BEFORE Invoking The commands below look similar but have very different performance: files.take(5).run SQL: (select * from files limit 5) files.run.take(5) SQL: (select * from files) take 5 @beckythebest
  • 23. What good is all this Typing? Use SQL to query the files table by fid (which is an integer) What happens when a non-integer value gets passed in? @beckythebest No error? No big deal!
  • 24. VS. Static Typing If you do the same thing in Slick: We get the following error at compile time: @beckythebest
  • 25. Joining: Introducing The Users Table @beckythebest
  • 26. Files has a new column: uid @beckythebest
  • 27. Joining with For- Comprehensions SQL: select * from users,files where files.uid = users.id When invoked (with innerJoinFileUser.run) this returns a Collection of tuples with the first item being of type User and the second being of type File @beckythebest
  • 28. Where Clauses in For- Comprehensions  Use filter expressions instead of filters  Example: limit to only files owned by Sarah: @beckythebest
  • 29. Slick also has its own Join Methods We just looked at this query joined with a for-comprehension: Same query joined with innerJoin method: @beckythebest
  • 30. The SQL Behind the Scenes Joined with a for-comprehension select x2.`uid`, x2.`name`, x2.`mail`, x2.`status`, x3.`id`, x3.`path`, x3.`filetype`, x3.`uid` from `users` x2, `files` x3 where x3.`id` = x2.`uid` Joined with the innerJoin method select x2.x3, x2.x4, x2.x5, x2.x6, x7.x8, x7.x9, x7.x10, x7.x11 from (select x12.`id` as x3, x12.`name` as x4, x12.`mail` as x5, x12.`status` as x6 from `users` x12) x2 inner join (select x13.`id` as x8, x13.`path` as x9, x13.`filetype` as x10, x13.`uid` as x11 from `files` x13) x7 on x2.x3 = x7.x11 @beckythebest
  • 31. Return Anything You Want With these for-comprehension use yield to reduce the data you want returned Instead of yield(u, f) you could have  yield(f)  yield (u.name, f.path)  yield (f.path) @beckythebest
  • 32. Slick Outer Joins  You can’t do these with for-comprehensions  f.path.? turns values into Options (there might not be files for every user)  f.? doesn’t work * Remember, you can always use plain SQL with Slick @beckythebest
  • 33. Query Compositionality Every query does Double Duty: 1. Invoke to get data 2. Use as a building block for another query @beckythebest
  • 34. Create Query Methods object Files { def byType(filetype: String) = files.filter(_.filetype === filetype) } implicit session => Files.byType(“text/html”).list Returns a list of HTML File case classes @beckythebest
  • 35. Let’s Look at the SQL Behind That The method itself is not a Query, but it returns a Query scala> filesByType.selectStatement ERROR scala> filesByType(“pdf").selectStatement res3: String = select * from `files` x2 where x2.`filetype` = ‘pdf' @beckythebest
  • 36. Composing Queries out of Queries object Users { def userPDFS(email: String) = for { u <- users if u.email === email f <- Files.byType(“pdf”) if f.uid === u.id } yield (f) } @beckythebest
  • 37. Quick Look at the SQL scala> userPDFS("[email protected]").selectStatement res0: String = select files`id`, files.`path`, files.`filetype`, files.`id` from `users`, `files` where ((users.`mail` = '[email protected]') and (files.`filetype` = 'application/pdf')) and (files.`uid` = users.`id`) * There are many more advanced ways @beckythebest
  • 38. Use the Combos in Code Now to get all Sarah’s PDFS is a short, clear statement: val sarahsPdfs = db withSession { implicit session => Users.userPDFS(“[email protected]”).list } sarahsPDFS is now a List of File case classes OR continue to build on it further @beckythebest
  • 39. Slick Drawbacks Not a lot of documentation for advanced use Re-using Slicks collection methods for query building can be confusing Learning curve (compared to already knowing SQL) (If you do) Not the most efficient SQL @beckythebest
  • 40. Save Yourselves! There is now code generation in Slick! You don’t have to write out 65 Table class definitions like I did @beckythebest
  • 41. Summary Slick uses Scala’s best features to bring type safety and composability to your Relational Database access • Static Typing • Collection Methods • For-Comprehensions • Compositionality @beckythebest
  • 42. Resources Slick Documentation: http://slick.typesafe.com/doc/2.1.0/ Activator’s Hello Slick! http://typesafe.com/activator/template/hello-slick Adam Mackler’s Learning Slick V2 https://mackler.org/LearningSlick2/ IRC chat room #scala on Freenode Advanced Query Composing: http://slick.typesafe.com/talks/2013-12-03_Scala-eXchange/ 2013-12-03_Patterns-for-Slick-database-applications- Scala-eXchange.pdf Working around the 22 tuple limit: http://stackoverflow.com/questions/20555304/how-can-i-use-the- new-slick-2-0-hlist-to-overcome-22-column-limit @beckythebest
  • 43. Thank You Questions? Rebecca Grenier [email protected] @beckythebest Special Thanks to: Underscore Consulting @beckythebest

Editor's Notes

  • #5: Should I go over relational databases vs. whatever mongo is
  • #7: I hope you all know what a tuple is