2017-01-29 9 views
0

Ich verbringen etwa 2 Stunden oder mehr versuchen, diese Arbeit zu machen. Ich habe verschiedene Importe ausprobiert (Sie können in den Kommentaren sehen) und verschiedene Slick-Version, aber es funktioniert immer noch nicht. Hier ist meine build.sbt:Play Slick 3.0 Fehler beim Erstellen von Klassen-Definition-Klasse

name := """Scala_project""" 

version := "1.0-SNAPSHOT" 

lazy val root = (project in file(".")).enablePlugins(PlayScala) 

scalaVersion := "2.11.8" 

libraryDependencies += jdbc 
libraryDependencies += cache 
libraryDependencies += ws 
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test 
libraryDependencies += "org.postgresql" % "postgresql" % "9.3-1100-jdbc4" 
libraryDependencies += "com.typesafe.slick" %% "slick" % "3.0.0" 
libraryDependencies += "org.slf4j" % "slf4j-nop" % "1.6.4" 

Und meine Tabellendefinition Klasse:

package database; 
//import scala.slick.driver.postgresdriver.simple._ 
import scala.concurrent.ExecutionContext.Implicits.global 
import slick.driver.postgresdriver.api._ 
//import slick.backend.DatabaseConfig 
import slick.driver.JdbcProfile 
import models._ 



class EmployeesTableDef(tag: Tag) extends Table[Employee](tag, "employee_data") { 

/* val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("employee") 
    import dbConfig.driver.api._ */ 

    def id = column[Long]("id", O.PrimaryKey,O.AutoInc) 
    def name = column[String]("name") 
    def resume = column[String]("resume") 
    def additionalInformation = column[String]("additionalInformation") 

    override def * = 
    (id, name, resume, additionalInformation) <>(Employee.tupled, Employee.unapply) 
} 

obigen Beispiel gibt Fehler:

object postgresdriver is not a member of package slick.driver 

Da konnte ich nicht importieren finden, die funktioniert, ich war versuchen, dbConfig-Wert zu verwenden, aber der Code ließ mich den Import innerhalb der Klasse verwenden (nicht bevor es), so dass Programm immer noch nicht den Typ der Tabelle sehen.

Bitte, ich wäre Ihnen sehr dankbar für Ihre Hilfe.

+1

versuchen Sie slick.driver.PostgresDriver.api._ – vitalii

Antwort

1

Hinweis: Sie können eine Arbeitsbeispielprojekt finden, dass die unten Strategie here

Dont verwendet verwenden Slick direkt als Abhängigkeit. Verwenden Sie Play-Slick, das ein raffiniertes Plugin zum Spielen ist.

libraryDependencies ++= Seq(
    "com.typesafe.play" %% "play-slick"    % "2.0.0", 
    "com.typesafe.play" %% "play-slick-evolutions" % "2.0.0" 
) 

Sie sollten Ihren Postgres-Treiber nicht direkt importieren. Dies würde eine starke Abhängigkeit von Postgres verursachen und daher würde Ihre Anwendung nur mit Postgres funktionieren und Sie können say H2 nicht im Dev/Testmodus verwenden. Der geeignete Slick-Treiber, der verwendet werden soll, sollte eine Abhängigkeitsinjektion sein, um diese harte Abhängigkeit vom Postgres-Slick-Treiber zu vermeiden. Das folgende Beispiel zeigt die Implementierung.

trait EmployeeRepoHelper { 

    self: HasDatabaseConfigProvider[JdbcProfile] => 

    import driver.api._ 

    lazy protected val employeeTableQuery = TableQuery[EmployeesTableDef] 

    class EmployeesTableDef(tag: Tag) extends Table[Employee](tag, "employee_data") { 

     def id = column[Long]("id", O.PrimaryKey,O.AutoInc) 
     def name = column[String]("name") 
     def resume = column[String]("resume") 
     def additionalInformation = column[String]("additionalInformation") 

     override def * = 
     (id, name, resume, additionalInformation) <>(Employee.tupled, Employee.unapply) 
    } 

    } 

Mit obiger Definition. Die EmployeeRepository-Klasse, die eine Schnittstelle für die Interaktion mit der Datenbank bereitstellen würde, würde wie folgt aussehen. Im Folgenden verwende ich die JIT-Bindung des Guice DI-Frameworks, die das dbConfigProvider-Attribut einfügt. Da EmployeeRepository über die Abhängigkeitsinjektion Konstruktorparameter verwendet, sollten Sie sicherstellen, dass Sie die Klasse niemals selbst instanziieren, sondern sie immer in andere Klassen injizieren.

class EmployeeRepository @Inject() (protected val dbConfigProvider: DatabaseConfigProvider) 
    extends EmployeeRepoHelper 
    with HasDatabaseConfigProvider[JdbcProfile] { 

     import driver.api._ 

     def insert(employee: Employee) = db.run{ 
     employeeTableQuery += employee 
     } 

     /* 
     Other methods for database interaction 
     */ 
} 

schließlich sollte Ihre application.conf die Verbindungsinformationen für Ihre Datenbank. Das folgende Beispiel verwendet H2-Datenbankverbindungsdetails.

slick.dbs.default.driver="slick.driver.H2Driver$" 
slick.dbs.default.db.driver="org.h2.Driver" 
slick.dbs.default.db.url="jdbc:h2:mem:play;MODE=MYSQL;DB_CLOSE_DELAY=-1" 
slick.dbs.default.db.user=sa 
slick.dbs.default.db.password="" 
Verwandte Themen