如何忽略Flyway的占位符表达式?

时间:2014-02-26 14:57:24

标签: java mysql flyway

我正在使用flyway版本2.3,我有一个sql补丁,它将varchar插入到一个表中,该表具有Flyway视为占位符的字符序列。我想飞越忽略占位符并按原样运行脚本。

脚本文件是

insert into test_data (value) values ("${Email}");

Java代码是

package foobar;

import com.googlecode.flyway.core.Flyway;

public class App 
{
    public static void main( String[] args )
    {
        // Create the Flyway instance
        Flyway flyway = new Flyway();

        // Point it to the database
        flyway.setDataSource("jdbc:mysql://localhost:3306/flywaytest", "alpha", "beta");

        // Start the migration
        flyway.migrate();
    }
}

6 个答案:

答案 0 :(得分:7)

这可以通过在表达式中分割$和{

来完成
insert into test_data (value) values ('$' || '{Email}')

答案 1 :(得分:6)

您可以将占位符后缀或前缀的值更改为其他值,您应该没问题。

答案 2 :(得分:1)

我遇到了完全相同的问题,但接受的答案不符合我的要求。所以我以另一种方式解决了这个问题并发布了这个答案,希望这对来自谷歌搜索的其他人有用。

如果您无法更改占位符后缀和前缀,则可以通过使用表达式欺骗Flyway,使其相信没有占位符。 E.g:

INSERT INTO test_data(value) VALUES (REPLACE("#{Email}", "#{", "${"));

如果您已经在之前的许多迁移中使用过占位符,那么这非常有用。 (如果您只是更改占位符后缀和前缀,您也必须在以前的迁移脚本中更改它们。但是然后迁移脚本校验和将不匹配,Flyway会正确地抱怨,而您'必须通过调用schema_version或手动更改表来更改Flyway#repair()表中的校验和。)

答案 3 :(得分:0)

尝试以下属性:

        final var flyway = Flyway.configure()
                .dataSource(DataSourceProvider.getInstanceDataSource(instance.getInstanceId()))
                .locations(MIGRATION_PATH + "instance_db")
                .outOfOrder(true)
                .table("schema_version")
                .validateOnMigrate(false)
                .placeholderReplacement(false)
                .load();

答案 4 :(得分:0)

在我的MySQL迁移脚本中,它起作用了:

我只是逃脱了前{个字符,就像这样:

'...<p>\nProgram name: $\{programName}<br />\nStart of studies: $\{startOfStudies}<br />\n($\{semesterNote})\n</p>...'

通过这种方式,flyway不会将它们识别为占位符,并且最终存储的字符串不包含转义符。

...<p>
Program name: ${programName}<br />
Start of studies: ${startOfStudies}<br />
(${semesterNote})
</p>...

答案 5 :(得分:0)

只需将属性添加到您的bootstrap.properties(或您使用的任何内容)

flyway.placeholder-replacement = false