flyway4,可重复迁移,动态校验和更改,maven,始终执行

时间:2016-09-23 13:21:52

标签: flyway

我有一个可重复的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在计算校验和时不考虑占位符替换?

3 个答案:

答案 0 :(得分:2)

Flyway在占位符替换为实际值之前计算迁移校验和。这意味着${timestamp}将无法解决问题。

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

答案 1 :(得分:0)

好的,所以我想出了一个解决方法。如果我将位置更改为目标文件夹,那么每当调用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 :(得分:0)

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

filesystem:src/main/resources/db/migration

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

您的所有配置都不存在,因此很难说出错了什么。您是否尝试在timestamp部分中添加<placeholders>代码而不是基于属性的版本?有关占位符的示例配置,请参阅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>