使用Flyway插入含${}占位符的数据时报错,求批量插入解决方案
解决Flyway插入含
$字符数据的错误问题 Flyway默认会将SQL脚本中的${...}识别为自身的占位符,尝试从配置中读取对应变量值进行替换。而你需要插入的是包含Spring风格占位符的字符串,这就导致Flyway误解析并抛出"未提供占位符值"的错误——手动插入时没有Flyway的占位符解析环节,所以能成功。
以下是三种可行的解决方法:
方法1:转义$符号
将SQL中每个$替换为$$,Flyway会自动将$$解析回单个$,从而保留原字符串格式:
INSERT INTO property (application, profile, label, property_key, property_value) VALUES ('app', 'dev', 'v1', 'database.master.url', 'jdbc:mysql://$${MYSQL_HOST_NAME:localhost}:$${MYSQL_PORT:3306}/master?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true' );
插入后数据库中存储的内容与手动插入的完全一致,Spring Cloud Config仍能正常解析这些占位符。
方法2:禁用Flyway的占位符解析功能
在Flyway配置中关闭占位符解析,这样所有${...}都会被当作普通字符串处理:
配置文件方式(application.properties)
flyway.placeholders.enabled=false
Java配置方式
@Bean public Flyway flyway(DataSource dataSource) { return Flyway.configure() .dataSource(dataSource) .placeholdersEnabled(false) .locations("classpath:db/migration") .load(); }
注意:此方法会禁用Flyway所有占位符的解析,如果你的其他迁移脚本需要使用Flyway占位符,不推荐使用。
方法3:修改Flyway的占位符前缀后缀
自定义Flyway识别的占位符符号,避免与Spring的${...}冲突:
配置文件方式(application.properties)
flyway.placeholderPrefix=#{{ flyway.placeholderSuffix=}}
之后Flyway只会解析#{{...}}格式的占位符,原脚本中的${...}会被直接插入数据库,不影响Spring Cloud Config的正常使用。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

