一般的なJdbcDriverを使用してSlickを使用しようとしていて、Scalaタイプの不一致エラーが発生しました。私がSlickとRoll-My-ownのスーパーシンプルなテーブルなしでこれを試してみると、この問題は発生しないので、Slickのより洗練されたScalaの使用に関するエラーが考えられます。Slick/ScalaでジェネリックJdbcDriverを使用しようとするとタイプが一致しません
以下の例では、Slick 3.1.1を使用しています。私はSlick 3.2.0-M1(必要に応じてドライバを変更してドライバを変更する)と同等の機能を試しましたが、同じエラーがあります。
StackOverflowに「タイプミスマッチ」の質問/回答が多数あるようですが、この問題に関連していると解釈できないため、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"
)
:
そして、この(外部)の記事は、PDTのさらなる理解を手伝ってくれました。 これにより、同様のエラーメッセージが生成されます。 'エラー:(37,25)タイプの不一致。 が見つかりました:dao.driver.profile.api.TableQuery [_ $ 1]ここでタイプ_ $ 1 <:dao.driver.profile.api.Table [_] (展開先は)slick.lifted.TableQuery [_ $ 1] 必須:slick.lifted.TableQuery [_ <:_2.driver.profile.Table [val] _2:test.Test.ProfileUser dbDriver.create(dao.persons) ' –