Scala slick 3.2-如何定义;“摘要”;有表和查询定义但没有具体概要文件的trait?

Scala slick 3.2-如何定义;“摘要”;有表和查询定义但没有具体概要文件的trait?,scala,slick-3.0,Scala,Slick 3.0,我希望在不直接导入最终数据库概要文件(H2、MySQL等)的情况下定义查询和表,因此在单元测试中我将使用H2,而在登台/生产中我将使用MySQL。到目前为止,我还没有找到一种方法来导入所有必要的抽象组件以使其正常工作: import slick.jdbc.H2Profile.api._ class OAuthCredentialsTable(tag: Tag) extends Table[OAuth](tag, "credentials_oauth") { def username: R

我希望在不直接导入最终数据库概要文件(H2、MySQL等)的情况下定义查询和表,因此在单元测试中我将使用H2,而在登台/生产中我将使用MySQL。到目前为止,我还没有找到一种方法来导入所有必要的抽象组件以使其正常工作:

import slick.jdbc.H2Profile.api._

class OAuthCredentialsTable(tag: Tag) extends Table[OAuth](tag, "credentials_oauth") {

  def username: Rep[String] = column[String]("username", O.SqlType("VARCHAR"))

  def service: Rep[String] = column[String]("service", O.SqlType("VARCHAR"))

  def serviceId: Rep[String] = column[String]("service_id", O.SqlType("VARCHAR"))

  def userRef: ForeignKeyQuery[UserTable, User] = foreignKey("oauth_user_fk", username, userTable)(_.username, onDelete = ForeignKeyAction.Cascade)

  override def * = (username, service, serviceId) <> (OAuth.tupled, OAuth.unapply)

}

val oauthTable: TableQuery[OAuthCredentialsTable] = TableQuery[OAuthCredentialsTable]
import slick.jdbc.H2Profile.api_
类OAuthCredentialsTable(tag:tag)扩展了表[OAuth](tag,“credentials_OAuth”){
def username:Rep[String]=列[String](“username”,O.SqlType(“VARCHAR”))
def服务:Rep[String]=列[String](“服务”,O.SqlType(“VARCHAR”))
def serviceId:Rep[String]=列[String](“服务id”,O.SqlType(“VARCHAR”))
def userRef:ForeignKeyQuery[UserTable,User]=foreignKey(“oauth_User_fk”,username,UserTable)(uuu.username,onDelete=ForeignKeyAction.Cascade)
覆盖def*=(用户名、服务、服务ID)(OAuth.tuple、OAuth.unapply)
}
val oauthTable:TableQuery[OAuthCredentialsTable]=TableQuery[OAuthCredentialsTable]

我希望我没弄错,您可以通过注入和配置来实现,将测试配置与产品分离

所以我想你可以这样做-

创建用于注入的绑定-

class DbModule extends Module {
  bind[slick.driver.JdbcProfile#Backend#Database] toNonLazy DatabaseConfigProvider.get[JdbcProfile](inject[Application]).db
}
然后(例如)-


abstract class BaseDaoImpl[T我希望我说得对,您可以通过注入和配置来实现它,将测试配置与产品分离

所以我想你可以这样做-

创建用于注入的绑定-

class DbModule extends Module {
  bind[slick.driver.JdbcProfile#Backend#Database] toNonLazy DatabaseConfigProvider.get[JdbcProfile](inject[Application]).db
}
然后(例如)-


抽象类BaseDaoImpl[T最终我发现,要完成驱动程序无关的设置,可以这么简单:

object UserPersistence extends JdbcProfile {

  import api._

  class UserTable(tag: Tag) extends Table[User](tag, "users") {
    def username: Rep[String] = column[String]("username", O.PrimaryKey, O.SqlType("VARCHAR"))

    def password: Rep[String] = column[String]("password", O.SqlType("VARCHAR"))

    def serverkey: Rep[String] = column[String]("serverkey", O.SqlType("VARCHAR"), O.Length(64))

    def salt: Rep[String] = column[String]("salt", O.SqlType("VARCHAR"), O.Length(64))

    def iterations: Rep[Int] = column[Int]("iterationcount", O.SqlType("INT"))

    def created: Rep[Timestamp] = column[Timestamp]("created_at", O.SqlType("TIMESTAMP"))

    val mkUser: ((String, String, String, String, Int, Timestamp)) ⇒ User = {
      case ((name, pwd, _, _, _, created)) ⇒ User(name, pwd, created.toInstant)
    }

    def unMkUser(u: User) = Some(u.username, u.password, "", "", 0, new Timestamp(u.createdAt.toEpochMilli))

    override def * = (username, password, serverkey, salt, iterations, created) <> (mkUser, unMkUser)
  }

  val userTable: TableQuery[UserTable] = TableQuery[UserTable]

}
然后在测试中

val impl = new UserPersistence {

  override def db: H2Profile.api.Database = // initialize and populate the database

  override implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.global

}

对于MySql,只需将MySql配置文件分配给
db
属性(并更改类型)。

最终我发现,要完成驱动程序无关的设置,可以这么简单:

object UserPersistence extends JdbcProfile {

  import api._

  class UserTable(tag: Tag) extends Table[User](tag, "users") {
    def username: Rep[String] = column[String]("username", O.PrimaryKey, O.SqlType("VARCHAR"))

    def password: Rep[String] = column[String]("password", O.SqlType("VARCHAR"))

    def serverkey: Rep[String] = column[String]("serverkey", O.SqlType("VARCHAR"), O.Length(64))

    def salt: Rep[String] = column[String]("salt", O.SqlType("VARCHAR"), O.Length(64))

    def iterations: Rep[Int] = column[Int]("iterationcount", O.SqlType("INT"))

    def created: Rep[Timestamp] = column[Timestamp]("created_at", O.SqlType("TIMESTAMP"))

    val mkUser: ((String, String, String, String, Int, Timestamp)) ⇒ User = {
      case ((name, pwd, _, _, _, created)) ⇒ User(name, pwd, created.toInstant)
    }

    def unMkUser(u: User) = Some(u.username, u.password, "", "", 0, new Timestamp(u.createdAt.toEpochMilli))

    override def * = (username, password, serverkey, salt, iterations, created) <> (mkUser, unMkUser)
  }

  val userTable: TableQuery[UserTable] = TableQuery[UserTable]

}
然后在测试中

val impl = new UserPersistence {

  override def db: H2Profile.api.Database = // initialize and populate the database

  override implicit val ec: ExecutionContext = scala.concurrent.ExecutionContext.global

}

对于MySql,只需将MySql配置文件分配给
db
属性(并更改类型)。

我使用此配置来更改application.conf文件中的db配置文件

import slick.jdbc.JdbcProfile
import slick.basic._
trait DBComponent {
    // use the application.conf to change the profile  
    val database = DatabaseConfig.forConfig[JdbcProfile]("h2")  
    val driver = database.profile

}


trait BankTable extends DBComponent  {
    import driver.api._
    class BankTable(tag: Tag) extends Table[Bank](tag, "bank") {
        val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
        val name = column[String]("name")
        def * = (name, id.?) <> (Bank.tupled, Bank.unapply)

    }

    protected val bankTableQuery = TableQuery[BankTable]
    protected def bankTableAutoInc = bankTableQuery returning 
bankTableQuery.map(_.id)
}

class BankRepositoryBDImpl extends BankTable  with BankRepository  {
    import driver.api._
    val db = database.db
    def createBank(bank: Bank): Future[Int] = db.run { bankTableAutoInc += bank }
}

我使用此配置来更改application.conf文件中的DB配置文件

import slick.jdbc.JdbcProfile
import slick.basic._
trait DBComponent {
    // use the application.conf to change the profile  
    val database = DatabaseConfig.forConfig[JdbcProfile]("h2")  
    val driver = database.profile

}


trait BankTable extends DBComponent  {
    import driver.api._
    class BankTable(tag: Tag) extends Table[Bank](tag, "bank") {
        val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
        val name = column[String]("name")
        def * = (name, id.?) <> (Bank.tupled, Bank.unapply)

    }

    protected val bankTableQuery = TableQuery[BankTable]
    protected def bankTableAutoInc = bankTableQuery returning 
bankTableQuery.map(_.id)
}

class BankRepositoryBDImpl extends BankTable  with BankRepository  {
    import driver.api._
    val db = database.db
    def createBank(bank: Bank): Future[Int] = db.run { bankTableAutoInc += bank }
}

回答时别忘了检查问题的年龄。这一个没有被接受的答案,这可能会对未来的人有所帮助,否则对我来说是好事。回答时别忘了检查问题的年龄。这一个没有被接受的答案,这可能会对未来的人有所帮助,否则对我来说是好事。