从 python 数据框批量更新 Postgres 列

Bulk update Postgres column from python dataframe

我正在使用下面的 python 代码更新基于 Id 的 postgres 数据库列 value。对于数千条记录,此循环必须 运行,并且需要更长的时间。

有没有一种方法可以传递数据帧值数组而不是循环每一行?

 for i in range(0,len(df)):
        QUERY=""" UPDATE "Table" SET "value"='%s' WHERE "Table"."id"='%s'
            """ % (df['value'][i], df['id'][i])
        cur.execute(QUERY)
        conn.commit()

取决于您用来与 PostgreSQL 通信的库,但通常通过 COPY FROM 命令进行批量插入要快得多。

如果你使用 psycopg2,它就像下面这样简单:

cursor.copy_from(io.StringIO(string_variable), "destination_table", columns=('id', 'value'))

其中 string_variable 是制表符和新行分隔的数据集,如 1\tvalue1\n2\tvalue2\n.

为了实现高效的批量更新,我会这样做:

  1. 创建临时 table: CREATE TEMPORARY TABLE tmp_table;;

  2. 插入记录 copy_from;

  3. 只需使用查询 UPDATE destination_table SET value = t.value FROM tmp_table t WHERE id = t.id 或任何 other preferred syntax

  4. 更新目标 table