Play 2.5.x: 如何更改默认的进化目录位置?
Play 2.5.x: How to change the default evolutions directory location?
有没有办法更改默认的 evolutions 目录位置?我需要这个,因为我有以下明显罕见的用例:
- 对于 Dev/Prod 我使用
default
数据库 Postgres
- 对于单元测试,我需要使用 H2 内存数据库
evolutions/default/1.sql
是可移植的(Postgres 和 H2)
evolutions/default/2.sql
是不可移植的 Postgres 脚本
- 在 Dev/Prod 我需要进化到 运行
1.sql
和 2.sql
- 在单元测试中我只需要 运行
1.sql
有没有办法使用 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)
}
然后在您的测试中覆盖 beforeAll
和 afterAll
方法:
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")
有没有办法更改默认的 evolutions 目录位置?我需要这个,因为我有以下明显罕见的用例:
- 对于 Dev/Prod 我使用
default
数据库 Postgres - 对于单元测试,我需要使用 H2 内存数据库
evolutions/default/1.sql
是可移植的(Postgres 和 H2)evolutions/default/2.sql
是不可移植的 Postgres 脚本- 在 Dev/Prod 我需要进化到 运行
1.sql
和2.sql
- 在单元测试中我只需要 运行
1.sql
有没有办法使用 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)
}
然后在您的测试中覆盖 beforeAll
和 afterAll
方法:
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")