为什么编译因“未找到:值用户”而失败?

时间:2015-01-11 08:43:41

标签: postgresql scala playframework-2.0 slick

我想从默认数据库postgres中检索一行。我已经定义了表“用户”。

CONF / application.conf

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost:5234/postgres"
db.default.user="postgres"
db.default.password=""

控制器/ Application.scala

package controllers

import models.{UsersDatabase, Users}
import play.api.mvc._

object Application extends Controller {

  def index = Action { 
    Ok(views.html.index(UsersDatabase.getAll))
  }
}

模型/ Users.scala

package models

import java.sql.Date
import play.api.Play.current
import play.api.db.DB
import slick.driver.PostgresDriver.simple._

case class User(
    id: Int,
    username: String,
    password: String,
    full_name: String,
    email: String,
    gender: String,
    dob: Date,
    joined_date: Date
)

class Users(tag: Tag) extends Table[User](tag, "Users") {

    def id = column[Int]("id")
    def username = column[String]("username", O.PrimaryKey)
    def password = column[String]("password")
    def full_name = column[String]("full_name")
    def email = column[String]("email")
    def gender = column[String]("gender")
    def dob = column[Date]("dob")
    def joined_date = column[Date]("joined_date")
    def * = (id, username, password, full_name, email, gender, dob, joined_date) <> (User.tupled, User.unapply)
}

object UsersDatabase {

    def getAll: List[User] = {
        Database.forDataSource(DB.getDataSource()) withSession {
            Query(Users).list
        }
    }
}

访问http://localhost:9000/时会出现编译错误:

[error] .../app/models/Users.scala:36: not found: value Users
[error]             Query(Users).list
[error]                   ^
[error] one error found
[error] (compile:compile) Compilation failed

如何正确解决此错误并访问数据?

1 个答案:

答案 0 :(得分:2)

编译错误消息说明了所有内容 - 在范围内没有值Users

将对象UsersDatabase更改为如下所示:

object UsersDatabase {

    val users = TableQuery[Users]

    def getAll: List[User] = {
        Database.forDataSource(DB.getDataSource()) withSession { implicit session =>
            users.list
        }
    }
}

由于您使用本地val users列出数据库中的用户,因此错误消失了。

正如S session val官方文档中的Querying所述,隐式值为listfinal def list(implicit session: SessionDef): List[R]),因此implicit session为块:

  

执行查询的所有方法都采用隐式会话值。的   当然,如果您愿意,也可以明确传递会话:

val l = q.list(session)