我正在尝试使用 COPY通过 Python 将文件中的数据插入 PGSQL 的命令。当目标表为空或者我提前确保不会发生唯一键冲突时,这种方法非常有效:
cmd = ("COPY %s (%s) FROM STDIN WITH (FORMAT CSV, NULL '_|NULL|_')" %
(tableName, colStr))
cursor.copy_expert(cmd, io)
不过,我更希望能够在不先清空表的情况下执行此 COPY 命令。有什么方法可以使用 SQL COPY 执行“INSERT 或 UPDATE”类型的操作吗?
最佳答案
不是直接通过复制命令。
然而,您可以做的是创建一个临时表,使用复制命令填充该表,然后从中进行插入和更新。
-- Clone table stucture of target table
create temporary table __copy as (select * from my_schema.my_table limit 0);
-- Copy command goes here...
-- Update existing records
update
my_schema.my_table
set
column_2 = __copy.column_2
from
__copy
where
my_table.column_1 = __copy.column_1;
-- Insert new records
insert into my_schema.my_table (
column_1,
column_2
) (
select
column_1,
column_2
from
__copy
left join my_schema.my_table using(column_1)
where
my_table is null
);
您可以考虑在用数据填充 __copy 后创建索引以加快更新查询速度。
关于用于 INSERT 或 UPDATE(不仅仅是 INSERT)的 Python PostgreSQL COPY 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46934351/