2016-12-30 1 views
1

Gibt es eine Möglichkeit, den Standardverzeichnispfad für Evolutions zu ändern? Ich brauche das, weil ich die folgenden offenbar seltenen Anwendungsfall habe:Play 2.5.x: Wie ändert man den Speicherort der Standard-Evolutions-Verzeichnisse?

  • Für Dev/Prod verwende ich ein default Datenbank Postgres
  • für Unit-Tests Ich brauche eine H2 verwenden In-Memory-Datenbank
  • evolutions/default/1.sql tragbar ist (Postgres & H2)
  • evolutions/default/2.sql ist nicht tragbar Postgres Skript
  • In Dev/Prod I Entwicklungen benötigen 1.sql und 2.sql
  • laufen
  • In Unit Tests, die ich brauche nur Evolutionen 1.sql

Gibt es eine Möglichkeit zur Verwendung von application.conf oder einige sbt Einstellung alla zum Beispiel laufen

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

der Lage sein, das Standardverzeichnis von Entwicklungen für test zu ändern?

Mein OP wäre gelöst, wenn ich nur sagen könnte, z.B. (! Theoretische funktioniert nicht)

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

und dann haben:

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

ich mit jeder anderen Lösung gerne für dieses Problem, das ich bin mir nicht bewusst ... so lange wie es funktioniert :)

Antwort

4

in Ihrer Testkonfigurationsdatei deaktivieren Sie die Standardanwendung von evolutions, indem Sie diese Zeile hinzufügen.

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

Definieren Sie eine Hilfsmethode in Ihrer Testdatei, die beim Aufruf von Evolutions angewendet wird.

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

Dann in Ihrer Testüberschreibung beforeAll und afterAll Methoden:

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

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

Sie Datenbank zugreifen können, wie folgt:

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