मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन ऐसा लगता है कि कुछ साल बाद भी कोई स्पष्ट समाधान नहीं है। एक अल्पकालिक सुधार के रूप में, प्ले 2.4.x-2.5.x (अभी तक केवल वहां परीक्षण किया गया) में, आप कस्टम इवोल्यूशन रीडर बनाकर परीक्षण के दौरान इवोल्यूशन लागू होने के तरीके को बदल सकते हैं:
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))
}
फिर इसे उस स्थान पर पास करें जहां आप अपने परीक्षणों के दौरान विकास लागू करते हैं:
Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())
ध्यान दें कि पाठक अभी भी एक बहुत ही गूंगा स्थिति में है (यह मानता है कि SQL कथन ऑनलाइनर हैं, जिसकी गारंटी नहीं है), लेकिन यह किसी को भी शुरू करने के लिए पर्याप्त होना चाहिए।