PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Playframework Evolutions-Dateien, die sowohl mit postgres als auch mit h2 kompatibel sind

Ich weiß, dass dies ein älterer Beitrag ist, aber es sieht so aus, als gäbe es noch einige Jahre später keine offensichtliche Lösung. Als kurzfristige Lösung können Sie in Play 2.4.x-2.5.x (bisher nur dort getestet) die Art und Weise ändern, wie Evolutionen während Tests angewendet werden, indem Sie einen benutzerdefinierten Evolutionsleser erstellen:

package support

import play.api.db.evolutions.{ClassLoaderEvolutionsReader, Evolutions, ResourceEvolutionsReader}

import java.io.{ByteArrayInputStream, InputStream}
import java.nio.charset.StandardCharsets
import scala.io.Source
import scala.util.Try

class EvolutionTransformingReader(
    classLoader: ClassLoader = classOf[ClassLoaderEvolutionsReader].getClassLoader,
    prefix: String = "")
  extends ResourceEvolutionsReader {

  def loadResource(db: String, revision: Int): Option[InputStream] =
    for {
      stream <- Option(classLoader.getResourceAsStream(prefix + Evolutions.resourceName(db, revision)))
      lines <- Try(Source.fromInputStream(stream).getLines).toOption
      updated = lines map convertPostgresLinesToH2
    } yield convertLinesToInputStream(updated)

  private val ColumnRename = """(?i)\s*ALTER TABLE (\w+) RENAME COLUMN (\w+) TO (\w+);""".r

  private def convertPostgresLinesToH2(line: String): String =
    line match {
      case ColumnRename(tableName, oldColumn, newColumn) =>
        s"""ALTER TABLE $tableName ALTER COLUMN $oldColumn RENAME TO $newColumn;"""
      case _ => line
    }

  private def convertLinesToInputStream(lines: Iterator[String]): InputStream =
    new ByteArrayInputStream(lines.mkString("\n").getBytes(StandardCharsets.UTF_8))
}

Übergeben Sie es dann an die Stelle, an der Sie während Ihrer Tests Evolutionen anwenden:

Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())

Beachten Sie, dass sich der Leser immer noch in einem ziemlich dummen Zustand befindet (er geht davon aus, dass die SQL-Anweisungen Einzeiler sind, was nicht garantiert ist), aber das sollte ausreichen, um jedem den Einstieg zu erleichtern.