日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Scala ORマッパー Slickを使ってみた。

現実逃避のためにScalaのORマッパーを使ってみおうと思ってSlick使ってみた。

環境


Slick公式サイトのDocument読んでやりますた。
Slick自体はScalaのversionが2.10移行でないと使えないみたいですね。
なので、私の環境は2.9だったんですが、アップデートできました。
Slickに感謝です←

※ 公式ではドライバに H2 Database Engine を使ってましたが、今回はmysqlを利用しました。

主に使用したファイルは以下の感じ

/ src / main / scala / Hoge.scala
/ src / main / scala / Hogetable.scala
/ build.sbt

とりあえず、build.sbtに依存するライブラリを記述します。
/libにjarファイルを追加しても構いません。

libraryDependencies ++= List(
"com.typesafe.slick" %% "slick" % "1.0.0",
"org.slf4j" % "slf4j-nop" % "1.6.4",
"mysql" % "mysql-connector-java" % "5.1.27"
)

Model (Schema)のクラスが
Hogetable.scala

import scala.slick.driver.MySQLDriver.simple._
import Database.threadLocalSession

object Hogetable extends Table[(Int, String, String)]("User") {
      def id = column[Int]("id", O.PrimaryKey)
      def name = column[String]("name")
      def email = column[String]("email")
      def * = id ~ name ~ email
}

実行するファイルが
Hoge.scala

import scala.slick.driver.MySQLDriver.simple._
import Database.threadLocalSession

object Hoge {
    def main(args: Array[String]):Unit = {
        Database.forURL("jdbc:mysql://localhost/test", driver = "com.mysql.jdbc.Driver") withSession {
            try {
                (Hogetable.ddl).drop
            }

            try {
                (Hogetable.ddl).create
                Hogetable.insert(1, "hogehoge","hogehoge@example.com")
                Hogetable.insert(50, "fugafuga","fugafuga@example.com")
                Hogetable.insert(101, "piyopiyo","piyopiyo@example.com")
                Query(Hogetable) foreach { case (id:Int, name, email) =>
                    println(id + " : " + name + " → "+ email)
                }
            } catch {
                case e:Exception => println(e)
            }
        }
    }
}

テーブルは
DB : test
Table : User
でこんな感じ

(test)> desc User;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(254) | NO   |     | NULL    |       |
| email | varchar(254) | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


実行結果は以下の様な感じ

[info] Running Hoge
1 : hogehoge → hogehoge@example.com
50 : fugafuga → fugafuga@example.com
101 : piyopiyo → piyopiyo@example.com
[success] Total time: 3 s, completed 2013/12/08 21:19:23

便利ですなぁ

ちなみに、ドキュメントのコピペして

import scala.slick.driver.H2Driver.simple._
//mysqlはこっち → import scala.slick.driver.MySQLDriver.simple._

のようになってて、Mysqlシンタックスエラーがめちゃくちゃでて悩んでたのは内緒の話