演进sql脚本应该命名为
是否有可能将命名约定更改为
RoR:migrations.html#creating-a-standalone-migration
是的,我评估了https://github.com/flyway/flyway-play,我们可以切换到它。
现在我正在寻找默认的播放功能。
发布于 2017-05-07 16:08:22
是的,有可能。
在此路径上创建一个新文件:your/modules/folder/EvolutionsModule.scala
然后,添加以下内容:
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, "")
)
}
}
}
}转到您的applications.conf,然后添加这些行。这是用来用我们自己的EvolutionsModule替换默认的。
play.modules {
enabled += "your.modules.folder.EvolutionsModule"
disabled += "play.api.db.evolutions.EvolutionsModule"
}对第一段案文的解释:
EvolutionsReader和方法evolutions。evolutions方法之后,演化模块将依赖于生成的数据库条目。因此,我们只需要用我们自己的方法来覆盖这个方法。loadResource函数的功能替换为发展sql文件文件夹中的文件列表。其馀部分是evolutions方法在EvolutionsApi.scala中的直接副本。引用by this answer的源代码是最有可能的实用函数--演化模块实际上并不依赖它。我找不到fileName和resourceName在运行evolutions时的任何重要用途。相反,它们都引用了play_evolutions表。
参考资料:https://github.com/playframework/playframework/issues/6919
发布于 2017-03-31 07:42:31
不,不可能,源代码:
def fileName(db: String, revision: Int): String = s"${directoryName(db)}/${revision}.sql"def resourceName(db: String, revision: Int): String = s"evolutions/${db}/${revision}.sql"@Singleton
class EnvironmentEvolutionsReader @Inject() (environment: Environment) extends ResourceEvolutionsReader {
def loadResource(db: String, revision: Int) = {
environment.getExistingFile(Evolutions.fileName(db, revision)).map(new FileInputStream(_)).orElse {
environment.resourceAsStream(Evolutions.resourceName(db, revision))
}
}
}因此,正如它在文档中描述的那样,您只能使用数字{revision}.sql
https://stackoverflow.com/questions/43093432
复制相似问题