sql >> Databáze >  >> RDS >> PostgreSQL

Soubory Playframework evolutions kompatibilní s postgres i h2

Vím, že je to starší příspěvek, ale vypadá to, že o několik let později stále neexistuje zřejmé řešení. jako krátkodobá oprava, ve hře 2.4.x-2.5.x (zatím testováno pouze tam), můžete změnit způsob, jakým jsou evoluce aplikovány během testů, vytvořením vlastní čtečky evolucí:

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

pak jej předejte na místo, kde použijete vývoj během testů:

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

všimněte si, že čtečka je stále v docela hloupém stavu (předpokládá, že příkazy SQL jsou jednořádkové, což není zaručeno), ale to by mělo stačit, aby někdo začal.



  1. Sloučit více řádků do jednoho s více než jednou hodnotou řádku ve sloupci

  2. Jak rozdělím výstup z mysqldump na menší soubory?

  3. Existuje v SQL Server funkce Max, která nabývá dvou hodnot jako Math.Max ​​v .NET?

  4. doktrína - získat další a předchozí záznam