【问题标题】:psycopg2.copy_expert - insert only new datapsycopg2.copy_expert - 只插入新数据
【发布时间】:2020-07-01 21:38:21
【问题描述】:

我正在使用 psycopg2.copy_expert 将数据从 CSV 复制到 PostgreSQL DB。我每天都运行它,我只想插入新数据。如果数据已经存在,则不必执行任何操作。有没有办法利用 copy_expert 函数开箱即用地执行此操作,还是我自己编写他的逻辑并创建一个仅包含增量更改的新 CSV 文件?

copy_sql = """
           COPY %s FROM stdin WITH CSV HEADER
           DELIMITER as ','
           """
f = open(f"{file_path}", 'r', encoding="utf-8")
cur.copy_expert(sql=copy_sql % table_name, file=f)

【问题讨论】:

  • copy 不处理增量,它只是一个直接的追加。听起来你想要upsert,你必须自己编码。似乎是一个很好的学习机会 =)

标签: python postgresql psycopg2 postgresql-9.1


【解决方案1】:

您可以使用temporary table 加上ON CONFLICT 来实现:

CREATE TEMPORARY TABLE buffer (
    field1,
    field2,
    ...
    fieldn
);

COPY buffer FROM STDIN With CSV HEADER DELIMITER as ',';

INSERT INTO table(field1, field2, ... fieldn)
SELECT field1, field2, ... fieldn FROM buffer
ON CONFLICT (ID) DO NOTHING;

DROP TABLE buffer;

您应该能够将上面的query 与copy_expert 的文件句柄一起使用。

【讨论】:

  • 嗨,不要使用“ON CONFLICT (ID) DO NOTHING;”我们如何检查列的值是否已更改以及是否没有执行任何操作?谢谢
  • 不知道只用ON CONFLICT能不能做到这一点;也许您可以使用ON CONFLICT(id) DO UPDATE 并为before_update 定义一个触发器,以检查值是否更改。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多