PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pliki ewolucji Playframework kompatybilne zarówno z postgresem, jak i h2

wiem, że to starszy post, ale wygląda na to, że kilka lat później nie ma oczywistego rozwiązania. jako krótkoterminowa poprawka, w play 2.4.x-2.5.x (do tej pory tylko tam testowane), możesz zmienić sposób, w jaki ewolucje są stosowane podczas testów, tworząc niestandardowy czytnik ewolucji:

Obsługa pakietu
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))
}

następnie przekaż go w miejscu, w którym stosujesz ewolucje podczas testów:

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

zauważ, że czytelnik nadal jest w dość głupim stanie (zakłada, że ​​instrukcje SQL są jednowierszowe, co nie jest gwarantowane), ale powinno to wystarczyć, aby każdy mógł zacząć.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Importowanie pliku JSON do Postgresql 11 w systemie Windows 10

  2. Postgresql -- czyszczenie znaczników HTML w środku ciągu

  3. Jak upuścić jeden klucz łączenia podczas dołączania do dwóch stołów?

  4. Reprezentowanie przyszłości w PostgreSQL

  5. Różnica sygnatury czasowej w godzinach dla PostgreSQL