我有一堆值对 [(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/