sql >> Database >  >> RDS >> PostgreSQL

Playframework-evolutiesbestanden die compatibel zijn met zowel postgres als h2

Ik weet dat dit een ouder bericht is, maar het lijkt erop dat er een paar jaar later nog steeds geen voor de hand liggende oplossing is. als kortetermijnoplossing kun je in play 2.4.x-2.5.x (tot nu toe alleen daar getest), de manier veranderen waarop evoluties worden toegepast tijdens tests door een aangepaste evolutieslezer te maken:

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

geef het dan door aan de plaats waar je evoluties toepast tijdens je tests:

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

merk op dat de lezer zich nog steeds in een vrij domme toestand bevindt (er wordt aangenomen dat de SQL-statements oneliners zijn, wat niet gegarandeerd is), maar dit zou genoeg moeten zijn om iedereen op weg te helpen.



  1. Loop in trigger met door komma's gescheiden waarden mysql

  2. Toon tabellen met FULLTEXT geïndexeerde kolommen

  3. Maak een PostgreSQL 9-rol met login (gebruiker) alleen om functies uit te voeren

  4. Impliceert een Postgres UNIQUE-beperking een index?