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

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时自动添加引号,导致数据库函数无法被执行;同时新脚本丢失了原有的预检查逻辑,还错误地用数组符号包裹了函数表达式。

解决方案

  1. 用valueComputed替代value:这个字段专门用于指定数据库计算表达式,Liquibase会直接将表达式插入SQL语句,不会添加引号,确保函数能正常执行。
  2. 补回预检查逻辑:恢复旧脚本中的sqlCheck,保证只有当表中无数据时才执行插入操作。
  3. 移除多余数组符号:删掉函数前的-,避免将函数值包裹成数组。
  4. 修正空值写法:把空的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:15:28