Scala slick 3.2-如何定义;“摘要”;有表和查询定义但没有具体概要文件的trait?
我希望在不直接导入最终数据库概要文件(H2、MySQL等)的情况下定义查询和表,因此在单元测试中我将使用H2,而在登台/生产中我将使用MySQL。到目前为止,我还没有找到一种方法来导入所有必要的抽象组件以使其正常工作: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
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 }
}
回答时别忘了检查问题的年龄。这一个没有被接受的答案,这可能会对未来的人有所帮助,否则对我来说是好事。回答时别忘了检查问题的年龄。这一个没有被接受的答案,这可能会对未来的人有所帮助,否则对我来说是好事。