sql >> Databasteknik >  >> RDS >> PostgreSQL

Playframework evolution-filer som är kompatibla med både postgres och h2

Jag vet att detta är ett äldre inlägg, men det verkar som att det inte finns någon uppenbar lösning ännu några år senare. som en kortsiktig fix, i spel 2.4.x-2.5.x (hittills endast testat där), kan du ändra hur evolutioner appliceras under tester genom att skapa en anpassad evolution-läsare:

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

skicka den sedan till den plats där du tillämpar evolutioner under dina tester:

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

Observera att läsaren fortfarande är i ett ganska dumt tillstånd (den antar att SQL-satserna är oneliners, vilket inte är garanterat), men detta borde vara tillräckligt för att få någon igång.



  1. Hur tar jag reda på _exakt_ felet från SQL Server

  2. Skapa ett sökformulär i PHP för att söka i en databas?

  3. När ska STRAIGHT_JOIN användas med MySQL

  4. Förbigå tabellbehörighet och MED BETYDNINGSALTERNATIV genom att skapa vyer