Для спешащих людей приведен код и инструкции по настройке .
Обратитесь к этому блогу в Play 2.0: Создание веб-приложения с использованием Scala для получения подробной информации о Play и Scala.
В следующих нескольких блогах я буду писать веб-приложение корпоративного класса с использованием Play и Scala. Я буду освещать такие темы, как моделирование баз данных и безопасность. Теперь официально Scala приняла Slick в качестве DSL для запросов к базе данных . Но когда вы создаете новое приложение Play и добавляете библиотеку Slick, как упоминалось в этом блоге , оно не работает. Это выдает странную ошибку, такую как Не найдено подходящего драйвера в тестах.
Я также нашел slick-play2-example , в этом примере ожидается, что мы создадим слой DAL, но мы не можем напрямую поиграть со slick в нашем тестовом коде.
После долгих исследований я наткнулся на этот плагин . Я попытался интегрировать это с моим приложением Play, и это сработало как шарм.
Мы определим класс Кофе и класс Поставщика. Один кофе имеет несколько поставщиков. Дизайн класса, как показано ниже,
case class Coffee(name: String, supID: Int, price: Double, sales: Int, total: Int) object Coffees extends Table[Coffee]("COFFEES") { def name = column[String]("COF_NAME", O.PrimaryKey) def supID = column[Int]("SUP_ID") def price = column[Double]("PRICE") def sales = column[Int]("SALES") def total = column[Int]("TOTAL") def * = name ~ supID ~ price ~ sales ~ total <> (Coffee.apply _, Coffee.unapply _) // A reified foreign key relation that can be navigated to create a join def supplier = foreignKey("SUP_FK", supID, Suppliers)(_.id) } case class Supplier(id: Int, name: String, street: String, city: String, state: String, zip: String) // Definition of the SUPPLIERS table object Suppliers extends Table[Supplier]("SUPPLIERS") { def id = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column def name = column[String]("SUP_NAME") def street = column[String]("STREET") def city = column[String]("CITY") def state = column[String]("STATE") def zip = column[String]("<a class="zem_slink" title="ZIP (file format)" href="http://en.wikipedia.org/wiki/ZIP_%28file_format%29" target="_blank" rel="wikipedia">ZIP</a>") // Every table needs a * projection with the same type as the table's type parameter def * = id ~ name ~ street ~ city ~ state ~ zip <> (Supplier.apply _, Supplier.unapply _) }
Ниже ScalaTest для тестирования различных возможностей Slick,
DB.withSession{ implicit session => //Populate sample data val testSuppliers = Seq( Supplier(101, "Acme, Inc.", "99 Market Street", "Groundsville", "CA", "95199"), Supplier( 49, "Superior Coffee", "1 Party Place", "Mendocino", "CA", "95460"), Supplier(150, "The High Ground", "100 Coffee Lane", "Meadows", "CA", "93966") ) Suppliers.insertAll( testSuppliers: _*) val testCoffees= Seq( Coffee("Colombian", 101, 7.99, 0, 0), Coffee("French_Roast", 49, 8.99, 0, 0), Coffee("Espresso", 150, 9.99, 0, 0), Coffee("Colombian_Decaf", 101, 8.99, 0, 0), Coffee("French_Roast_Decaf", 49, 9.99, 0, 0) ) Coffees.insertAll( testCoffees: _*) //Assert coffee data equals to the test list of coffee Query(Coffees).list must equalTo(testCoffees) //List all coffee less than $10 val q1 = for { c <- Coffees if c.price < 10.0 } yield (c.name) q1 foreach println println("**************"); //return all suppliers for coffee less than $9.0 val q2 = for { c <- Coffees if c.price < 9.0 s <- c.supplier } yield (c.name, s.name) q2 foreach println println("**************"); //return all suppliers for coffee using zip val q3 = for { (c, s) <- Coffees zip Suppliers } yield (c.name, s.name) q3 foreach println println("**************"); //Union val q4 = Query(Coffees).filter(_.price < 8.0) val q5 = Query(Coffees).filter(_.price > 9.0) val unionQuery = q4 union q5 unionQuery foreach println println("**************"); //Union second approach val unionAllQuery = q4 unionAll q5 unionAllQuery foreach println println("**************"); //Group by val r = (for { c <- Coffees s <- c.supplier } yield (c, s)).groupBy(_._1.supID) //Aggregation val r1 = r.map { case (supID, css) => (supID, css.length, css.map(_._1.price).avg) } r1 foreach println }
В моем следующем блоге я приведу реальный пример и буду использовать Slick. Я надеюсь, что этот блог помог.