首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将play演进sql脚本命名为?

是否可以将play演进sql脚本命名为?
EN

Stack Overflow用户
提问于 2017-03-29 12:23:59
回答 2查看 1K关注 0票数 1

演进sql脚本应该命名为

  • 1.sql,
  • 2.sql,
  • XXX.sql

根据文件。https://www.playframework.com/documentation/2.5.x/Evolutions#Running-evolutions-using-compile-time-DI

是否有可能将命名约定更改为

  • 1_create__customers.sql
  • 2_create__orders.sql
  • 3_alter__customers__add__home_address.sql

RoR:migrations.html#creating-a-standalone-migration

是的,我评估了https://github.com/flyway/flyway-play,我们可以切换到它。

现在我正在寻找默认的播放功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-07 16:08:22

是的,有可能。

在此路径上创建一个新文件:your/modules/folder/EvolutionsModule.scala

然后,添加以下内容:

代码语言:javascript
复制
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替换默认的。

代码语言:javascript
复制
play.modules {
    enabled += "your.modules.folder.EvolutionsModule"
    disabled += "play.api.db.evolutions.EvolutionsModule"
}

对第一段案文的解释:

  • 根据源代码,演化完全基于一个类和方法-- EvolutionsReader和方法evolutions
  • 运行evolutions方法之后,演化模块将依赖于生成的数据库条目。因此,我们只需要用我们自己的方法来覆盖这个方法。
  • 尽管代码块很大,但它实际上是源代码的一个小编辑。我将loadResource函数的功能替换为发展sql文件文件夹中的文件列表。其馀部分是evolutions方法在EvolutionsApi.scala中的直接副本。

引用by this answer的源代码是最有可能的实用函数--演化模块实际上并不依赖它。我找不到fileNameresourceName在运行evolutions时的任何重要用途。相反,它们都引用了play_evolutions表。

参考资料:https://github.com/playframework/playframework/issues/6919

票数 5
EN

Stack Overflow用户

发布于 2017-03-31 07:42:31

不,不可能,源代码:

代码语言:javascript
复制
def fileName(db: String, revision: Int): String = s"${directoryName(db)}/${revision}.sql"

https://github.com/playframework/playframework/blob/2.5.x/framework/src/play-jdbc-evolutions/src/main/scala/play/api/db/evolutions/Evolutions.scala#L103

代码语言:javascript
复制
def resourceName(db: String, revision: Int): String = s"evolutions/${db}/${revision}.sql"

https://github.com/playframework/playframework/blob/2.5.x/framework/src/play-jdbc-evolutions/src/main/scala/play/api/db/evolutions/Evolutions.scala#L108

代码语言:javascript
复制
@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))
    }
  }
}

https://github.com/playframework/playframework/blob/2.5.x/framework/src/play-jdbc-evolutions/src/main/scala/play/api/db/evolutions/EvolutionsApi.scala#L471-L479

因此,正如它在文档中描述的那样,您只能使用数字{revision}.sql

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43093432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档