psycopg2.copy_expert - 只插入新数据
psycopg2.copy_expert - insert only new data
我正在使用 psycopg2.copy_expert 将数据从 CSV 复制到 PostgreSQL 数据库。我 运行 每天都这样,我只想插入新数据。如果数据已经存在,则无需执行任何操作。有没有办法利用 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)
您可以使用 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
.
的文件句柄一起使用
我正在使用 psycopg2.copy_expert 将数据从 CSV 复制到 PostgreSQL 数据库。我 运行 每天都这样,我只想插入新数据。如果数据已经存在,则无需执行任何操作。有没有办法利用 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)
您可以使用 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
.