SlideShare a Scribd company logo
What is doobie ?
- database access for scala -
2016-10-1
第十七回 #渋谷java
Me
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
直近の著書です →
Today's topic
doobieでできることをざっくり紹介
functional programming的な話はしません
scalazの細かい話はしません
Background
● Slick
○ ScalaでメジャーなDBアクセスライブラリ
● 色々な意見があるが・・・
弁解できないのが
Performance
Hard!!
● whole query preparation time
http://stackoverflow.com/questions/39725886/typical-performance-in-slick-ver-3-1-1
● join explain
(´・ω・`)ショボーン
他を模索してみる・・・
doobie
https://github.com/tpolecat/doobie
● ScalaのDBアクセスライブラリ
● ORMではない(重要)
● JDBCを使ったプログラムを書く手段を提供
doobie
キーワードは
pure FP SQLI/O
Supported releases
● 0.3.x (最新は0.3.0)
○ JDK 1.8+
○ Scala 2.10, 2.11, 2.12
● 0.2.x (最新は0.2.4)
○ JDK 1.7+
○ Scala 2.10, 2.11
doobie is pre-1.0
● 開発が活発
● 大きな変更もありえる
○ マイナーリリース(0.x)で非推奨になることも
Setup
● build.sbt
libraryDependencies ++= Seq(
"org.tpolecat" %% "doobie-core" % 0.3.0
)
Setup
● 必要なimport
import doobie.imports._
import scalaz._, Scalaz._, concurrent.Task
Setup
● 接続情報
val xa = DriverManagerTransactor[Task](
"org.h2.Driver", "url", "user", "password"
)
Select
val id = 1
val res =
sql"select * from user where uid = $id"
.query[User]
.unique
.transact(xa)
Select
val id = 1
val res =
sql"select * from user where uid = $id"
.query[User]
.unique
.transact(xa)
(注)まだ実行されてないよ!
// Query0[User]
// ConnectionIO[User]
// Task[User]
Benefit
● actually constructing PreparedStatement
○ SQLはPreparedStatementで実行
○ パラメータはsetString, setIntなどで設定される
● 破壊的なSQLにならない
● ソースコードだけで完結する
○ 別ファイルを行き来しなくてよい
Benefit
● 非同期が前提のものとの相性がよい
○ たとえばhttp4s
val service = HttpService {
case req @ GET -> Root / "users"/ IntVar(uid) =>
Ok(findUser(uid))
}
def findUser(uid: Int): Task[User] = ...
EntityEncoderを定義すれば
case classをそのまま返せる
Insert
sql"insert into user (name, age) values
(${u.name}, ${u.age})".update.run // ConnectionIO[Int]
Insert
for {
id <- sql"insert into ...".update
.withUniqueGeneratedKeys[Int]("uid")
_ <- sql"insert into ... values ($id, ...)".update
.run
} yield id
特徴的な機能
What is YOLO mode ?
● REPLで便利な機能
○ transact(xa)してforeach(println)するのは煩雑
● 面倒な呼び出しをショートカットできる
○ quick・・結果を標準出力に
○ check・・Typecheckingを行う(後述)
YOLO - quick
import xa.yolo._
sql"select * from user where uid = $id"
.query[User]
.quick
.unsafePerformSync
必要
// Task[Unit]
Typechecking (experimental)
● DBスキーマに対してクエリを検証
○ マッピングする型が正しいか
● run-time check
YOLO - check
import xa.yolo._
sql"select * from user where uid = $id"
.query[User]
.check
.unsafePerformSync
必要
YOLO - check
✓ SQL Compiles and Typechecks
✕ C01 UID INTEGER (INTEGER) NOT NULL → String
- INTEGER (INTEGER) is ostensibly coercible to String according to the JDBC
specification but is not a recommended target type. Fix this by changing the
schema type to CHAR or VARCHAR; or the Scala type to Int or JdbcType.
✓ C02 NAME VARCHAR (VARCHAR) NOT NULL → String
...
Unit Testing (experimental)
● UTでクエリの検証をサポート
○ 現在はSpecs2のみ
● doobie-contrib-specs2を依存関係に追加
○ doobie.contrib.specs2.analysisspec.AnalysisSpecをミッ
クスイン
Unit Testing (experimental)
object xxx extends Specification with AnalysisSpec {
val transactor = DriverManagerTransactor[Task](
"org.mysql.jdbc.Driver", "url", "user", "password"
)
check(sql"select * from user".query[User])
}
(注)存在するスキーマに対して実行
yoloのインポートは不要
まとめ
Conclusion
● スタイル
○ SQLを書く
○ functional programming
● SQLの妥当性はテストで行う
● scalazを扱うものと相性がよい
○ http4sとか
Conclusion
● 前述したことがデメリットとなるケースも
● 機能が大きく変わる可能性あり
○ 1.0まで遠い・・・
● 吟味してから使いましょう

More Related Content

PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
PDF
javascript を Xcode でテスト
PDF
Riot.js と戦った話 (8月26日 oRo LT 会)
PPTX
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
PDF
Google Gears データベースの基礎
PDF
ECMAScript6による関数型プログラミング
PDF
OSSから学ぶSwift実践テクニック
PDF
Backbone.js
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
javascript を Xcode でテスト
Riot.js と戦った話 (8月26日 oRo LT 会)
【YAPC::Asia Hachioji 2016】ES2015のclassでアプリケーションを書いてみた話
Google Gears データベースの基礎
ECMAScript6による関数型プログラミング
OSSから学ぶSwift実践テクニック
Backbone.js

What's hot (20)

PPTX
まだDOM操作で消耗してるの?
PDF
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
PPTX
モテる JavaScript
PPTX
Deep dive into oss written in swift
KEY
5分程度で分かる? Appceleratorの方のAlloy
PDF
20110714 j queryベーシック
PDF
JavaScriptことはじめ
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
Yesod(at FPM2012)
PDF
JavaScriptユーティリティライブラリの紹介
PPTX
わんくま東京#46 予告編
PDF
Java EE勉強会 開発合宿 成果発表
PDF
春のJs祭り2015 lt
PDF
PHPコードではなく PHPコードの「書き方」を知る
PDF
WordBench Kobe jQueryどうでしょう
PDF
ScaLa+Liftとか
PDF
JavaScript入門-基礎編
PDF
React+TypeScriptもいいぞ
PPTX
若気の至りを精算する
まだDOM操作で消耗してるの?
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
モテる JavaScript
Deep dive into oss written in swift
5分程度で分かる? Appceleratorの方のAlloy
20110714 j queryベーシック
JavaScriptことはじめ
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
ng-japan 2015 TypeScript+AngularJS 1.3
Yesod(at FPM2012)
JavaScriptユーティリティライブラリの紹介
わんくま東京#46 予告編
Java EE勉強会 開発合宿 成果発表
春のJs祭り2015 lt
PHPコードではなく PHPコードの「書き方」を知る
WordBench Kobe jQueryどうでしょう
ScaLa+Liftとか
JavaScript入門-基礎編
React+TypeScriptもいいぞ
若気の至りを精算する
Ad

Viewers also liked (20)

PDF
Dynamic SQL in doobie
PDF
Thinking in Cats
PDF
WAS LibertyでCloud-ReadyなJava EE7アプリ開発
PDF
Quartzでcronを範囲検索したい
PDF
Is spark streaming based on reactive streams?
PDF
ビッグじゃなくても使えるSpark Streaming
PDF
Macro in Scala
PDF
Reducing Boilerplate and Combining Effects: A Monad Transformer Example
PDF
Spring Boot + Netflix Eureka
PDF
Netflix Open Source Meetup Season 3 Episode 2
PDF
Make your programs Free
PDF
Netflix Open Source Meetup Season 4 Episode 1
PDF
NetflixOSS Meetup season 3 episode 1
PDF
NetflixOSS season 2 episode 2 - Reactive / Async
PDF
Netflix oss season 2 episode 1 - meetup Lightning talks
PDF
Netflix Open Source Meetup Season 4 Episode 2
PDF
20140708 - Jeremy Edberg: How Netflix Delivers Software
PDF
Netflix oss season 1 episode 3
PDF
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
PDF
Functional Database Strategies at Scala Bay
Dynamic SQL in doobie
Thinking in Cats
WAS LibertyでCloud-ReadyなJava EE7アプリ開発
Quartzでcronを範囲検索したい
Is spark streaming based on reactive streams?
ビッグじゃなくても使えるSpark Streaming
Macro in Scala
Reducing Boilerplate and Combining Effects: A Monad Transformer Example
Spring Boot + Netflix Eureka
Netflix Open Source Meetup Season 3 Episode 2
Make your programs Free
Netflix Open Source Meetup Season 4 Episode 1
NetflixOSS Meetup season 3 episode 1
NetflixOSS season 2 episode 2 - Reactive / Async
Netflix oss season 2 episode 1 - meetup Lightning talks
Netflix Open Source Meetup Season 4 Episode 2
20140708 - Jeremy Edberg: How Netflix Delivers Software
Netflix oss season 1 episode 3
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Functional Database Strategies at Scala Bay
Ad

Similar to What is doobie? - database access for scala - (8)

PDF
Let s database_testing
PDF
めんどくさくない Scala #kwkni_scala
PDF
PerlとSQLのいろいろ
PDF
DTraceによるMySQL解析ことはじめ
PPTX
Play2 scalaを2年やって学んだこと
PDF
Groovyで楽にSQLを実行してみよう
PDF
RとSQLiteで気軽にデータベース作成
Let s database_testing
めんどくさくない Scala #kwkni_scala
PerlとSQLのいろいろ
DTraceによるMySQL解析ことはじめ
Play2 scalaを2年やって学んだこと
Groovyで楽にSQLを実行してみよう
RとSQLiteで気軽にデータベース作成

More from chibochibo (9)

PDF
Tour of Apache PredictionIO in 10 Minutes
PDF
Crawler Commons
PDF
LocalStack
PDF
nioで作ったBufferedWriterに変えたら例外になった
PDF
Spark Streaming on AWS -S3からKinesisへ-
PDF
Spark in small or middle scale data processing with Elasticsearch
PDF
What's a macro?: Learning by Examples
PDF
Spring Boot Introduction
PDF
Slick入門
Tour of Apache PredictionIO in 10 Minutes
Crawler Commons
LocalStack
nioで作ったBufferedWriterに変えたら例外になった
Spark Streaming on AWS -S3からKinesisへ-
Spark in small or middle scale data processing with Elasticsearch
What's a macro?: Learning by Examples
Spring Boot Introduction
Slick入門

What is doobie? - database access for scala -