尝试在 Slick / Scala 中使用通用 JdbcDriver 时类型不匹配
Type mismatch when trying to use generic JdbcDriver usage in Slick / Scala
我一直在尝试使用通用 JdbcDriver 来使用 Slick,但 运行 遇到了 Scala 类型不匹配错误。如果我在没有 Slick 和 roll-my-own super simple Table & TableQuery mocks 的情况下尝试这个问题不会发生,所以相信这个错误与 Slick 对 Scala 的一些更复杂的使用有关。
以下示例使用 Slick 3.1.1。我也尝试过使用 Slick 3.2.0-M1 进行等效操作(在必要时将驱动程序更改为配置文件),但仍然存在相同的错误。
Whosebug 上似乎有许多 'type mismatch' questions/answers,但我无法解释它们是否与此问题相关,所以请帮助改进我的 Scala/Slick 使用不胜感激。
以下代码生成:
*Error:(37, 25) type mismatch;
found : slick.lifted.TableQuery[dao.PersonTable]
required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser
dbDriver.create(dao.persons) // Creates this error...*
package test
import slick.backend.DatabaseConfig
import slick.driver.JdbcDriver
trait GenericDriver {
val driver: JdbcDriver
}
case class PersonRecord(id: Int, name: String)
trait Person {
self: GenericDriver =>
import driver.api._
class PersonTable(tag: Tag) extends Table[PersonRecord](tag, "persons") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = (id, name) <> (PersonRecord.tupled, PersonRecord.unapply)
}
val persons = TableQuery[PersonTable]
}
class Dao(val driver: JdbcDriver)
extends Person
with GenericDriver
object Test {
def main(args: Array[String]): Unit = {
val dbConfig = DatabaseConfig.forConfig[JdbcDriver]("sampleDb")
val dbDriver = dbConfig.driver
val dao = new Dao(dbDriver)
dbDriver.create(dao.persons) // Creates this error...
//
// Error:(37, 25) type mismatch;
// found : slick.lifted.TableQuery[dao.PersonTable]
// required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser
// dbDriver.create(dao.persons) // Creates this error...
//
}
implicit class ProfileUser(val driver: JdbcDriver) extends GenericDriver {
import driver.api._
def create(tq: TableQuery[_ <: Table[_]]) = tq.schema.create
}
}
有关信息 - build.sbt 是:
name := "test_import"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "3.1.1"
)
这里的问题原来是路径相关类型。
这个 (Whosebug) 问答帮我找到了正确的方向:
.
这篇(外部)文章有助于进一步了解 PDT:
http://danielwestheide.com/blog/2013/02/13/the-neophytes-guide-to-scala-part-13-path-dependent-types.html
我一直在尝试使用通用 JdbcDriver 来使用 Slick,但 运行 遇到了 Scala 类型不匹配错误。如果我在没有 Slick 和 roll-my-own super simple Table & TableQuery mocks 的情况下尝试这个问题不会发生,所以相信这个错误与 Slick 对 Scala 的一些更复杂的使用有关。
以下示例使用 Slick 3.1.1。我也尝试过使用 Slick 3.2.0-M1 进行等效操作(在必要时将驱动程序更改为配置文件),但仍然存在相同的错误。
Whosebug 上似乎有许多 'type mismatch' questions/answers,但我无法解释它们是否与此问题相关,所以请帮助改进我的 Scala/Slick 使用不胜感激。
以下代码生成:
*Error:(37, 25) type mismatch;
found : slick.lifted.TableQuery[dao.PersonTable]
required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser
dbDriver.create(dao.persons) // Creates this error...*
package test
import slick.backend.DatabaseConfig
import slick.driver.JdbcDriver
trait GenericDriver {
val driver: JdbcDriver
}
case class PersonRecord(id: Int, name: String)
trait Person {
self: GenericDriver =>
import driver.api._
class PersonTable(tag: Tag) extends Table[PersonRecord](tag, "persons") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = (id, name) <> (PersonRecord.tupled, PersonRecord.unapply)
}
val persons = TableQuery[PersonTable]
}
class Dao(val driver: JdbcDriver)
extends Person
with GenericDriver
object Test {
def main(args: Array[String]): Unit = {
val dbConfig = DatabaseConfig.forConfig[JdbcDriver]("sampleDb")
val dbDriver = dbConfig.driver
val dao = new Dao(dbDriver)
dbDriver.create(dao.persons) // Creates this error...
//
// Error:(37, 25) type mismatch;
// found : slick.lifted.TableQuery[dao.PersonTable]
// required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser
// dbDriver.create(dao.persons) // Creates this error...
//
}
implicit class ProfileUser(val driver: JdbcDriver) extends GenericDriver {
import driver.api._
def create(tq: TableQuery[_ <: Table[_]]) = tq.schema.create
}
}
有关信息 - build.sbt 是:
name := "test_import"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"com.typesafe.slick" %% "slick" % "3.1.1"
)
这里的问题原来是路径相关类型。
这个 (Whosebug) 问答帮我找到了正确的方向:
这篇(外部)文章有助于进一步了解 PDT: http://danielwestheide.com/blog/2013/02/13/the-neophytes-guide-to-scala-part-13-path-dependent-types.html