ScalaにSlick2.0.1ライブラリを使用してMySQLデータベースに接続する方法の例はありますか?グーグルで最新の例を見つけることができませんでした...
最近、PHPで開発しているWebアプリケーションのコードをScalaに移植することを考えています。(i)Webアプリケーションフレームワークを備えたプログラミング言語を探しています。かなりの数のユーザーがいる場合、(ii)コンパイル時のエラーチェック、(iii)優れたテストツールなどを提供します...いくつかのケーススタディについて読んだ後(eg、huffpost および cousera )ScalaおよびPlayフレームワークを使用してWebアプリケーションを開発することで、私には魅力的に見え始めましたそして私はそれを試してみることにしました。
前のプロジェクトのすべてのデータはMySQLデータベースにあるので、MySQLに接続するためのプログラムにScalaが提供するものを調べていました。Slickに出くわしました。 Hello-Slickの例 Typesafe Activatorで、メモリ内データベース(ie、h2)の使用方法を教えてくれました。構文と抽象化のレベル今、MySQLでSlickを使いたいです。importステートメントを変更してみました
import scala.slick.driver.H2Driver.simple._
に
import scala.slick.driver.MySQLDriver.simple._
両者に HelloSlick.scala
およびTables.scala
前述の例では(以下のコードの完全なコピーを参照してください)。ただし、コンパイルすると次のエラーメッセージが表示されます。
/Users/kotaro/Documents/Scala/hello-slick/src/test/scala/TablesSuite.scala
値ddlはscala.slick.lifted.TableQuery [Suppliers]のメンバーではありません
def createSchema()=(suppliers.ddl ++ coffees.ddl).create
^
誰かがこれを引き起こしているものを知っていますか?この投稿( MySqlに接続しようとしたときの滑らかな例外 )によると、表示されるエラーメッセージは異なりますが、いくつかの依存関係を追加できない可能性があります。 MySQLでSlickを使用する方法を理解するために従うことができる良い例があれば、それも大いに役立ちます。
Scala 2.10.3、OS X10.8およびJRE1.6を搭載したXAMPP1.7.3のMySQLを使用しています。
よろしくお願いします!
以下は、コードの完全なコピーです。
HelloSlick.scala
import scala.slick.driver.MySQLDriver.simple._
//import scala.slick.driver.H2Driver.simple._
// The main application
object HelloSlick extends App {
// The query interface for the Suppliers table
val suppliers: TableQuery[Suppliers] = TableQuery[Suppliers]
// the query interface for the Coffees table
val coffees: TableQuery[Coffees] = TableQuery[Coffees]
// Create a connection (called a "session") to an in-memory H2 database
Database.forURL("jdbc:mysql://localhost:3306/test", driver="com.mysql.jdbc.Driver", user="root", password="").withSession { implicit session =>
// Create the schema by combining the DDLs for the Suppliers and Coffees tables using the query interfaces
(suppliers.ddl ++ coffees.ddl).create
/* Create / Insert */
// Insert some suppliers
suppliers += (101, "Acme, Inc.", "99 Market Street", "Groundsville", "CA", "95199")
suppliers += (49, "Superior Coffee", "1 Party Place", "Mendocino", "CA", "95460")
suppliers += (150, "The High Ground", "100 Coffee Lane", "Meadows", "CA", "93966")
// Insert some coffees (using JDBC's batch insert feature)
val coffeesInsertResult: Option[Int] = coffees ++= Seq (
("Colombian", 101, 7.99, 0, 0),
("French_Roast", 49, 8.99, 0, 0),
("Espresso", 150, 9.99, 0, 0),
("Colombian_Decaf", 101, 8.99, 0, 0),
("French_Roast_Decaf", 49, 9.99, 0, 0)
)
val allSuppliers: List[(Int, String, String, String, String, String)] = suppliers.list
// Print the number of rows inserted
coffeesInsertResult foreach (numRows => println(s"Inserted $numRows rows into the Coffees table"))
/* Read / Query / Select */
// Print the SQL for the Coffees query
println("Generated SQL for base Coffees query:\n" + coffees.selectStatement)
// Query the Coffees table using a foreach and print each row
coffees foreach { case (name, supID, price, sales, total) =>
println(" " + name + "\t" + supID + "\t" + price + "\t" + sales + "\t" + total)
}
/* Filtering / Where */
// Construct a query where the price of Coffees is > 9.0
val filterQuery: Query[Coffees, (String, Int, Double, Int, Int)] = coffees.filter(_.price > 9.0)
println("Generated SQL for filter query:\n" + filterQuery.selectStatement)
// Execute the query
println(filterQuery.list)
/* Update */
// Construct an update query with the sales column being the one to update
val updateQuery: Query[Column[Int], Int] = coffees.map(_.sales)
// Print the SQL for the Coffees update query
println("Generated SQL for Coffees update:\n" + updateQuery.updateStatement)
// Perform the update
val numUpdatedRows = updateQuery.update(1)
println(s"Updated $numUpdatedRows rows")
/* Delete */
// Construct a delete query that deletes coffees with a price less than 8.0
val deleteQuery: Query[Coffees,(String, Int, Double, Int, Int)] = coffees.filter(_.price < 8.0)
// Print the SQL for the Coffees delete query
println("Generated SQL for Coffees delete:\n" + deleteQuery.deleteStatement)
// Perform the delete
val numDeletedRows = deleteQuery.delete
println(s"Deleted $numDeletedRows rows")
/* Selecting Specific Columns */
// Construct a new coffees query that just selects the name
val justNameQuery: Query[Column[String], String] = coffees.map(_.name)
println("Generated SQL for query returning just the name:\n" + justNameQuery.selectStatement)
// Execute the query
println(justNameQuery.list)
/* Sorting / Order By */
val sortByPriceQuery: Query[Coffees, (String, Int, Double, Int, Int)] = coffees.sortBy(_.price)
println("Generated SQL for query sorted by price:\n" + sortByPriceQuery.selectStatement)
// Execute the query
println(sortByPriceQuery.list)
/* Query Composition */
val composedQuery: Query[Column[String], String] = coffees.sortBy(_.name).take(3).filter(_.price > 9.0).map(_.name)
println("Generated SQL for composed query:\n" + composedQuery.selectStatement)
// Execute the composed query
println(composedQuery.list)
/* Joins */
// Join the tables using the relationship defined in the Coffees table
val joinQuery: Query[(Column[String], Column[String]), (String, String)] = for {
c <- coffees if c.price > 9.0
s <- c.supplier
} yield (c.name, s.name)
println("Generated SQL for the join query:\n" + joinQuery.selectStatement)
// Print the rows which contain the coffee name and the supplier name
println(joinQuery.list)
/* Computed Values */
// Create a new computed column that calculates the max price
val maxPriceColumn: Column[Option[Double]] = coffees.map(_.price).max
println("Generated SQL for max price column:\n" + maxPriceColumn.selectStatement)
// Execute the computed value query
println(maxPriceColumn.run)
/* Manual SQL / String Interpolation */
// Required import for the sql interpolator
import scala.slick.jdbc.StaticQuery.interpolation
// A value to insert into the statement
val state = "CA"
// Construct a SQL statement manually with an interpolated value
val plainQuery = sql"select SUP_NAME from SUPPLIERS where STATE = $state".as[String]
println("Generated SQL for plain query:\n" + plainQuery.getStatement)
// Execute the query
println(plainQuery.list)
}
}
Tables.scala
import scala.slick.driver.MySQLDriver.simple._
import scala.slick.lifted.{ProvenShape, ForeignKeyQuery}
// A Suppliers table with 6 columns: id, name, street, city, state, Zip
class Suppliers(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "SUPPLIERS") {
def id: Column[Int] = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column
def name: Column[String] = column[String]("SUP_NAME")
def street: Column[String] = column[String]("STREET")
def city: Column[String] = column[String]("CITY")
def state: Column[String] = column[String]("STATE")
def Zip: Column[String] = column[String]("Zip")
// Every table needs a * projection with the same type as the table's type parameter
def * : ProvenShape[(Int, String, String, String, String, String)] = (id, name, street, city, state, Zip)
}
// A Coffees table with 5 columns: name, supplier id, price, sales, total
class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") {
def name: Column[String] = column[String]("COF_NAME", O.PrimaryKey)
def supID: Column[Int] = column[Int]("SUP_ID")
def price: Column[Double] = column[Double]("PRICE")
def sales: Column[Int] = column[Int]("SALES")
def total: Column[Int] = column[Int]("TOTAL")
def * : ProvenShape[(String, Int, Double, Int, Int)] = (name, supID, price, sales, total)
// A reified foreign key relation that can be navigated to create a join
def supplier: ForeignKeyQuery[Suppliers, (Int, String, String, String, String, String)] =
foreignKey("SUP_FK", supID, TableQuery[Suppliers])(_.id)
}
エラーメッセージが `TableSuite.scala``を参照していることをおそらく見落としていました
/Users/kotaro/Documents/Scala/hello-slick/src/test/scala/TablesSuite.scala
value ddl is not a member of scala.slick.lifted.TableQuery[Suppliers]
def createSchema() = (suppliers.ddl ++ coffees.ddl).create
そこでもインポートを変更する必要があります。