Slides of the talk given at Scala.io 2016 by Francois Armand @fanf42.
This a presentation about Doobie, a purelly functionnal layer built on top of JDBC in Scala by Rob Norris: https://github.com/tpolecat/doobie
The slides explain why we chose Doobie after testing Slick 3.1 for Rudder to replace our old Squeryl/SpringJDBC code.
I focus on the sumplicity and "no surpise - it just works and don't in the middle" philosophy of the framework, and why for the first time on the JVM, we have a principled persistant layer that actually make you love SQL.
I added answers to attendees question at the end of the presentation that was given.
[update 01 Nov 2016: add post Scala.io feedback]
[update 12 May 2017: add a slide about 0.4.0 new feeatures]
10. Who’s talkin’ for why?
● 10 years of Scala
● CTO @Normation
● Lead-dev on Rudder
● chose Scala 7y ago for Rudder
Continuous Configuration
for Effective ComplianceFrançois ARMAND / @fanf42
11. ● 10 years of Scala
● CTO @Normation
● Lead-dev on Rudder
● chose Scala 7y ago for Rudder
Continuous Configuration
for Effective Compliance
Squeryl
François ARMAND / @fanf42
Who’s talkin’ for why?
12. ● 10 years of Scala
● CTO @Normation
● Lead-dev on Rudder
● chose Scala 7y ago for Rudder
Continuous Configuration
for Effective Compliance
Squeryl
JdbcTemplate
François ARMAND / @fanf42
Who’s talkin’ for why?
13. But what ?
● 10 years of Scala
● CTO @Normation
● Lead-dev on Rudder
● chose Scala 7y ago for Rudder
Continuous Configuration
for Effective Compliance
Squeryl
JdbcTemplate
François ARMAND / @fanf42
Who’s talkin’ for why?
14. Slick 3 ?
● Fairly popular, ~ default choice in 2016 for Scala world
● Let’s test it ! ⇒ ported ~ 50% of Rudder code to it.
15. ● Fairly popular, ~ default choice in 2016 for Scala world
● Let’s test it ! ⇒ ported ~ 50% of Rudder code to it.
● Does not work for us :
● Feels magic and ORM-y, with *Surprises*
○ in generated SQL
■ you can’t precisely control it (that’s the point)
○ in performance (using path of least resistance)
■ ex: run-time compilation for EACH request in the path of least resistance
○ with lift embeding type
■ i.e working with Rep[MyClass] in place of MyClass
● An awful lot of boilerplate
Slick 3 ?
20. Use Doobie.
It’s GREAT.Doobie
● A pure functional, principled database access layer for Scala
● Mapping is a joy (actually make me smile)
21. Use Doobie.
It’s GREAT.Doobie
● A pure functional, principled database access layer for Scala
● Mapping is a joy (actually make me smile)
● No surprises - particularly in performances and optimization
22. Use Doobie.
It’s GREAT.Doobie
● A pure functional, principled database access layer for Scala
● Mapping is a joy (actually make me smile)
● No surprises - particularly in performances and optimization
● Rob Norris (@tpolecat) is über nice and helpful
23. Use Doobie.
It’s GREAT.Doobie
● A pure functional, principled database access layer for Scala
● Mapping is a joy (actually make me smile)
● No surprises - particularly in performances and optimization
● Rob Norris (@tpolecat) is über nice and helpful
● It actually makes me like SQL
○ (it tooks 15 years, and PostgreSQL helps a lot)
24. Use Doobie.
It’s GREAT.
● A pure functional, principled database access layer for Scala
● Mapping is a joy (actually make me smile)
● No surprises - particularly in performances and optimization
● Rob Norris (@tpolecat) is über nice and helpful
● It actually makes me like SQL
○ (it tooks 15 years, and PostgreSQL helps a lot)
Doobie
25. A principled database access layer for Scala
● everything is a value
● standard functional programming idioms apply
● Clear separation of concepts
○ (I won’t talk about Free Monad - oups)
32. No surprises - Sane (performant) defaults
● The exact, 50 lines if you want,
SQL queries you want to write.
● PreparedStatement by default.
● Batch updates are given.
● Comparison with JDBC
33. Rob Norris @tpolecat
(like, he produced working code for SQLXML mapping. At 3 a.m. Just for me)
(OK, 3 a.m for my timezone. But still :)
is
extremely
nice and
helpful
actually
likes SQL
34. Update 0.4.0: rainbows and wonders
● Fragments
○ https://tpolecat.github.io/doobie-scalaz-0.4.0/08-Fragments.html
○ Doobie 0.4.0 add fragments, which allows to safely build and factor out part of requests
(typically: “select column1, …, column42 in the_table”)
● Logging
○ https://tpolecat.github.io/doobie-scalaz-0.4.0/10-Logging.html
○ Allows to log queries… based on conditions ! Plus, access to full, fine grained timing.
■ “only the one for which you get an error from Database”
■ Or “all the queries taking more than 200ms” !
○ über easy to connect with your logging framework
● Cats or Scalaz
○ now, you can choose!
35. Yes. Really.
Savant word for
“Makes you love SQL -
No surprise, it just works”
Questions ?
The End
36. References
● Book of Doobie : https://tpolecat.github.io/doobie-0.3.0/00-index.html
● Really nice presentation of concepts and use of Free Monad:
○ SBTB 2015: Rob Norris, Programs as Values: JDBC Programming with Doobie:
https://www.youtube.com/watch?v=M5MF6M7FHPo
● https://twitter.com/tpolecat
● https://gitter.im/tpolecat/doobie
● The faq is pretty cool: https://tpolecat.github.io/doobie-0.3.0/15-FAQ.html (“in”
clause, outer join, pure SQL strings and more)
● Rudder is full of examples, feel free to read files (importing Doobie) in:
https://github.com/Normation/rudder/tree/branches/rudder/4.0/rudder-core/src/
main/scala/com/normation/rudder/repository/jdbc
37. Question: testing mapping in the repl ?
This is integrated with
testing frameworks, in
particular scalacheck
38. Question: more typed, safer queries ?
● Some things are coming in Doobie 0.4.0 !
○ but nothing is fixed for now
○ [update] Actually, was reported post 0.4.0
● I sum-up all the feedback/ideas I get at Scala.io 2016
here: https://github.com/tpolecat/doobie/issues/375
39. Question: variables number or parameters?
How I deal with a query whose number of parameter is know at runtime ?
Doobie has several level of API:
● sql””” …. “”” : the simplest, but also the less flexible
● Query/Query0: give a return type, a type for parameters, and a string for query: allows to build
queries by string concatenation (ideal for porting from JDBC)
● HC: “high interface”: allows to add parameter by index, “à la” JDBC, but typed.
○ full, complexe example on next page that adapt a query at runtime based on user
parameters, and use HC
● and a low level interface, where all JDBC ugliness is exposed
40. Question: variables number or parameters?
} Request depends of
parameters of the
function
Query is a pure string
built with concatenation
Dynamically set
parameters
with HPS & HC
41. Question: retrieving variable depths of
dependent objects?
One big question in data persistance layer is to manage the depth in the dependency graph of
object you are going to retrieve. Typically, with an employee having a property “manager”, which is
an ID in DB but also (of course) an employee, how I manage to get only the first employee with the
manager ID ? The first employee with the full employee manager ? And his manager ?
Rob Norris gave a super talk exactly on that subject at ScalaWorld 2016:
● “Pure Functional Database Programming with Fixpoint Types “
○ slides: http://tpolecat.github.io/presentations/sw2016/slides.html#1
○ video: https://www.youtube.com/watch?v=7xSfLPD6tiQ
42. License
This work is licensed under a Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International License.
http://www.slideshare.net/normation