Play-Slick如何从conf创建play.api.db.Database实例?

时间:2016-12-28 19:31:51

标签: scala playframework slick

我使用Slick 3.1.1和Play 2.5.10并拥有以下application.conf

slick.dbs {
  default {
    driver="slick.driver.PostgresDriver$"
    db.driver="org.postgresql.Driver"
    db.url="jdbc:postgresql://localhost:5432/exampledb?searchpath=public"
    db.user="postgres"
    db.password="postgres"
  }
  test {
    driver="slick.driver.H2Driver$"
    db.driver="org.h2.Driver"
    db.url="jdbc:h2:mem:test;MODE=PostgreSQL"
    db.username="sa"
    db.password=""
  }
}

并测试我的Daos我想使用evolutions创建一个测试数据库,所以我这样做:

package dao

import org.scalatest.BeforeAndAfter
import play.api.db.evolutions.Evolutions

trait BeforeAndAfterDao extends BeforeAndAfter {
  before {
    Evolutions.applyEvolutions("test") // <<< doesn't compile, needs Database instance
  }

  after {
    Evolutions.cleanupEvolutions("test") // <<< doesn't compile, needs Database instance
  }
}

但遗憾的是我需要创建一个play.api.db.Database来传递给apply/cleanupEvolutions。如何从application.conf

构建所需的数据库实例

1 个答案:

答案 0 :(得分:1)

嗯,你可以分两步手动完成。

第一步:

我假设您已经在某个地方拥有Config,所以您可以像这样注入它:

@Inject()(config: Config) 

如果你不这样做(你通常总是在大多数时候都需要从中读取一些内容),你可以随时公开它(在你的注射剂Module内):

bind[Config].to(ConfigFactory.load("application.conf")).in(classOf[Singleton])

然后:

  val driver = config.getString("slick.dbs.default.db.driver")
  val url = config.getString("slick.dbs.default.db.url")
  val user = config.getString("slick.dbs.default.db.user")
  val password = config.getString("slick.dbs.default.db.password")

第二次创建数据库:

val db = Databases(driver, url, 
    config = Map("username" -> user, 
                 "password" -> password))