データベース
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 } }