python - 带有可变 WHERE 子句的批量更新表

标签 python sql postgresql sql-update

我有一堆值对 [(foo1, bar1), (foo2, bar2), ...] 我想做一堆更新“set the 'foo '列到'foo1',其中'bar'列是'bar1'”。

我在 Python 中使用 psycopg2 执行此操作。我可以使用查询 UPDATE table SET foo = %s WHERE bar = %s 执行 executemany,但这是很多小的更新,会花很长时间。

我怎样才能轻松快速地做到这一点?也许有临时表?

Postgres 版本 9.3。

最佳答案

UPDATE tbl t 
SET    foo = v.foo
FROM  (
   VALUES ('foo1'::text, 'bar1'::text), ('foo2', 'bar2'), ...
   ) v(foo, bar)
WHERE t.bar = v.bar;

仅在值表达式的第一行需要显式类型转换。示例中的 text - 可以是任何内容。后续行中的字符串文字被强制转换为相同的类型。

根据您拥有键值对的形式,其他方法可能更方便。比如:创建一个临时表,COPY 到它,然后像使用任何其他表一样在 UPDATE 中使用临时表。详情:

或者您可以传递两个简单的数组并并行取消嵌套(Postgres 9.3 的语法):

UPDATE tbl t 
SET    foo = v.foo
FROM  (
   SELECT unnest('{foo1,foo2,...}'::text[]) AS foo
        , unnest('{bar1,bar2,...}'::text[]) AS bar
   ) v(foo, bar)
WHERE t.bar = v.bar;

Postgres 9.4 有更好的方法:

关于python - 带有可变 WHERE 子句的批量更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30204102/

相关文章:

sql - TSQL: "IN"子句中的 NULL

mysql - 这个sql查询有什么问题?

c# - Npgsql for c# 如何访问表脚本、 View 、外键和主键并将它们编写出来

sql - 如何查询最后 3 次出现的所有行的平均数据

python - 使用 pandas 数据框的一些逻辑创建新列

没有转换说明符的 Python 不会在 % 上引发异常

PHP - 基本选择查询只返回 mysql 数据库的第一行

sql - 我怎样才能做一个不同的总和?

python - 如何在不启动 Jupyter Notebook 服务器的情况下使用 .ipynb 文件?

python - Pyspark 数据帧 : Creating a features column to be used in the clustering in python