PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fichiers d'évolutions Playframework compatibles avec postgres et h2

Je sais que c'est un article plus ancien, mais il semble qu'il n'y ait pas encore de solution évidente quelques années plus tard. comme solution à court terme, dans le jeu 2.4.x-2.5.x (jusqu'à présent uniquement testé là-bas), vous pouvez modifier la façon dont les évolutions sont appliquées pendant les tests en créant un lecteur d'évolutions personnalisé :

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

puis passez-le à l'endroit où vous appliquez les évolutions lors de vos tests :

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

notez que le lecteur est toujours dans un état assez stupide (il suppose que les instructions SQL sont des oneliners, ce qui n'est pas garanti), mais cela devrait suffire à démarrer.