当我跟随ScalaQuery的查询教程时,我发现了一些有趣的东西,我不知道为什么。
下面是我定义的数据库模式:
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
}下面是我使用的查询:
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
}
}
}在本例中,您可以看到在query1和query2中都使用了类似user.id的东西,看起来user是我在上面定义的单例object Users的类型。因此,它具有在该对象上定义的所有方法。
但是如果我尝试在不使用yield关键字的情况下直接运行查询,例如:
for (user <- Users if user.id > 5) {
println ("UserID:" + user.id)
}在这种情况下,编译器会报错:
[error] src/main/scala/Test.scala:23: value id is not a member of (Int, String, String)
[error] println ("UserID:" + user.id)看起来println语句中的user是Tuple3类型。如果我像下面这样像使用普通元组一样使用user,它将会工作。
for (user <- Users if user.id > 5) {
println ("UserID:" + user._1)
}你可以看到,为了保护for表达式,我仍然使用user.id,那么user的类型是什么?为什么我可以在防护和让步块中使用user.id,但我需要在for表达式的主体中使用它作为元组?
谢谢。
发布于 2011-03-28 14:53:21
在第一个代码片段中:
val query1 = for (user <- Query(Users)) yield user.id ~ user.lastuser为object Users,因为查询的映射方法被定义为def map[F](f: E => F): Query[F],所以第一个代码片段为equals:
Query(Users).map(user => user.id ~ user.last)因此,E是Users的类型,Users实例是提供给f(E):F的参数。
如果您希望将row作为对象进行访问,则需要按如下方式定义用户:
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)然后
for (user <- Users if user.id > 5) {
println ("UserID:" + user.id) // user is a User instance
}https://stackoverflow.com/questions/5454053
复制相似问题