データベース

SQLiteを使ってみた。
・参考http://www.zentus.com/sqlitejdbc/

import java.sql._

object sqlitetest extends Application {
  Class.forName("org.sqlite.JDBC")

  val conn = DriverManager.getConnection("jdbc:sqlite:test.db")
  val stat = conn.createStatement

  stat.executeUpdate("create table people (age INT, name CHAR(32), occupation CHAR(32));")
  stat.executeUpdate("insert into people values (10, 'Gandhi', 'politics');")
  stat.executeUpdate("insert into people values (20, 'Turing', 'computers');")
  stat.executeUpdate("insert into people values (30, 'Wittgenstein', 'smartypants');")

  val rs = stat.executeQuery("select * from people;")
  while (rs.next()) {
      println("age = " + rs.getString("age"))
      println("name = " + rs.getString("name"))
      println("occupation = " + rs.getString("occupation"))
  }
  rs.close
  conn.close
}

ここまでは、ほとんどJavaと同じ。

で、scala.dbcに挑戦・・・
・参考Shiny Things: Scala Baby-Steps

import scala.dbc._
import scala.dbc.Syntax._
import scala.dbc.syntax.Statement._
import java.net.URI

object SqliteVendor extends Vendor {
  val uri = new URI("jdbc:sqlite:test.db")
  val user = ""
  val pass = ""
  
  val retainedConnections = 1
  val nativeDriverClass = Class.forName("org.sqlite.JDBC")
  val urlProtocolString = "jdbc:sqlite:"
}

object dbctest extends Application {
  val db = new Database(SqliteVendor)

    val rows = db.executeStatement {
      select fields ("age" of integer) from ("people")
    }
    for (val r <- rows;
         val f <- r.fields) {
      println(f.content.nativeValue) // or .sqlValue
    }
}

・・・で玉砕・・・orz
以下の実行時エラーが出る。

java.lang.ExceptionInInitializerError
        at dbctest.main(dbctest.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
        at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:161)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: scala.dbc.exception.IncompatibleSchema
        at scala.dbc.statement.Relation.typeCheck(Relation.scala:28)
        at scala.dbc.Database$$anon$1.(Database.scala:118)
        at scala.dbc.Database.executeStatement(Database.scala:112)
        at scala.dbc.Database.executeStatement(Database.scala:102)
        at dbctest$.(dbctest.scala:20)
        at dbctest$.(dbctest.scala)
        ... 10 more

あとで、MYSQLを試してみるつもり。

・・・試してみた。

import scala.dbc._
import scala.dbc.Syntax._
import scala.dbc.syntax.Statement._
import java.net.URI

object SqliteVendor extends Vendor {
  val uri = new URI("jdbc:sqlite:test.db")
  val user = ""
  val pass = ""
  
  val retainedConnections = 1
  val nativeDriverClass = Class.forName("org.sqlite.JDBC")
  val urlProtocolString = "jdbc:sqlite:"
}

object MysqlVendor extends Vendor {
  val uri = new URI("jdbc:mysql://localhost:3306/test")
  val user = "root"
  val pass = "root"
  
  val retainedConnections = 5
  val nativeDriverClass = Class.forName("com.mysql.jdbc.Driver")
  val urlProtocolString = "jdbc:mysql:"
}

object dbctest extends Application {
//  val db = new Database(SqliteVendor)
  val db = new Database(MysqlVendor)

    val rows = db.executeStatement {
      select fields ("name" of characterVarying(32)) from ("people")
    }
    for (val r <- rows;
         val f <- r.fields) {
      println(f.content.nativeValue) // or .sqlValue
    }
}

こっちは動いた・・・
けど、scala.dbcってもしかして、現状読み込みのみなのか??