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

Play-Slick how to create play.api.db.Database instance from conf?

我正在使用 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,我想使用进化创建一个测试数据库,所以我这样做:

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?

构建所需的数据库实例

好吧,您可以分两步手动完成。

第一步:

我假设您已经在某处安装了 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))