Liquibase YAML脚本转换后UUID生成函数失效问题求助
解决Liquibase新格式中PostgreSQL UUID生成函数被识别为字符串的问题
问题背景
将Liquibase脚本从原生SQL插入格式改为结构化insert语法后,PostgreSQL的uuid_in(md5(random()::text || clock_timestamp()::text)::cstring) UUID生成函数被当作普通字符串处理,无法正确生成UUID值。
问题原因
Liquibase的insert语法里,value字段默认会把内容当作静态字符串,写入SQL时自动添加引号,导致数据库函数无法被执行;同时新脚本丢失了原有的预检查逻辑,还错误地用数组符号包裹了函数表达式。
解决方案
- 用
valueComputed替代value:这个字段专门用于指定数据库计算表达式,Liquibase会直接将表达式插入SQL语句,不会添加引号,确保函数能正常执行。 - 补回预检查逻辑:恢复旧脚本中的
sqlCheck,保证只有当表中无数据时才执行插入操作。 - 移除多余数组符号:删掉函数前的
-,避免将函数值包裹成数组。 - 修正空值写法:把空的
value:改为value: "",避免YAML语法歧义。
修改后的完整脚本
changeSet: id: fulfillment-seed-data-1 author: sas preConditions: - dbms: type: PostgreSQL - onFail: MARK_RAN - sqlCheck: expectedResult: 0 sql: select count(*) from ${schema}.global_setting; changes: - insert: columns: - column: name: global_setting_id valueComputed: uuid_in(md5(random()::text || clock_timestamp()::text)::cstring) - column: name: spec_nm value: PROD_DIMENSION_TYPE_ID - column: name: app_nm value: FULFILLMENT - column: name: spec_value_txt value: "" - column: name: spec_desc value: "" tableName: ${schema}.global_setting
关键修改说明
global_setting_id列改用valueComputed,让Liquibase直接将UUID生成函数作为SQL表达式执行,不再当作字符串处理。- 恢复
sqlCheck预检查,和旧脚本逻辑保持一致,避免重复插入数据。 - 给
tableName加上${schema}.前缀,适配多schema场景。 - 空值统一写成
value: "",避免YAML解析时出现异常。
内容的提问来源于stack exchange,提问作者Gaurav Khubchandani
相关产品推荐
相关产品推荐

