Учебник по учебной программе + SLICK (Scalaquery) - программирование
Подтвердить что ты не робот

Учебник по учебной программе + SLICK (Scalaquery)

Кто-нибудь знает о хорошем учебнике или примерном проекте (github) использования платформы Play с SLICK (ScalaQuery)? Я изо всех сил пытаюсь заставить их работать вместе.

Я получаю эту ошибку:

[info] play - Application started (Dev)
[error] application - 

! @6b13oi41c - Internal server error, for request [GET /listBooks] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1-2.0.2.jar:2.0.2]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1-2.0.2.jar:2.0.2]
    at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor-2.0.2.jar:2.0.2]
    at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1-2.0.2.jar:2.0.2]
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor-2.0.2.jar:2.0.2]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor-2.0.2.jar:2.0.2]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$
    at scala.slick.driver.BasicProfile$class.processAST(BasicProfile.scala:18) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.processAST(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.BasicProfile$class.createQueryBuilder(BasicProfile.scala:22) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.createQueryBuilder(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.BasicProfile$class.buildSelectStatement(BasicProfile.scala:23) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.buildSelectStatement(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
[error] application - 

Вот моя модель книги:

package models

import play.api.db._
import play.api.Play.current

import scala.slick.driver.PostgresDriver.simple._
import scala.slick.ql.{MappedTypeMapper}
import scala.slick.session.{Session, Database}

case class Book(name: String, filename: String)

object Book extends Table[(Long, String, String)]("book") {

  lazy val database = Database.forDataSource(DB.getDataSource())
  def id = column[Long]("id", O PrimaryKey, O AutoInc)
  def name = column[String]("name", O NotNull)
  def filename = column[String]("filename", O NotNull)
  def * = id ~ name ~ filename

  def findAll() : Seq[Book] = database.withSession { implicit db:Session =>
    (for(t <- this) yield t.name ~ t.filename).list.map(attrs => Book(attrs._1, attrs._2))
  }

  def create(book: Book): Unit = database.withSession { implicit db:Session =>
    this.name ~ this.filename insert(book.name, book.filename)
  }

}

EDIT:
Это мой Build.scala

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "PlayWithScala"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
      "postgresql" % "postgresql" % "9.1-902.jdbc4",
      "com.typesafe" % "slick_2.10.0-M4" % "0.10.0-M2"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here      
    )

}
4b9b3361

Ответ 2

Edit Теперь, когда Play2.1 вошел в свой RC-процесс, мы можем использовать Slick. Это потому, что Play2.1 использует Scala2.10 (RC также) под водой и потому, что Slick будет доступным по умолчанию DB access lib в стеке Typesafe.

Чтобы вспомнить, теперь Slick может получить доступ к СУРБД, а также скоро настроит MongoDB. Он использует встроенный DSL (^^) для запросов к бэкэндам. Этот DSL управляется макросами, поэтому требуется Scala 2.10.

Однако обратите внимание, что макросистема находится в состоянии эксперимента (даже когда Scala2.10 будет выпущен). Я еще не знаю потенциальных оговорок такого статуса на Slick lib в ближайшем будущем.

Чтобы наслаждаться этим RC, идите туда Play2.1RC1, и просмотрите документ... там много изменений, например Json API fi


Хммм. Не уверен, что пятно будет работать из коробки с Play как легко.

Поскольку PLay 2.0 фактически построен на Scala 2.9.x, где slick требуется 2.10 (для Macro).

Итак, сначала существует несоответствие между объявляемыми вами отпечатками (slick_2.10.0-M4 говорит, что я использую Scala 2.10.0-M4) и версию Scala, которая будет использоваться.

Кстати, в соответствии с этот пример сайта (для Slick) ваши отпечатки SBT выглядят нормально. Но проблема может заключаться в том, что драйверу потребуются другие отпечатки (возможно, АСТ) и оставить SBT в правильной версии, используя текущую версию Scala, которую вы используете (это делается путем объявления зависимости без версии Scala в "articfact" name ") = > В этом случае AST не будет найден, потому что он не существует для pre-2.10.

Что можно попробовать, так это определить другую версию Scala для всего проекта...

My 2c

Ответ 3

Используя Play 2.1, с последней версией Slick (1.0.1-RC1), вы должны использовать:

val appDependencies = Seq(
  "com.typesafe.slick" %% "slick" % "1.0.1-RC1",
  ...
}