読者です 読者をやめる 読者になる 読者になる

ScalaのDBライブラリSlick3をさわってみる

What is Slick

Slick — Slick 3.1.1 documentation
Slickはscalaで関係データベースの操作を簡単に扱うためのライブラリ。
対応データベースは、MySQLPostgreSQL、OracleDBなどなど。



準備

tabakazu.hatenablog.com
この記事で作成した雛形から始めます。

データベースのインストール
データベースは、PostgreSQLを使います。

# インストール
brew install postgresql

# 起動
brew services start postgresql

# バージョン確認
# 今回は9.5.4でした。
psql --version



データベース設定

userとdatabase作成
今回はrootユーザ、rootデータベースとします。

# PostgreSQLに接続
psql -d postgres

## 今回の接続ユーザであるrootを作成
create user root;

## 今回の接続データベースであるrootを作成
create database root;

## PostgreSQLの接続終了
\q


テーブルを作成する
公式ドキュメントとは違います。
とても簡単な、IDと名前、誕生日のみのテーブルにしてます。

# rootデータベースにrootユーザで接続
psql -d root -U root

## 今回使用するテーブル作成
create table players ( 
    id serial primary key,
    name varchar(80),
    birthday varchar(80)
);

## rootでの接続終了
\q



Getting Started

Getting Started — Slick 3.1.1 documentation

// build.sbt

name := "slickapp"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "3.1.1",
  "org.postgresql" % "postgresql" % "9.4-1200-jdbc41"
)

今回はログは要らないため、slf4j-nopは今回は外しておきます。
PostgreSQLを利用するため、バージョンに対応したJDBCを追加します。

JDBCとは
Java Database Connectivityの略で、Javaからデータベースを操作するAPIのこと。



Database Configuration

設定ファイルの作成

// src/main/resources/application.conf

pg_db = {
  url = "jdbc:postgresql://localhost/root?user=root"
  driver = org.postgresql.Driver
  connectionPool = disabled
  keepAliveConnection = true
}


Source Code
DbConfig.scalaにはINSERTとSELECTの処理。

// src/main/scala/DbConfig.scala

import scala.concurrent.ExecutionContext.Implicits.global
import slick.driver.PostgresDriver.api._

object DbConfig extends App {
  val db = Database.forConfig("pg_db")
  val players = TableQuery[Players]

  try {
    val setup = DBIO.seq(
      players += (1, "Martial", "1995-12-05"),
      players ++= Seq(
        (2, "Rooney", "1985-10-24"),
        (3, "Carrick", "1981-07-08")
      )
    )
    db.run(setup)

    db.run(players.result).map(_.foreach {
      case (id, name, birthday) =>
        println(id + "\t" + name + "\t" + birthday)
    })

  } finally db.close
}


Players.scalaには作成したplayersテーブルの情報。

// src/main/scala/Players.scala

import slick.driver.PostgresDriver.api._

class Players(tag: Tag) extends Table[(Int, String, String)](tag, "players") {
  def id = column[Int]("id", O.PrimaryKey)
  def name = column[String]("name")
  def birthday = column[String]("birthday")
  def * = (id, name, birthday)
}



実行

sbt compile run
## 追加したプレイヤーが表示されれば成功!!