【问题标题】:How do I upsert all the rows from one table into another table using Postgres?如何使用 Postgres 将一个表中的所有行插入到另一个表中?
【发布时间】:2021-10-11 17:08:47
【问题描述】:

我正在使用 Python,使用 Pandas 从 TSV 中提取数据,将其转换为数据帧,然后使用 df.to_sql 将该数据帧同步到 postgres 中的临时表。这个过程效果很好。

但是,一旦该表存在,我想将该表中的所有行移动到永久表中。这两个表将始终相同。永久表有一个唯一索引,所以如果 id 已经存在,它应该更新行。

这是我尝试将所有行从一个表插入到另一个表:

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

不幸的是,当我运行它时,我得到了这个错误:

psycopg2.errors.UndefinedColumn: column excluded.field_a does not exist
LINE 10:           Field_A = excluded.Field_A,
                             ^
HINT:  Perhaps you meant to reference the column "excluded.Field_A".

但事实上,那一栏确实存在。我在这里想念什么?我尝试从集合中删除 Field_A,然后我得到与 Field_B 相同的错误。

【问题讨论】:

  • 错误信息与显示的查询不匹配。请显示您实际执行的语句。声明你的 Postgres 版本。并显示确切的表定义:CREATE TABLE my_table ...
  • 啊,对不起,我现在已经编辑过了。我掩盖了名字只是为了让它更简单,但错过了这两个裁判。感谢您指出@ErwinBrandstetter

标签: python sql pandas postgresql


【解决方案1】:

在这里回答我自己的问题 - 问题是 Postgres 忽略大写,除非它被引用。

这在我发布的示例中并不清楚,因为我混淆了我正在使用的字段的命名。我现在已经更新了它们以显示问题。

为了解决这个问题,您需要将字段名称用双引号括起来。例如。 "Field_A" = excluded."Field_A"

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2023-01-11
    • 2010-10-09
    • 2015-03-21
    • 2021-11-17
    • 2020-04-22
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多