Liquibase上传CSV双精度值到PostgreSQL出现类型不匹配报错
问题根因
Liquibase的loadData变更默认将CSV中所有未显式声明类型的字段按VARCHAR类型传入预编译SQL,PostgreSQL不支持将字符串类型隐式转换为double precision双精度浮点类型,因此抛出类型不匹配异常。你之前尝试指定NUMERIC类型无法解决问题,因为NUMERIC是精确数值类型,和目标列的double precision类型不匹配,PostgreSQL同样不会做隐式跨类型转换。
修复方法
在loadData配置节点下正确嵌套columns配置,显式将所有浮点列的类型声明为DOUBLE(Liquibase会自动将该类型映射为PostgreSQL适配的double precision类型),修改后的完整配置如下:
databaseChangeLog: - changeSet: id: usagesCsvData author: malte_enbergs changes: - loadData: tableName: usages separator: ; file: classpath:/liquibase/data/usages.csv columns: - column: header: cost type: DOUBLE - column: header: cost_total_amount_due type: DOUBLE
注意事项
- 配置时注意YAML缩进层级,
columns必须是loadData的子节点,缩进错误会导致类型声明完全不生效,这是最常见的配置踩坑点。 - 如果后续导入时其他列也报同类类型错误,按相同规则补充类型声明即可:整型字段对应
BIGINT/INTEGER类型,你CSV里的时间字段对应TIMESTAMP类型。 - 不需要修改CSV原始数据格式,你当前CSV里的浮点值写法完全符合导入要求。
内容的提问来源于stack exchange,提问作者Maltretierer
相关产品推荐
相关产品推荐

