はい、可能です。そして、あなたのapplications.conf
に
package your.modules.folder
import javax.inject._
import play.api.db.evolutions._
import play.api.inject.{ Module }
import play.api.libs.Collections
import play.api.{ Configuration, Environment }
import org.apache.commons.io.FileUtils
class EvolutionsModule extends Module {
def bindings(environment: Environment, configuration: Configuration) = {
Seq(
bind[EvolutionsConfig].toProvider[DefaultEvolutionsConfigParser],
bind[EvolutionsReader].to[YourEvolutionsReader],
bind[EvolutionsApi].to[DefaultEvolutionsApi],
bind[ApplicationEvolutions].toProvider[ApplicationEvolutionsProvider].eagerly
)
}
}
@Singleton
class YourEvolutionsReader @Inject()(environment: Environment) extends EvolutionsReader {
def evolutions(db: String): Seq[Evolution] = {
val upsMarker = """^#.*!Ups.*$""".r
val downsMarker = """^#.*!Downs.*$""".r
val UPS = "UPS"
val DOWNS = "DOWNS"
val UNKNOWN = "UNKNOWN"
val mapUpsAndDowns: PartialFunction[String, String] = {
case upsMarker() => UPS
case downsMarker() => DOWNS
case _ => UNKNOWN
}
val isMarker: PartialFunction[String, Boolean] = {
case upsMarker() => true
case downsMarker() => true
case _ => false
}
val folder = environment.getFile(Evolutions.directoryName(db))
val sqlFiles = folder.listFiles()
.filter(file => file.getName.indexOf(".sql") > -1)
.sortBy(file => {
val fileName = file.getName
val nameAfterSqlNumber = fileName.split("\\.")(0).split("_").drop(1).mkString("") + ".sql"
val sqlNumber = fileName.split("\\.")(0).split("_")(0).toInt
val newPrefix = "%07d".format(sqlNumber)
newPrefix + nameAfterSqlNumber
})
.toSeq
sqlFiles.zip(1 to sqlFiles.size)
.map {
case (file, revision) => {
val script = FileUtils.readFileToString(file)
val parsed = Collections.unfoldLeft(("", script.split('\n').toList.map(_.trim))) {
case (_, Nil) => None
case (context, lines) => {
val (some, next) = lines.span(l => !isMarker(l))
Some((next.headOption.map(c => (mapUpsAndDowns(c), next.tail)).getOrElse("" -> Nil),
context -> some.mkString("\n")))
}
}.reverse.drop(1).groupBy(i => i._1).mapValues { _.map(_._2).mkString("\n").trim }
Evolution(
revision,
parsed.getOrElse(UPS, ""),
parsed.getOrElse(DOWNS, "")
)
}
}
}
}
Go]を次の行を追加します。
your/modules/folder/EvolutionsModule.scala
が続いて、次の行を追加します。
は、このパスに新しいファイルを作成します。これはデフォルトの
EvolutionsModule
を独自のものに置き換えるためのものです。テキストの最初のブロックの
play.modules {
enabled += "your.modules.folder.EvolutionsModule"
disabled += "play.api.db.evolutions.EvolutionsModule"
}
説明:
- ソースコードによると、進化は、単に単一のクラスおよびメソッドに基づいて追加される -
EvolutionsReader
及び方法evolutions
。
evolutions
メソッドを実行すると、evolutionsモジュールは生成されたデータベースエントリに依存します。したがって、このメソッドを独自のメソッドでオーバーライドするだけで済みます。
- 膨大なコードブロックにもかかわらず、実際にはソースコードのマイナーな編集です。私は
loadResource
関数の機能をevolutionsのsqlファイルフォルダ内のファイルのリストに置き換えました。それの残りの部分はEvolutionsApi.scala
でevolutions
方法のストレートアップコピーであるby this answerを引用したソースコードは、最も可能性の高いユーティリティ関数です - エボリューションモジュールは、実際にそれに依存しません。私はevolutions
を実行するために、fileName
とresourceName
の重要な使用を見つけることができませんでした。代わりに、彼らはすべてplay_evolutions
テーブルを参照しています。
参考:https://github.com/playframework/playframework/issues/6919
うわー、おかげで...しかし、我々はすでにhttps://flywaydb.orgに切り替えます。 – Sergey
@Sergeyそれは大丈夫です。 IMO、進化を完全に落として、切り替えは正しい決定です(また、滑り落ちますが、それは別の話です)。私はプロジェクトを継承しているのでできませんでした。それでも、私はこの質問に、私と仲間のコード管理者の将来の参照のための正しい答えを持ってほしいと思っていました。特に、私はScalaを長時間使っています。 – blindbox