Play 2.5.x: 如何更改默认的进化目录位置?

Play 2.5.x: How to change the default evolutions directory location?

有没有办法更改默认的 evolutions 目录位置?我需要这个,因为我有以下明显罕见的用例:

有没有办法使用 application.conf 或一些 sbt 设置,例如

javaOptions in Test += "-Dconfig.file=conf/application.test.conf"

可以更改 test 的默认进化目录吗?

只要我能说例如(理论上是行不通的!)

javaOptions in Test += "-Devolutions.prefix=conf/testdatabase/"

然后有:

conf/
    evolutions/default/1.sql 
                       2.sql
    testdatabase/evolutions/default/1.sql -> ../../../evolutions/default/1.sql

对于我不知道的这个问题的任何其他解决方案,我都会很高兴......只要它有效:)

在您的测试配置文件中,通过添加此行关闭 evolutions 的默认应用程序。

# Evolutions should not be applied by default
play.evolutions.db.default.enabled = false

在您的测试文件中定义一个辅助方法,该方法将在调用时应用 Evolutions。

import play.api.db.Database
import play.api.db.evolutions.{DatabaseEvolutions, EvolutionsReader, ThisClassLoaderEvolutionsReader}

def applyEvolutions(database: Database,
                      evolutionsToSkip: Seq[Int],
                      evolutionsReader: EvolutionsReader = ThisClassLoaderEvolutionsReader,
                      autocommit: Boolean = true,
                      schema: String = ""): Unit = {
    val dbEvolutions = new DatabaseEvolutions(database, schema)
    val evolutions = dbEvolutions.scripts(evolutionsReader).filterNot(s => evolutionsToSkip.contains(s.evolution.revision))
    dbEvolutions.evolve(evolutions, autocommit)
  }

然后在您的测试中覆盖 beforeAllafterAll 方法:

override def beforeAll(): Unit = {
    applyEvolutions(database, Seq(2))
  }

  override def afterAll(): Unit = {
    Evolutions.cleanupEvolutions(database)
  }

您可以按如下方式访问数据库:

import play.api.db.{ DBApi, Database }
val databaseAPI = app.injector.instanceOf[DBApi]
val database = databaseAPI.database("default")