在创建类定义类时播放Slick 3.0错误

时间:2017-01-29 07:34:59

标签: scala playframework slick

我花了大约2个小时或更长的时间来完成这项工作。我尝试了不同的进口(你可以在评论中看到)和不同版本的光滑,但它仍然不起作用。这是我的build.sbt:

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"

我的表定义类:

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)
}

以上示例给出错误:

object postgresdriver is not a member of package slick.driver

因为我无法找到有效的导入我尝试使用dbConfig值,但是代码让我使用了类中的导入(不是因为它),所以程序仍然没有看到Table类型

拜托,我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

注意:您可以找到使用以下策略的工作示例项目here

不要直接使用光滑作为依赖。使用play-slick这是一个光滑的插件。

 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)
    }

  }

您不应该直接导入postgres驱动程序。这将引入对postgres的硬依赖,因此你的应用程序只适用于postgres,你不能在开发/测试模式下使用说H2。要使用的适当光滑驱动程序应该是依赖注入,以避免对postgres光滑驱动程序的这种硬依赖。以下示例显示了实现。

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
      */
}

具有上述定义。 EmployeeRepository类将提供与数据库交互的接口,如下所示。下面我使用Guice DI框架的JIT绑定,它注入了dbConfigProvider属性。因为EmployeeRepository通过依赖注入来获取构造函数参数,所以确保你永远不会自己实例化类,但是你总是将它注入到其他类中。

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=""

最后你的application.conf应该是数据库的连接信息。 以下示例使用H2数据库连接详细信息。

CUSTOM_ELEMENTS_SCHEMA