我正在使用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();
}
}
答案 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