创建 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=""
我花了大约 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=""