2016-12-30 91 views
1

有沒有辦法改變默認的evolutions目錄位置?我需要這個,因爲我有以下明顯罕見的用例:播放2.5.x:如何更改默認演變目錄位置?

  • 對於開發/生產我用一個default數據庫的Postgres
  • 進行單元測試,我需要使用H2內存數據庫
  • evolutions/default/1.sql是可移植的(Postgres的& H2)
  • evolutions/default/2.sql是不可移植的Postgres腳本
  • 在開發/生產我需要變陣運行1.sql2.sql
  • 在單元測試中,我需要變陣只運行1.sql

有沒有辦法使用application.conf或一些sbt設置阿拉例如

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

能夠更改test的演變默認目錄嗎?

我的OP將被解決,如果只有我可以說例如(!理論上不工作)

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

,然後有:

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

我會很樂意與這個問題的任何其他解決方案,我不知道的......只要因爲它的工作原理:)

回答

4

在您的測試配置文件中通過添加此行來關閉進化的默認應用程序。

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

在您的測試文件中定義一個幫助器方法,它將在調用時應用Evolution。

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")