如何修复PutDatabaseRecord处理器的upsert脚本语法错误
PostgreSQL ETL Upsert 字段引号问题修复方案
问题根因:PostgreSQL 对未使用双引号包裹的标识符默认自动转为全小写格式,你所用ETL工具自动生成upsert语句时,没有给驼峰命名的冲突字段加双引号,导致执行时无法识别对应字段,触发语法错误。可按以下优先级选择修复方案:
- 最小改动方案:直接修改冲突键配置
找到ETL组件中配置upsert冲突字段的输入项,将原本填写的cdConstrucao修改为"cdConstrucao",组件生成SQL时会保留带双引号的内容,最终生成的语句会符合ON CONFLICT ("cdConstrucao")的正确语法,不需要调整其他任务配置即可恢复运行。 - 长期最优方案:统一PostgreSQL端标识符命名规则
将目标表的字段名、主键、唯一约束全部改为小写蛇形命名(例如将cdConstrucao调整为cd_construcao),后续所有SQL语句无需额外加双引号即可正常识别字段,从根源上规避大小写敏感带来的语法问题,符合PostgreSQL的通用使用规范。 - 完全可控方案:使用自定义SQL替代组件自动生成逻辑
如果现有组件的配置项不支持输入带引号的字段名,可以将原生的表输出组件替换为SQL执行步骤,手动编写完整的upsert逻辑,示例如下:
按照数据流的字段顺序绑定对应参数即可,这种写法完全由自己控制SQL逻辑,不会出现组件自动生成语句不符合语法要求的问题。INSERT INTO 目标表名 (字段1, 字段2, "cdConstrucao") VALUES (?, ?, ?) ON CONFLICT ("cdConstrucao") DO UPDATE SET 字段1 = EXCLUDED.字段1, 字段2 = EXCLUDED.字段2;
注意:如果使用多字段作为唯一冲突键,所有大小写混合的字段名都需要按相同规则用双引号包裹,否则依然会触发字段不存在的语法错误。
内容的提问来源于stack exchange,提问作者Juliano Medeiros
相关产品推荐
相关产品推荐

