やっとScalaのSlick2使ってDBテーブルの中を見れるようになった

いかの2つを参考にして、
Introduction — Slick 2.1.0-M1 documentation
Connections / Transactions — Slick 2.1.0-M1 documentation

こんなソースコードを書いてみた。


動かなかった例

import com.typesafe.slick.driver.ms.SQLServerDriver.simple._

object MSSQLConnectMain {
  def main(args: Array[String]) {
    class Party(tag: Tag) extends Table[(Int, String, String)](tag, "Party") {
      def id = column[Int]("PartyID", O.PrimaryKey)
      def partyType = column[String]("PartyType")
      def party = column[String]("Party")
      def * = (id, partyType, party)
    }
    val parties = TableQuery[Party]

    println("start query")
    val db = Database.forURL("jdbc:sqlserver://HOST\\SQLEXPRESS/DBName:1433;user=hoge;password=fuga"
                          , driver = "net.sourceforge.jtds.jdbc.Driver" )
    val query = for (p <- parties; if p.partyType === "Broker") yield (p.partyType, p.party)
    db.withSession{
      implicit session =>
        query.list(session).map(println(_))
    }
    println("end query")
  }
}


でもこんなエラー。

java.sql.SQLException: No suitable driver found for jdbc:sqlserver:

わからんなー、といろいろ調べたところ、jtdsではjdbcの指定方法が違うそうだ。
SQL Serverに接続するオープンソースのType4 JDBC Driver「jTDS」 - あおきのTechメモ

Microsoft謹製のドライバーでは、 jdbc:sqlserver://HOST\DBInstance;database=DBName らしい
一方jTDSでは、 jdbc:jtds:sqlserver://HOST:PORT/DBName;instance=DBInstance となる。では、早速直してみた。


良い例:

object MSSQLConnectMain {
  def main(args: Array[String]) {
    class Party(tag: Tag) extends Table[(Int, String, String)](tag, "Party") {
      def id = column[Int]("PartyID", O.PrimaryKey)
      def partyType = column[String]("PartyType")
      def party = column[String]("Party")
      def * = (id, partyType, party)
    }
    val parties = TableQuery[Party]

    println("start query")
    val db = Database.forURL("jdbc:jtds:sqlserver://HOST:1433/DBName;instance=SQLEXPRESS;user=hoge;password=fuga"
                          , driver = "net.sourceforge.jtds.jdbc.Driver" )
    val query = for (p <- parties; if p.partyType === "Broker") yield (p.partyType, p.party)
    db.withSession{
      implicit session =>
        query.list(session).map(println(_))
    }
    println("end query")
  }
}

これでうまく行った。map(println(_))が変? 細かいことは気にしないで……。