You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:39:59