创建 class 定义 class 时播放 Slick 3.0 错误

Play Slick 3.0 errors when creating class definition class

我花了大约 2 个小时或更多时间来完成这项工作。我尝试了不同的导入(您可以在评论中看到)和不同版本的 slick,但它仍然不起作用。这是我的 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"

还有我的 table 定义 class:

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 值,但是代码让我在 class 中使用导入(不是在它之前)所以程序仍然看不到Table类型。

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

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

不要直接使用 slick 作为依赖。使用 play-slick 这是一个灵活的游戏插件。

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

您不应该直接导入您的 postgres 驱动程序。这将引入对 postgres 的硬依赖,因此您的应用程序只能与 postgres 一起工作,并且您不能在 dev/testing 模式下使用 say H2。要使用的适当的 slick 驱动程序应该被依赖注入,以避免这种对 postgres 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)
    }

  }

同上定义。 EmployeeRepository class 将提供与数据库交互的接口,如下所示。下面我使用注入 dbConfigProvider 属性的 Guice DI 框架的 JIT 绑定。由于 EmployeeRepository 通过依赖注入获取构造函数参数,因此请确保您永远不会自己实例化 class,但您总是将其注入其他 classes。

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

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

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