sql >> Database teknologi >  >> RDS >> PostgreSQL

Playframework evolution-filer, der er kompatible med både postgres og h2

Jeg ved, at dette er et ældre indlæg, men det ser ud til, at der ikke er en åbenlys løsning et par år senere. som en kortsigtet rettelse, i spil 2.4.x-2.5.x (indtil videre kun testet der), kan du ændre den måde, evolutioner bliver anvendt under test ved at oprette en tilpasset evolution-læser:

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

så send det til det sted, hvor du anvender evolutioner under dine tests:

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

Bemærk, at læseren stadig er i en ret dum tilstand (den antager, at SQL-sætningerne er oneliners, hvilket ikke er garanteret), men dette burde være nok til at få nogen i gang.



  1. Sådan forbedres antallet af tekstforespørgsler til Django med Postgres

  2. PHP MYSQL:måde at liste tabellen i stigende rækkefølge

  3. Vælg distinkt brugergruppe efter tidsinterval

  4. Sådan opdaterer du en kolonne med sammenkædning af to andre kolonner i samme tabel