0

我在我的 Lift scala 应用程序中使用了 Slick 框架。此框架要求所有 DDL 对象中都存在 ExtendedProfile.simple._。目前我将其定义为

trait DatabaseProvider {
  val profile : ExtendedProfile
}


trait PersistUser {
  this : DatabaseProvider => 

  import profile.simple._

  object Users extends Table[(String, String, Boolean)]("user") {
      //  various definitions are here
  }
}

我想要的是将对象用户移动到特征之外,因此我可以在不同的特征中单独使用它,例如用于表连接。但我不知道如何使用户对象依赖于范围内 DatabaseProvider 的存在,并导入所有必需的东西。

请指教。

4

2 回答 2

1

您可以这样做,尽管我不确定您正在尝试做的事情是 100%。这里的想法是,您可以首先使用所有表定义定义一个通用模式,这些表定义在不同的数据库提供者之间不会有所不同。然后,您可以扩展您想要支持的每个 db 提供程序,设置objectslick 需要的实际表定义。这将使您可以灵活地指定ExtendedProfile更动态的,我相信这是您的目标。我知道这可以编译,但我没有尝试运行它。我想我会把它留给你。

import scala.slick.driver.ExtendedProfile
import scala.slick.session.Session

abstract class Schema(val profile:ExtendedProfile){
  import profile.simple._

  abstract class UsersModel extends Table[(String, String, Boolean)]("user") {
    def name = column[String]("name", O.PrimaryKey)
    def email = column[String]("email")
    def valid = column[Boolean]("valid")
    def * = name ~ email ~ valid
  }

  val Users:UsersModel
}

object MySqlSchema extends Schema(scala.slick.driver.MySQLDriver){
  object MySqlUsers extends UsersModel

  val Users:UsersModel = MySqlUsers
}

class UserDAO(schema:Schema)(implicit sess:Session){
  import schema.profile.Implicit._

  def findAllUsers = {
    val q = for(u <- schema.Users) yield u
    q.list
  }
}
于 2013-06-14T12:32:28.820 回答
0

而不是一个对象,让它class Users(dbProvider: DatabaseProvider) extends Table......或给它与 PersistUser 相同的自我类型

于 2013-06-13T22:15:56.833 回答