【发布时间】:2015-06-02 10:38:32
【问题描述】:
我正在使用 slick 3.0。我只是想将一些数据库设置代码集中到一个特征中。
以下是我所拥有的:
import slick.driver.H2Driver.api._
import scala.concurrent.Await
import scala.concurrent.duration.Duration
object EventFixtures {
val table = TableQuery[EventsTable]
val data = Seq(...)
def insertFixtures(db: Database): Int = {
Await.result(db.run(table.schema.create), Duration.Inf)
Await.result(db.run(table ++= data), Duration.Inf).get
}
}
我已将其提升并转换为一个特征:
import slick.driver.H2Driver.api._
import scala.concurrent.Await
import scala.concurrent.duration.Duration
trait FixtureHelper {
val data: Seq
val table: ???
def insertFixtures(db: Database) = {
Await.result(db.run(table.schema.create), Duration.Inf)
Await.result(db.run(table ++= data), Duration.Inf).get
}
}
我想像这样使用它:
object EventFixtures extends FixtureHelper {
val data = Seq(...)
val table = TableQuery[EventsTable]
}
// in test code:
EventFixtures.insertFixtures()
问题在于table 的类型。
-
table的类型为:slick.lifted.TableQuery[_ <: AbstractTable],只有当我使用这种类型时才会找到++=行,但无论如何都不会发生 seq 的隐式转换。 -
table.schema具有类型:slick.profile.RelationalProfile#TableQueryExtensionMethods,如果我在第 1 点中声明table,则找不到此属性。 -
table.schema.create的类型为:slick.driver.JdbcActionComponent$SchemaActionExtensionMethodsImpl,如果我在第 2 点中声明table,则找不到此属性。
在原始代码中,表被实例化为TableQuery,slick 使用一些隐式转换来添加其他属性。它还必须将data seq 转换为E#TableElementType 的Iterable。
那么我怎样才能一般地输入table 以便编译这个特征并且可以找到所有这些隐式添加的成员?
我认为这很简单,但似乎除非我用具体的类实例化TableQuery,否则整个事情就会崩溃。事实上,在我的不同夹具文件中,我确实用一个具体的表来实例化 TableQuery,所以我只需要让编译器知道它可以使用哪些属性和方法。
【问题讨论】: