Bri*_*Hsu 2 types scala scalaquery
当我遵循ScalaQuery的Queries教程时,我发现了一些有趣的东西,我不知道为什么这么好.
这是我定义的数据库模式:
object Users extends Table[(Int, String, String)]("users") {
def id = column[Int]("id", O NotNull)
def first = column[String]("first", O NotNull)
def last = column[String]("last", O NotNull)
def * = id ~ first ~ last
}
Run Code Online (Sandbox Code Playgroud)
这是我使用的查询:
object Main
{
val database = Database.forURL("jdbc:sqlite:sample.db", driver = "org.sqlite.JDBC")
def main(args: Array[String]) {
database withSession {
val query1 = for (user <- Query(Users)) yield user.id ~ user.last
val query2 = for (user <- Users if user.id > 5) yield user.id ~ user ~ last
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以在两者中看到query1并query2使用类似的东西user.id,它似乎user是object Users我刚才在上面定义的单例类型.因此它具有在该对象上定义的所有方法.
但是,如果我尝试直接运行没有yield关键字的查询,例如:
for (user <- Users if user.id > 5) {
println ("UserID:" + user.id)
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器抱怨:
[error] src/main/scala/Test.scala:23: value id is not a member of (Int, String, String)
[error] println ("UserID:" + user.id)
Run Code Online (Sandbox Code Playgroud)
user在println语句中似乎是Tuple3的类型.如果我user像下面的普通元组一样使用它,它会起作用.
for (user <- Users if user.id > 5) {
println ("UserID:" + user._1)
}
Run Code Online (Sandbox Code Playgroud)
你可以看到,在我仍然使用的表达的守护者中user.id,那么它的类型是user什么?为什么我可以user.id在guard和yield块中使用,但我需要将它用作表达体中的元组?
谢谢.
在第一个代码段中:
val query1 = for (user <- Query(Users)) yield user.id ~ user.last
Run Code Online (Sandbox Code Playgroud)
user是object Users因为Query的map方法被定义为def map[F](f: E => F): Query[F],第一个代码片段是equals:
Query(Users).map(user => user.id ~ user.last)
Run Code Online (Sandbox Code Playgroud)
所以E是Users的类型和Users实例是给出的参数f(E):F.
如果要以对象的形式访问行,则需要将Users定义如下:
import org.scalaquery.ql.basic.{BasicTable => Table}
object Users extends Table[User]("users") {
def id = column[Int]("id", O NotNull)
def first = column[String]("first", O NotNull)
def last = column[String]("last", O NotNull)
def * = id ~ first ~ last <> (User, User.unapply _)
}
case class User(id: Int, first: String, last: String)
Run Code Online (Sandbox Code Playgroud)
然后
for (user <- Users if user.id > 5) {
println ("UserID:" + user.id) // user is a User instance
}
Run Code Online (Sandbox Code Playgroud)