【问题标题】:flyway4, repeatable migration, dynamic checksum change, maven, always executeflyway4,可重复迁移,动态校验和更改,maven,始终执行
【发布时间】:2017-02-01 09:06:26
【问题描述】:

我有一个可重复的 flyway sql 迁移脚本,我希望每次调用 flyway:migrate 时都执行该脚本。

R__Always_Executed.sql:

/* Version: ${timestamp} <- changes on each execution */
...

我在 pom.xml 中定义了占位符timestamp

<properties>
    <flyway.placeholders.timestamp>${maven.build.timestamp}</flyway.placeholders.timestamp>
</properties>

每次都这样做

mvn clean install flyway:migrate

时间戳改变,因此文件内容和校验和应该不同。因此脚本应该被执行。然而,事实并非如此。

任何人都知道,为什么 flyway 在计算校验和时不考虑占位符替换?

【问题讨论】:

    标签: flyway


    【解决方案1】:

    好的,所以我想出了一个解决方法。如果我将位置更改为目标文件夹,每次调用 mvn flyway:migrate 时,flyway 都会执行可重复迁移:

    <plugin>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-maven-plugin</artifactId>
        <version>4.0.3</version>
        <configuration>
            <!-- ... -->
            <locations>
                <location>filesystem:target/classes/db/migration</location>
            </locations>
        </configuration>
    </plugin>
    

    顺便说一句,我检查了我的目标文件夹。 Maven 不会替换 R__Always_Executed.sql 文件中的任何内容。还是这个样子

    /* Version: ${timestamp} <- changes on each execution */
    ...
    

    可能是 flyway 中的一个错误,如果文件位于 src 文件夹中,它不会替换用于校验和计算的变量?希望 Axel 可以对此发表评论。

    【讨论】:

      【解决方案2】:

      这是因为在4.x中被扫描的默认位置是

      filesystem:src/main/resources/db/migration
      

      查看release notes. 中的Improved compatibility with schema-first persistence frameworks 部分以及Maven Plugin migrate documentation 中的locations 条目。

      您的所有配置都不存在,因此很难说哪里出了问题。您是否尝试过在&lt;placeholders&gt; 部分添加timestamp 标签而不是基于属性的版本?有关占位符的示例配置,请参阅Maven Plugin migrate documentation。例如

      <plugin>
          <groupId>org.flywaydb</groupId>
          <artifactId>flyway-maven-plugin</artifactId>
          <version>4.0.3</version>
          <configuration>
              <!-- ... -->
              <placeholders>
                  <timestamp>${maven.build.timestamp}</timestamp>
              </placeholders>
          </configuration>
      </plugin>
      

      【讨论】:

        【解决方案3】:

        Flyway 在占位符替换为实际值之前计算迁移校验和。这意味着${timestamp} 不会成功。

        您可以使用Flyway's callback mechanism,而不是可重复的迁移。创建一个名为 afterMigrate.sql 的 SQL 文件并将其放在与迁移相同的目录中。每次调用flyway:migrate 时都会执行它。它在所有迁移执行后运行——如果您需要在迁移之前运行它,请使用beforeMigrate.sql

        【讨论】:

          猜你喜欢
          • 2020-11-15
          • 2017-11-26
          • 2019-12-09
          • 2015-11-06
          • 1970-01-01
          • 2017-08-13
          • 2016-09-12
          • 1970-01-01
          • 2016-04-13
          相关资源
          最近更新 更多