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