【问题标题】:Play-Slick how to create play.api.db.Database instance from conf?Play-Slick 如何从 conf 创建 play.api.db.Database 实例?
【发布时间】:2016-12-28 19:31:51
【问题描述】:

我正在使用 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 构建所需的数据库实例?

【问题讨论】:

    标签: scala playframework slick


    【解决方案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))
    

    【讨论】:

    • 嗨,帕维尔!一如既往,非常感谢您的帮助!通过我的Module 是否意味着我必须启动并运行一个应用程序才能测试我的 Slick 持久层?我一直在研究更轻量级的 Play 测试方法:withDatabaseEvolutions,请参见此处https://www.playframework.com/documentation/2.5.x/ScalaTestingWithDatabases,但我无法从那里找到如何获取初始化基于 Slick 的 DAO 所需的DatabaseConfigProvider跨度>
    • 好吧,DatabaseConfigProvider 只是这样:trait DatabaseConfigProvider { def get[P &lt;: BasicProfile]: DatabaseConfig[P] } 只需在你的 Guice 模块中放置一个实现上述特征的对象就可以了。
    • 这里是如何在测试中使用轻量级注入(无需设置整个应用程序):playframework.com/documentation/2.5.x/…
    • @PawelDolega With Slick 我无法导入Databases,因为如果带有'jdbc',Slick 说我们必须禁用它。但是 OP 使用 Slick。这怎么能一起工作?
    • 不是Databases 来自Play 世界吗? (顺便说一句,你想达到什么目标?)
    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多