Postgres将临时表数据upsert到正式表时excluded字段报错如何解决
这是PostgreSQL标识符大小写规则导致的问题:
- PostgreSQL默认会把所有未被双引号包裹的标识符自动转换为小写处理。只有创建字段时用双引号包裹保留了大写的字段,后续引用时也必须用双引号包裹才能正确匹配。
- 你写的
excluded.Field_A没有加双引号,PostgreSQL会自动解析为excluded.field_a,和你实际存在的大写字段名不匹配,因此报字段不存在的错误,提示里也明确建议你引用"excluded.Field_A"。
方案1:直接修改SQL语句
给excluded后的字段名加上双引号即可正常执行,修改后语句如下:
WITH moved_rows AS ( DELETE FROM my_table_tmp a RETURNING a.* ) INSERT INTO my_table SELECT * FROM moved_rows ON CONFLICT ("unique_id") DO UPDATE SET "Field_A" = excluded."Field_A", "Field_B" = excluded."Field_B", "Field_C" = excluded."Field_C"
方案2(推荐长期使用):统一字段名为小写
调用df.to_sql写入临时表前,先把DataFrame的列名全部转为小写,永久表也同步修改为小写字段名,后续写SQL时不需要额外处理双引号,可避免同类大小写问题。
内容的提问来源于stack exchange,提问作者Matt Bloomfield
相关产品推荐
相关产品推荐

