Tôi biết đây là một bài viết cũ hơn, nhưng có vẻ như vẫn chưa có giải pháp rõ ràng trong một vài năm sau đó. như một bản sửa lỗi ngắn hạn, trong lần chơi 2.4.x-2.5.x (cho đến nay mới chỉ được thử nghiệm ở đó), bạn có thể thay đổi cách áp dụng các diễn biến trong quá trình thử nghiệm bằng cách tạo trình đọc diễn biến tùy chỉnh:
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))
}
sau đó chuyển nó vào nơi bạn áp dụng các tiến trình trong quá trình thử nghiệm của mình:
Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())
lưu ý rằng trình đọc vẫn ở trong trạng thái khá ngu ngốc (giả định rằng các câu lệnh SQL là một dòng, điều này không được đảm bảo), nhưng điều này sẽ đủ để mọi người bắt đầu.