Flyway无法识别正确的占位符“ $ {”

问题描述

我最近一直在尝试将飞行路线从v4升级到v6.5.3。在此过程中,我遇到了一个与占位符有关的问题。

迁移失败,并出现以下错误

错误:无法解析以下内容中的语句 D:\ Softwares \ flyway-commandline-6.5.5-windows-x64 \ flyway-6.5.5 \ sql \ V3__MysqL-7.0.sql 在第101行第1行。请参见 https://flywaydb.org/documentation/knownparserlimitations了解更多 信息:未为占位符提供任何值:$ {')Now(),Now())}。 检查您的配置!原因:没有提供任何值 占位符:$ {'),Now(),Now())}。检查您的配置!

sql

insert into `configuration`(key,value,created_date,updated_date) values('LOG_LOCATION',REPLACE('${MY_LOG_LOCATION}','#{','${'),Now(),Now());

解决上述故障,我将“ $ {”替换为“ $ \ {”,但这并不是我所不希望的。
在调试flyway代码时,我发现它无法解析sql代码(在验证过程中,方法为org.flywaydb.core.internal.parser.Parser.readToken())。

为什么要考虑将REPLACE函数的第三个参数用作占位符?

注意:上面的sql在Flyway v4中有效

解决方法

如果您阅读documentation here,则可以看到flyway对其占位符$ {somestring}使用了特定的语法。在您的代码中,您有一个$ {,但未定义占位符。尽管Flyway是一个非常复杂的工具,但是这里的机制只是使用字符串匹配。如果需要,可以修改Flyway实例以将不同的转义符用于占位符。如果您必须在代码中包含与该$ {语法匹配的字符串,那么这可能很方便。 You can read about that here。向下滚动到定义PlaceHolderPrefix和PlaceHolderSuffix的位置。将这些更改为代码中未使用的其他值组合,就可以了。