用于 INSERT 或 UPDATE(不仅仅是 INSERT)的 Python PostgreSQL COPY 命令

标签 python postgresql

我正在尝试使用 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/

相关文章:

java - 在 Spring Boot 上使用正确的方言 PostgreSQL

sql - 如何优化此全文搜索查询? (tsvector)(150 万行)

python - Datastax Spark Cassandra 连接器模块导入错误

python - 使用 seaborn 在 x y 散点图中添加标签

python - 使用 pytest 时出现 “indirect fixture” 错误。怎么了?

django - 无法将aws RDS连接到django本地

python - 在 'if' 语句中设置多行条件的样式?

python - Paramiko 在异常后不返回提示(Python 3)

php - 没有数据的数据库的PostgreSql复制结构

PostgreSQL - 空表