我知道這是一個較舊的帖子,但它看起來像幾年後還沒有明顯的解決方案。
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))
}
然後將它傳遞:作爲一種短期修復,在遊戲的2.4.x-2.5.X(到目前爲止只測試了那裏),你可以通過創建一個自定義的變陣讀者改變在測試過程中變陣得到應用方式到您在您的測試應用變陣的地方:
Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())
注意,讀者仍處於一個非常愚蠢的狀態(它假定SQL語句oneliners,這是不保證的),但是這應該是足夠的讓任何人開始。
很高興知道,至少有一種方法可以解決這個問題。我們仍然在Play 2.3上,似乎沒有辦法重新命名列名。這就是爲什麼標準是好的,只有所有的供應商都遵循了這個標準...... –