为什么编译失败并显示 "not found: value Users"?

Why does compilation fail with "not found: value Users"?

我想从我的默认数据库 postgres 中检索一行。我已经定义了 table "Users"。

conf/application.conf

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

controllers/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))
  }
}

models/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

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

编译错误消息说明了一切 - 范围内没有可使用的值 Users

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

object UsersDatabase {

    val users = TableQuery[Users]

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

并且错误消失了,因为您正在使用本地 val users 列出数据库中的用户。

Querying in the official documentation of Slick session val is an implicit value of list 中所述(如 final def list(implicit session: SessionDef): List[R]),因此块中的 implicit session

All methods that execute a query take an implicit Session value. Of course, you can also pass a session explicitly if you prefer:

val l = q.list(session)